Exemples d'interrogation de Spring JdbcTemplate
Voici quelques exemples pour vous montrer comment utiliser SpringJdbcTemplate
pour interroger ou extraire des données de la base de données.
Technologies utilisées:
-
Spring Boot 2.1.2.RELEASE
-
Spring JDBC 5.1.4.RELEASE
-
Maven 3
-
Java 8
En bref:
-
jdbcTemplate.queryForObject
pour une seule ligne ou valeur -
jdbcTemplate.query
pour plusieurs lignes ou liste
Note
L'article est mis à jour de Spring core 2.5.x vers Spring Boot 2.1.x
P.S You may also interested in this Spring Boot JDBC Examples
1. Requête pour une seule ligne
Au printemps, nous pouvons utiliserjdbcTemplate.queryForObject()
pour interroger un enregistrement de ligne unique de la base de données et convertir la ligne en objet via le mappeur de lignes.
1.1 Custom RowMapper
CustomerRowMapper.java
import org.springframework.jdbc.core.RowMapper; import java.sql.ResultSet; import java.sql.SQLException; public class CustomerRowMapper implements RowMapper{ @Override public Customer mapRow(ResultSet rs, int rowNum) throws SQLException { Customer customer = new Customer(); customer.setID(rs.getLong("ID")); customer.setName(rs.getString("NAME")); customer.setAge(rs.getInt("AGE")); customer.setCreatedDate(rs.getTimestamp("created_date").toLocalDateTime()); return customer; } }
import org.springframework.jdbc.core.JdbcTemplate; @Autowired private JdbcTemplate jdbcTemplate; public Customer findByCustomerId(Long id) { String sql = "SELECT * FROM CUSTOMER WHERE ID = ?"; return jdbcTemplate.queryForObject(sql, new Object[]{id}, new CustomerRowMapper()); }
1.2 Spring BeanPropertyRowMapper
, this class saves you a lot of time for the mapping.
import org.springframework.jdbc.core.BeanPropertyRowMapper; public Customer findByCustomerId2(Long id) { String sql = "SELECT * FROM CUSTOMER WHERE ID = ?"; return (Customer) jdbcTemplate.queryForObject( sql, new Object[]{id}, new BeanPropertyRowMapper(Customer.class)); }
1.3 In Java 8, we can map it directly:
public Customer findByCustomerId3(Long id) { String sql = "SELECT * FROM CUSTOMER WHERE ID = ?"; return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> new Customer( rs.getLong("id"), rs.getString("name"), rs.getInt("age"), rs.getTimestamp("created_date").toLocalDateTime() )); }
2. Requête pour plusieurs lignes
Pour plusieurs lignes, nous utilisonsjdbcTemplate.query()
2.1 Custom RowMapper
public ListfindAll() { String sql = "SELECT * FROM CUSTOMER"; List customers = jdbcTemplate.query( sql, new CustomerRowMapper()); return customers; }
2.2 BeanPropertyRowMapper
public ListfindAll() { String sql = "SELECT * FROM CUSTOMER"; List customers = jdbcTemplate.query( sql, new BeanPropertyRowMapper(Customer.class)); return customers; }
2.3 Java 8
public ListfindAll() { String sql = "SELECT * FROM CUSTOMER"; return jdbcTemplate.query( sql, (rs, rowNum) -> new Customer( rs.getLong("id"), rs.getString("name"), rs.getInt("age"), rs.getTimestamp("created_date").toLocalDateTime() ) ); }
2.4 jdbcTemplate.queryForList
, it works, but not recommend, the mapping in Map
may not same as the object, need casting.
public ListfindAll() { String sql = "SELECT * FROM CUSTOMER"; List customers = new ArrayList<>(); List
3. Requête pour une valeur unique
C'est la même chose que d'interroger une seule ligne de la base de données, utilisejdbcTemplate.queryForObject()
3.1 Single column name
public String findCustomerNameById(Long id) { String sql = "SELECT NAME FROM CUSTOMER WHERE ID = ?"; return jdbcTemplate.queryForObject( sql, new Object[]{id}, String.class); }
3.2 Count
public int count() { String sql = "SELECT COUNT(*) FROM CUSTOMER"; // queryForInt() is Deprecated // https://www.example.com/spring/jdbctemplate-queryforint-is-deprecated/ //int total = jdbcTemplate.queryForInt(sql); return jdbcTemplate.queryForObject(sql, Integer.class); }
4. Test
Exécutez une application Spring BootCommandLineRunner
, créez des tables et testez les API.
pom.xml
org.springframework.boot spring-boot-starter-jdbc com.h2database h2
StartApplication.java
package com.example; import com.example.customer.Customer; import com.example.customer.CustomerRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.jdbc.core.JdbcTemplate; import java.math.BigDecimal; import java.util.Arrays; import java.util.List; @SpringBootApplication public class StartApplication implements CommandLineRunner { private static final Logger log = LoggerFactory.getLogger(StartApplication.class); @Autowired JdbcTemplate jdbcTemplate; @Autowired CustomerRepository customerRepository; public static void main(String[] args) { SpringApplication.run(StartApplication.class, args); } @Override public void run(String... args) { log.info("StartApplication..."); startCustomerApp(); } // Tested with H2 database void startCustomerApp() { jdbcTemplate.execute("DROP TABLE customer IF EXISTS"); jdbcTemplate.execute("CREATE TABLE customer(" + "id SERIAL, name VARCHAR(255), age NUMERIC(2), created_date timestamp)"); Listlist = Arrays.asList( new Customer("Customer A", 19), new Customer("Customer B", 20), new Customer("Customer C", 21), new Customer("Customer D", 22) ); list.forEach(x -> { log.info("Saving...{}", x.getName()); customerRepository.save(x); }); log.info("[FIND_BY_ID]"); log.info("{}", customerRepository.findByCustomerId(1L)); log.info("{}", customerRepository.findByCustomerId2(2L)); log.info("{}", customerRepository.findByCustomerId3(3L)); log.info("[FIND_ALL]"); log.info("{}", customerRepository.findAll()); log.info("{}", customerRepository.findAll2()); log.info("{}", customerRepository.findAll3()); log.info("{}", customerRepository.findAll4()); log.info("[FIND_NAME_BY_ID]"); log.info("{}", customerRepository.findCustomerNameById(4L)); log.info("[COUNT]"); log.info("{}", customerRepository.count()); } }
Sortie
INFO com.example.StartApplication - Saving...Customer A INFO com.example.StartApplication - Saving...Customer B INFO com.example.StartApplication - Saving...Customer C INFO com.example.StartApplication - Saving...Customer D INFO com.example.StartApplication - [FIND_BY_ID] INFO com.example.StartApplication - Customer{ID=1, name='Customer A', age=19, createdDate=2019-08-01T15:48:45.950848} INFO com.example.StartApplication - Customer{ID=2, name='Customer B', age=20, createdDate=2019-08-01T15:48:45.961819} INFO com.example.StartApplication - Customer{ID=3, name='Customer C', age=21, createdDate=2019-08-01T15:48:45.961819} INFO com.example.StartApplication - [FIND_ALL] INFO com.example.StartApplication - [ Customer{ID=1, name='Customer A', age=19, createdDate=2019-08-01T15:48:45.950848}, Customer{ID=2, name='Customer B', age=20, createdDate=2019-08-01T15:48:45.961819}, Customer{ID=3, name='Customer C', age=21, createdDate=2019-08-01T15:48:45.961819}, Customer{ID=4, name='Customer D', age=22, createdDate=2019-08-01T15:48:45.961819} ] //...omitted, duplicate code INFO com.example.StartApplication - [FIND_NAME_BY_ID] INFO com.example.StartApplication - Customer D INFO com.example.StartApplication - [COUNT] INFO com.example.StartApplication - 4
Télécharger le code source
$ git clone https://github.com/example/spring-boot.git
$ cd spring-jdbc
$ find com.example.customer