웹사이트 검색

Spring JdbcTemplate 예제


Spring JdbcTemplate은 Spring JDBC 패키지에서 가장 중요한 클래스이다.

스프링 Jdbc 템플릿

  • JDBC는 데이터베이스에 대한 연결 열기/닫기, SQL 예외 처리 등과 같은 많은 상용구 코드를 생성합니다. 코드를 매우 번거롭고 읽기 어렵게 만듭니다.
  • Spring Framework에서 JDBC를 구현하면 많은 하위 수준 작업(연결 열기/닫기, SQL 쿼리 실행 등) 작업을 처리합니다.
  • 덕분에 Spring Framework에서 데이터베이스로 작업할 때 데이터베이스에서 연결 매개변수를 정의하고 SQL 쿼리를 등록하기만 하면 나머지 작업은 Spring에서 수행됩니다.
  • Spring의 JDBC에는 데이터베이스와 상호 작용하기 위한 여러 클래스(여러 접근 방식)가 있습니다. 가장 일반적인 것은 JdbcTemplate 클래스를 사용하는 것입니다. 모든 이벤트 및 데이터베이스 연결 처리를 관리하는 기본 클래스입니다.
  • JdbcTemplate 클래스는 SQL 쿼리를 실행하고, ResultSet를 반복하고, 호출된 값을 검색하고, 지침 및 프로시저 호출을 업데이트하고, 예외를 "잡아\ 다음에 정의된 예외로 변환합니다. org.springframework.dao 패키지.
  • JdbcTemplate 클래스의 인스턴스는 스레드로부터 안전합니다. 이는 JdbcTemplate 클래스의 단일 인스턴스를 구성하여 여러 DAO 개체에 사용할 수 있음을 의미합니다.
  • JdbcTemplate을 사용할 때 대부분 Spring 구성 파일에 구성됩니다. 이후 DAO 클래스의 bean을 이용하여 구현한다.

Spring JdbcTemplate 예제

Spring JdbcTemplate 예제 프로그램을 살펴보자. 여기서는 PostgreSQL 데이터베이스를 사용하고 있지만 MySQL 및 Oracle과 같은 다른 관계형 데이터베이스도 사용할 수 있습니다. 데이터베이스 구성을 변경하기만 하면 작동합니다. 우선 작업할 샘플 데이터가 필요합니다. 아래의 SQL 쿼리는 테이블을 생성하고 사용할 일부 데이터로 채웁니다.

create table people (
id serial not null primary key,
first_name varchar(20) not null,
last_name varchar(20) not null,
age integer not null
);

insert into people (id, first_name, last_name, age) values
(1, 'Vlad', 'Boyarskiy', 21),
(2,'Oksi', ' Bahatskaya', 30),
(3,'Vadim', ' Vadimich', 32);

Spring JDBC Maven 종속성

spring-core, spring-context, spring-jdbcpostgresql 종속성이 필요합니다. MySQL과 같은 다른 관계형 데이터베이스를 사용하는 경우 해당 Java 드라이버 종속성을 추가합니다. 다음은 최종 pom.xml 파일입니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.journaldev.spring</groupId>
	<artifactId>JdbcTemplate</artifactId>
	<version>1.0-SNAPSHOT</version>
	<properties>
		<spring.framework>4.3.0.RELEASE</spring.framework>
		<postgres.version>42.1.4</postgres.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<version>${postgres.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.framework}</version>
		</dependency>
	</dependencies>

</project>

스프링 데이터소스 구성

다음 단계는 DataSource 빈을 정의하기 위한 스프링 구성 클래스를 생성하는 것입니다. 저는 자바 기반 구성을 사용하고 있습니다. 스프링 빈 구성 xml 파일을 사용하여 이 작업을 수행할 수도 있습니다.

package com.journaldev.spring.config;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
@ComponentScan("com.journaldev.spring")
@PropertySource("classpath:database.properties")
public class AppConfig {

	@Autowired
	Environment environment;

	private final String URL = "url";
	private final String USER = "dbuser";
	private final String DRIVER = "driver";
	private final String PASSWORD = "dbpassword";

