Пример использования Spring JdbcTemplate

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

Spring JdbcTemplate

  • JDBC генерирует много шаблонного кода, такого как открытие/закрытие соединения с базой данных, обработка исключений SQL и так далее. Этот код делает программу чрезмерно громоздкой и трудной для восприятия.
  • Использование JDBC в Spring Framework позволяет обращаться с множеством низкоуровневых операций (открытие/закрытие соединений, выполнение SQL-запросов и так далее).
  • Благодаря этому, при работе с базой данных в Spring Framework нам нужно только определить параметры соединения с базой данных и зарегистрировать SQL-запрос, остальную работу выполняет Spring.
  • JDBC в Spring имеет несколько классов (подходов) для взаимодействия с базой данных. Самый распространенный из них – использование класса JdbcTemplate. Это базовый класс, управляющий обработкой всех событий и соединений с базой данных.
  • Класс JdbcTemplate выполняет SQL-запросы, итерируется по ResultSet, извлекает вызванные значения, обновляет инструкции и вызовы процедур, “перехватывает” исключения и преобразует их в исключения, определенные в пакете org.springframework.dao.
  • Экземпляры класса JdbcTemplate являются потокобезопасными. Это означает, что, настроив один экземпляр класса JdbcTemplate, мы можем использовать его для нескольких объектов DAO.
  • При использовании JdbcTemplate он чаще всего настраивается в файле конфигурации Spring. После этого он реализуется с использованием бина в классах 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);

На изображении ниже показана конечная структура проекта в Eclipse.

Зависимости Maven для Spring JDBC

Нам нужны следующие зависимости – `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 для определения бина `DataSource`. Я использую конфигурацию на основе Java, вы также можете сделать это, используя файл конфигурации бинов Spring 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;
	}
}

Классы DAO Spring JDBC

Последним шагом является создание классов DAO для отображения нашего класса модели на таблицу базы данных с использованием SQL-запросов. Мы также настроим источник данных, используя аннотацию @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. После этого мы можем использовать его в наших методах.

Программа тестирования 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 на примере программы. Вот и всё, что касается Spring JdbcTemplate. Вы можете скачать финальный проект по следующей ссылке.

Скачать пример проекта Spring JdbcTemplate

Ссылка: Документация API

Source:
https://www.digitalocean.com/community/tutorials/spring-jdbctemplate-example