Вот несколько примеров, которые покажут вам, как использовать Spring JdbcTemplate
для запроса или извлечения данных из базы данных.
Используемые технологии:
- Пружинный ботинок 2.1.2. ВЫПУСК
- Весенний ВЫПУСК JDBC 5.1.4.
- Мавен 3
- Java 8
короче говоря:
jdbcтемплей.queryForObject
для одной строки или значенияjdbcтемплей.запрос
для нескольких строк или списка
P.S Вас также может заинтересовать это Примеры JDBC с пружинной загрузкой
1. Запрос для одной строки
Весной мы можем использовать JdbcTemplate.queryForObject()
для запроса записи одной строки из базы данных и преобразования строки в объект с помощью средства сопоставления строк.
1.1 Пользовательский сопоставитель строк
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 Пружина Упаковщик бобовых материалов
, этот класс экономит вам много времени на сопоставление.
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 В Java 8 мы можем отобразить его напрямую:
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. Запрос для нескольких строк
Для нескольких строк мы используем JdbcTemplate.запрос()
2.1 Пользовательский компоновщик строк
public ListfindAll() { String sql = "SELECT * FROM CUSTOMER"; List customers = jdbcTemplate.query( sql, new CustomerRowMapper()); return customers; }
2.2 Преобразователь свойств бобов
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 jdbcтемплей.Список запросов
, это работает, но не рекомендуется, отображение в Карта
может не совпадать с объектом, требуется приведение.
public ListfindAll() { String sql = "SELECT * FROM CUSTOMER"; List customers = new ArrayList<>(); List
3. Запрос для одного значения
Это то же самое, что запросить одну строку из базы данных, используя JdbcTemplate.Запрос к объекту()
3.1 Имя одного столбца
public String findCustomerNameById(Long id) { String sql = "SELECT NAME FROM CUSTOMER WHERE ID = ?"; return jdbcTemplate.queryForObject( sql, new Object[]{id}, String.class); }
3.2 Количество
public int count() { String sql = "SELECT COUNT(*) FROM CUSTOMER"; // queryForInt() is Deprecated // https://www.mkyong.com/spring/jdbctemplate-queryforint-is-deprecated/ //int total = jdbcTemplate.queryForInt(sql); return jdbcTemplate.queryForObject(sql, Integer.class); }
4. Тест
Запустите приложение Spring Boot CommandLineRunner
, создайте таблицы и протестируйте API.
org.springframework.boot spring-boot-starter-jdbc com.h2database h2
package com.mkyong; import com.mkyong.customer.Customer; import com.mkyong.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()); } }
Выход
INFO com.mkyong.StartApplication - Saving...Customer A INFO com.mkyong.StartApplication - Saving...Customer B INFO com.mkyong.StartApplication - Saving...Customer C INFO com.mkyong.StartApplication - Saving...Customer D INFO com.mkyong.StartApplication - [FIND_BY_ID] INFO com.mkyong.StartApplication - Customer{ID=1, name='Customer A', age=19, createdDate=2019-08-01T15:48:45.950848} INFO com.mkyong.StartApplication - Customer{ID=2, name='Customer B', age=20, createdDate=2019-08-01T15:48:45.961819} INFO com.mkyong.StartApplication - Customer{ID=3, name='Customer C', age=21, createdDate=2019-08-01T15:48:45.961819} INFO com.mkyong.StartApplication - [FIND_ALL] INFO com.mkyong.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.mkyong.StartApplication - [FIND_NAME_BY_ID] INFO com.mkyong.StartApplication - Customer D INFO com.mkyong.StartApplication - [COUNT] INFO com.mkyong.StartApplication - 4
Скачать Исходный Код
Рекомендации
- Примеры JDBC с пружинной загрузкой _
- Ядро базы данных H2
- Весенние документы JDBC
- Работа с базами данных SQL
- Функция JdbcTemplate queryforint() устарела
- Учебное пособие по Java JDBC
Оригинал: “https://mkyong.com/spring/spring-jdbctemplate-querying-examples/”