	@Bean
	DataSource dataSource() {
		DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
		driverManagerDataSource.setUrl(environment.getProperty(URL));
		driverManagerDataSource.setUsername(environment.getProperty(USER));
		driverManagerDataSource.setPassword(environment.getProperty(PASSWORD));
		driverManagerDataSource.setDriverClassName(environment.getProperty(DRIVER));
		return driverManagerDataSource;
	}
}

  • @Configuration – 이 클래스가 Spring 컨텍스트에 대한 구성임을 나타냅니다.
  • @ComponentScan("com.journaldev.spring”)- 구성 요소 클래스를 검색할 패키지를 지정합니다.
  • @PropertySource("classpath:database.properties”)- database.properties 파일에서 속성을 읽을 것이라고 말합니다.

database.properties 파일의 내용은 아래와 같습니다.

driver=org.postgresql.Driver
url=jdbc:postgresql://127.0.0.1:5432/school
dbuser=postgres
dbpassword=postgres

MySQL 또는 다른 관계형 데이터베이스를 사용하는 경우 위의 구성을 적절하게 변경하십시오.

Spring JDBC 모델 클래스

다음 단계는 데이터베이스 테이블을 매핑할 모델 클래스를 만드는 것입니다.

package com.journaldev.model;

public class Person {
	private Long id;
	private Integer age;
	private String firstName;
	private String lastName;

	public Person() {
	}

	public Person(Long id, Integer age, String firstName, String lastName) {
		this.id = id;
		this.age = age;
		this.firstName = firstName;
		this.lastName = lastName;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	@Override
	public String toString() {
		return "Person{" + "id=" + id + ", age=" + age + ", firstName='" + firstName + '\'' + ", lastName='" + lastName
				+ '\'' + '}';
	}
}

데이터베이스에서 데이터를 가져오려면 RowMapper 인터페이스를 구현해야 합니다. 이 인터페이스에는 mapRow(ResultSet resultSet, int i) 메서드가 하나만 있으며 모델 클래스(예: Person)의 인스턴스를 하나만 반환합니다.

package com.journaldev.model;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

public class PersonMapper implements RowMapper<Person> {

	public Person mapRow(ResultSet resultSet, int i) throws SQLException {

		Person person = new Person();
		person.setId(resultSet.getLong("id"));
		person.setFirstName(resultSet.getString("first_name"));
		person.setLastName(resultSet.getString("last_name"));
		person.setAge(resultSet.getInt("age"));
		return person;
	}
}

스프링 JDBC DAO 클래스

마지막 단계는 DAO 클래스를 생성하여 SQL 쿼리를 사용하여 모델 클래스를 데이터베이스 테이블에 매핑하는 것입니다. 또한 @Autowired 주석을 사용하여 DataSource를 구성하고 일부 API를 노출합니다.

package com.journaldev.spring.dao;

import java.util.List;

import com.journaldev.model.Person;

public interface PersonDAO {
	Person getPersonById(Long id);

	List<Person> getAllPersons();

	boolean deletePerson(Person person);

	boolean updatePerson(Person person);

	boolean createPerson(Person person);
}
package com.journaldev.spring.dao;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import com.journaldev.model.Person;
import com.journaldev.model.PersonMapper;

@Component
public class PersonDAOImpl implements PersonDAO {

	JdbcTemplate jdbcTemplate;

	private final String SQL_FIND_PERSON = "select * from people where id = ?";
	private final String SQL_DELETE_PERSON = "delete from people where id = ?";
	private final String SQL_UPDATE_PERSON = "update people set first_name = ?, last_name = ?, age  = ? where id = ?";
	private final String SQL_GET_ALL = "select * from people";
	private final String SQL_INSERT_PERSON = "insert into people(id, first_name, last_name, age) values(?,?,?,?)";

	@Autowired
	public PersonDAOImpl(DataSource dataSource) {
		jdbcTemplate = new JdbcTemplate(dataSource);
	}

	public Person getPersonById(Long id) {
		return jdbcTemplate.queryForObject(SQL_FIND_PERSON, new Object[] { id }, new PersonMapper());
	}

	public List<Person> getAllPersons() {
		return jdbcTemplate.query(SQL_GET_ALL, new PersonMapper());
	}

	public boolean deletePerson(Person person) {
		return jdbcTemplate.update(SQL_DELETE_PERSON, person.getId()) > 0;
	}

	public boolean updatePerson(Person person) {
		return jdbcTemplate.update(SQL_UPDATE_PERSON, person.getFirstName(), person.getLastName(), person.getAge(),
				person.getId()) > 0;
	}

	public boolean createPerson(Person person) {
		return jdbcTemplate.update(SQL_INSERT_PERSON, person.getId(), person.getFirstName(), person.getLastName(),
				person.getAge()) > 0;
	}
}

PersonDAOImpl 클래스에는 @Component 주석이 달려 있으며 이 클래스에는 JdbcTemplate 유형의 필드가 있습니다. 이 클래스의 생성자가 호출되면 DataSource의 인스턴스가 주입되고 JdbcTemplate의 인스턴스를 생성할 수 있습니다. 그 후에 우리는 우리의 방법에서 사용할 수 있습니다.

Spring JdbcTemplate 테스트 프로그램

Spring JdbcTemplate 예제 프로젝트가 준비되었습니다. 테스트 클래스로 테스트해 보겠습니다.

package com.journaldev;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.journaldev.model.Person;
import com.journaldev.spring.config.AppConfig;
import com.journaldev.spring.dao.PersonDAO;

public class Main {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

		PersonDAO personDAO = context.getBean(PersonDAO.class);

		System.out.println("List of person is:");

		for (Person p : personDAO.getAllPersons()) {
			System.out.println(p);
		}

		System.out.println("\nGet person with ID 2");

		Person personById = personDAO.getPersonById(2L);
		System.out.println(personById);

		System.out.println("\nCreating person: ");
		Person person = new Person(4L, 36, "Sergey", "Emets");
		System.out.println(person);
		personDAO.createPerson(person);
		System.out.println("\nList of person is:");

		for (Person p : personDAO.getAllPersons()) {
			System.out.println(p);
		}

		System.out.println("\nDeleting person with ID 2");
		personDAO.deletePerson(personById);

		System.out.println("\nUpdate person with ID 4");

		Person pperson = personDAO.getPersonById(4L);
		pperson.setLastName("CHANGED");
		personDAO.updatePerson(pperson);

		System.out.println("\nList of person is:");
		for (Person p : personDAO.getAllPersons()) {
			System.out.println(p);
		}

		context.close();
	}
}

Spring JdbcTemplate 예제 프로젝트 다운로드

참조: API 문서