Поиск по сайту:

Пример Spring JdbcTemplate


Spring JdbcTemplate — самый важный класс в пакете Spring JDBC.

Spring JdbcШаблон

  • JDBC создает много шаблонного кода, например открытие/закрытие соединения с базой данных, обработка исключений sql и т. д. Это делает код чрезвычайно громоздким и трудным для чтения.
  • Реализация JDBC в Spring Framework обеспечивает работу со многими низкоуровневыми операциями (открытие/закрытие соединений, выполнение запросов SQL и т. д.).
  • Благодаря этому при работе с базой данных в Spring Framework нам нужно только определить параметры соединения с базой данных и прописать SQL-запрос, остальную работу за нас выполняет Spring.
  • JDBC в Spring имеет несколько классов (несколько подходов) для взаимодействия с базой данных. Наиболее распространенным из них является использование класса JdbcTemplate. Это базовый класс, который управляет обработкой всех событий и подключений к базе данных.
  • Класс JdbcTemplate выполняет SQL-запросы, перебирает ResultSet и извлекает вызываемые значения, обновляет инструкции и вызовы процедур, «отлавливает» исключения и преобразует их в исключения, определенные в пакет org.springframework.dao.
  • Экземпляры класса JdbcTemplate являются потокобезопасными. Это означает, что, настроив один экземпляр класса JdbcTemplate, мы сможем использовать его для нескольких объектов DAO.
  • При использовании JdbcTemplate чаще всего он настраивается в файле конфигурации Spring. После этого он реализуется с помощью bean-компонента в классах DAO.

Пример 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);

Весенние зависимости JDBC Maven

Нам нужны следующие зависимости — spring-core, spring-context, spring-jdbc и postgresql. Если вы используете любую другую реляционную базу данных, такую как 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>

Spring Конфигурация источника данных

Следующим шагом является создание класса конфигурации Spring для определения bean-компонента DataSource. Я использую конфигурацию на основе Java, вы также можете сделать это с помощью XML-файла конфигурации Spring Bean.

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. Мы также настроим DataSource с помощью аннотации @Autowired и предоставим некоторые 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. После этого мы можем использовать in в наших методах.

Программа тестирования 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