Вот несколько примеров, которые покажут вам, как использовать 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 List findAll() {
String sql = "SELECT * FROM CUSTOMER";
List customers = jdbcTemplate.query(
sql,
new BeanPropertyRowMapper(Customer.class));
return customers;
}
2.3 Java 8
public List findAll() {
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)");
List list = 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/”