Exemplo do Spring JdbcTemplate

O Spring JdbcTemplate é a classe mais importante no pacote Spring JDBC.

Spring JdbcTemplate

  • O JDBC produz uma quantidade significativa de código redundante, como abrir/fechar uma conexão com um banco de dados, lidar com exceções SQL, etc. Isso torna o código extremamente complicado e difícil de ler.
  • A implementação do JDBC no Spring Framework cuida de trabalhar com muitas operações de baixo nível (abrir/fechar conexões, executar consultas SQL, etc.).
  • Graças a isso, ao trabalhar com o banco de dados no Spring Framework, só precisamos definir os parâmetros de conexão do banco de dados e registrar a consulta SQL, o restante do trabalho é realizado pelo Spring.
  • O JDBC no Spring possui várias classes (vários enfoques) para interagir com o banco de dados. O mais comum deles é usar a classe JdbcTemplate. Esta é a classe base que gerencia o processamento de todos os eventos e conexões com o banco de dados.
  • A classe JdbcTemplate executa consultas SQL, itera sobre o ResultSet e recupera os valores chamados, atualiza as instruções e chamadas de procedimento, “captura” as exceções e as traduz para as exceções definidas no pacote org.springframwork.dao.
  • Instâncias da classe JdbcTemplate são seguras para threads. Isso significa que, ao configurar uma única instância da classe JdbcTemplate, podemos utilizá-la para vários objetos DAO.
  • Ao usar o JdbcTemplate, na maioria das vezes, ele é configurado no arquivo de configuração do Spring. Depois disso, é implementado usando o bean em classes DAO.

Exemplo de Spring JdbcTemplate

Vamos dar uma olhada em um programa de exemplo usando o Spring JdbcTemplate. Estou usando o banco de dados Postgresql aqui, mas você pode usar qualquer outro banco de dados relacional, como MySQL e Oracle. Tudo que você precisa fazer é alterar as configurações do banco de dados e deverá funcionar. Primeiramente, precisamos de alguns dados de exemplo para trabalhar. As consultas SQL abaixo criarão uma tabela e a preencherão com alguns dados para usarmos.

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);

A imagem abaixo mostra a estrutura final do projeto no Eclipse.

Dependências do Maven para o Spring JDBC

Precisamos das seguintes dependências – `spring-core`, `spring-context`, `spring-jdbc` e `postgresql`. Se estiver usando algum outro banco de dados relacional, como MySQL, adicione as dependências correspondentes do driver Java. Aqui está o nosso arquivo `pom.xml` final.

<?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>

Configuração do DataSource do Spring

O próximo passo é criar uma classe de configuração do Spring para definir o bean `DataSource`. Estou usando configuração baseada em Java, você também pode fazer isso usando um arquivo de configuração XML de bean do Spring.

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 – indica que esta classe é uma configuração para o contexto do Spring.
  • @ComponentScan(“com.journaldev.spring”) – especifica o pacote a ser escaneado para classes de componente.
  • @PropertySource(“classpath:database.properties”) – indica que as propriedades serão lidas do arquivo `database.properties`.

O conteúdo do arquivo `database.properties` é mostrado abaixo.

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

Se estiver usando MySQL ou algum outro banco de dados relacional, altere as configurações acima conforme necessário.

Classes de Modelo do Spring JDBC

A próxima etapa é criar classes de modelo para mapear nossa tabela de banco de dados.

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
				+ '\'' + '}';
	}
}

Para buscar dados do banco de dados, precisamos implementar a interface RowMapper. Esta interface tem apenas um método mapRow(ResultSet resultSet, int i), que retornará uma instância de nossa classe de modelo (ou seja, Pessoa).

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;
	}
}

Classes DAO do Spring JDBC

A etapa final é criar classes DAO para mapear nossa classe de modelo para a tabela de banco de dados usando consultas SQL. Também configuraremos o DataSource usando a anotação @Autowired e exporemos algumas APIs.

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;
	}
}

A classe PersonDAOImpl é anotada com a anotação @Component e nesta classe temos um campo do tipo JdbcTemplate. Quando o construtor desta classe for invocado, uma instância de DataSource será injetada nela e poderemos criar uma instância de JdbcTemplate. Depois disso, podemos usá-lo em nossos métodos.

Programa de Teste do Spring JdbcTemplate

Nosso projeto de exemplo do Spring JdbcTemplate está pronto, vamos testá-lo com uma classe de teste.

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();
	}
}

A imagem abaixo mostra a saída produzida ao executarmos o programa acima. A saída variará com base nos dados de exemplo e em execuções múltiplas, a ideia é aprender aqui como usar o Spring JdbcTemplate por meio do programa de exemplo. Isso é tudo sobre o Spring JdbcTemplate, você pode baixar o projeto final a partir do link abaixo.

Download do Projeto de Exemplo do Spring JdbcTemplate

Referência: Documentação da API

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