Рубрики
Без рубрики

Примеры запросов Spring JdbcTemplate

– Пружинная табличка JdbcTemplate Примеры запросов

Вот несколько примеров, которые покажут вам, как использовать 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 List findAll() {
	
        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 List findAll() {

        String sql = "SELECT * FROM CUSTOMER";

        List customers = new ArrayList<>();

        List> rows = jdbcTemplate.queryForList(sql);

        for (Map row : rows) {
            Customer obj = new Customer();

            obj.setID(((Integer) row.get("ID")).longValue());
            obj.setName((String) row.get("NAME"));
			// Spring returns BigDecimal, need convert
            obj.setAge(((BigDecimal) row.get("AGE")).intValue()); 
            obj.setCreatedDate(((Timestamp) row.get("CREATED_DATE")).toLocalDateTime());
            customers.add(obj);
        }

        return customers;
    }

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

Скачать Исходный Код

Рекомендации

Оригинал: “https://mkyong.com/spring/spring-jdbctemplate-querying-examples/”