Spring JdbcTemplate查询示例

旧城等待, 2023-02-15 05:28 69阅读 0赞

以下是一些示例,向您展示如何使用Spring JdbcTemplate查询或从数据库提取数据。

使用的技术:

  • Spring Boot 2.1.2发布
  • Spring JDBC 5.1.4.RELEASE
  • Maven 3
  • Java 8

简而言之:

  • jdbcTemplate.queryForObject或单值的jdbcTemplate.queryForObject
  • jdbcTemplate.query用于多个行或列表

注意
本文已从Spring Core 2.5.x更新到Spring Boot 2.1.x

PS您可能对此Spring Boot JDBC示例也感兴趣

1.查询单行

在Spring中,我们可以使用jdbcTemplate.queryForObject()从数据库查询单行记录,然后通过行映射器将行转换为对象。

1.1自定义RowMapper

CustomerRowMapper.java

  1. import org.springframework.jdbc.core.RowMapper;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. public class CustomerRowMapper implements RowMapper<Customer> {
  5. @Override
  6. public Customer mapRow(ResultSet rs, int rowNum) throws SQLException {
  7. Customer customer = new Customer();
  8. customer.setID(rs.getLong("ID"));
  9. customer.setName(rs.getString("NAME"));
  10. customer.setAge(rs.getInt("AGE"));
  11. customer.setCreatedDate(rs.getTimestamp("created_date").toLocalDateTime());
  12. return customer;
  13. }
  14. }
  15. import org.springframework.jdbc.core.JdbcTemplate;
  16. @Autowired
  17. private JdbcTemplate jdbcTemplate;
  18. public Customer findByCustomerId(Long id) {
  19. String sql = "SELECT * FROM CUSTOMER WHERE ID = ?";
  20. return jdbcTemplate.queryForObject(sql, new Object[]{id}, new CustomerRowMapper());
  21. }

1.2 Spring BeanPropertyRowMapper ,该类为您节省了很多映射时间。

  1. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  2. public Customer findByCustomerId2(Long id) {
  3. String sql = "SELECT * FROM CUSTOMER WHERE ID = ?";
  4. return (Customer) jdbcTemplate.queryForObject(
  5. sql,
  6. new Object[]{id},
  7. new BeanPropertyRowMapper(Customer.class));
  8. }

1.3在Java 8中,我们可以直接将其映射:

  1. public Customer findByCustomerId3(Long id) {
  2. String sql = "SELECT * FROM CUSTOMER WHERE ID = ?";
  3. return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) ->
  4. new Customer(
  5. rs.getLong("id"),
  6. rs.getString("name"),
  7. rs.getInt("age"),
  8. rs.getTimestamp("created_date").toLocalDateTime()
  9. ));
  10. }

2.查询多行

对于多行,我们使用jdbcTemplate.query()

2.1自定义RowMapper

  1. public List<Customer> findAll() {
  2. String sql = "SELECT * FROM CUSTOMER";
  3. List<Customer> customers = jdbcTemplate.query(
  4. sql,
  5. new CustomerRowMapper());
  6. return customers;
  7. }

2.2 BeanPropertyRowMapper

  1. public List<Customer> findAll() {
  2. String sql = "SELECT * FROM CUSTOMER";
  3. List<Customer> customers = jdbcTemplate.query(
  4. sql,
  5. new BeanPropertyRowMapper(Customer.class));
  6. return customers;
  7. }

2.3 Java 8

  1. public List<Customer> findAll() {
  2. String sql = "SELECT * FROM CUSTOMER";
  3. return jdbcTemplate.query(
  4. sql,
  5. (rs, rowNum) ->
  6. new Customer(
  7. rs.getLong("id"),
  8. rs.getString("name"),
  9. rs.getInt("age"),
  10. rs.getTimestamp("created_date").toLocalDateTime()
  11. )
  12. );
  13. }

2.4 jdbcTemplate.queryForList ,它可以工作,但不建议这样做, Map的映射可能与对象不相同,需要强制转换。

  1. public List<Customer> findAll() {
  2. String sql = "SELECT * FROM CUSTOMER";
  3. List<Customer> customers = new ArrayList<>();
  4. List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
  5. for (Map row : rows) {
  6. Customer obj = new Customer();
  7. obj.setID(((Integer) row.get("ID")).longValue());
  8. obj.setName((String) row.get("NAME"));
  9. // Spring returns BigDecimal, need convert
  10. obj.setAge(((BigDecimal) row.get("AGE")).intValue());
  11. obj.setCreatedDate(((Timestamp) row.get("CREATED_DATE")).toLocalDateTime());
  12. customers.add(obj);
  13. }
  14. return customers;
  15. }

3.查询单个值

就像从数据库查询单行一样,使用jdbcTemplate.queryForObject()

3.1单列名称

  1. public String findCustomerNameById(Long id) {
  2. String sql = "SELECT NAME FROM CUSTOMER WHERE ID = ?";
  3. return jdbcTemplate.queryForObject(
  4. sql, new Object[]{id}, String.class);
  5. }

3.2计数

  1. public int count() {
  2. String sql = "SELECT COUNT(*) FROM CUSTOMER";
  3. // queryForInt() is Deprecated
  4. // https://www.mkyong.com/spring/jdbctemplate-queryforint-is-deprecated/
  5. //int total = jdbcTemplate.queryForInt(sql);
  6. return jdbcTemplate.queryForObject(sql, Integer.class);
  7. }

4.测试

运行一个Spring Boot CommandLineRunner应用程序,创建表并测试API。

pom.xml

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jdbc</artifactId>
  4. </dependency>
  5. <!-- in-memory database -->
  6. <dependency>
  7. <groupId>com.h2database</groupId>
  8. <artifactId>h2</artifactId>
  9. </dependency>

StartApplication.java

  1. package com.mkyong;
  2. import com.mkyong.customer.Customer;
  3. import com.mkyong.customer.CustomerRepository;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.CommandLineRunner;
  8. import org.springframework.boot.SpringApplication;
  9. import org.springframework.boot.autoconfigure.SpringBootApplication;
  10. import org.springframework.jdbc.core.JdbcTemplate;
  11. import java.math.BigDecimal;
  12. import java.util.Arrays;
  13. import java.util.List;
  14. @SpringBootApplication
  15. public class StartApplication implements CommandLineRunner {
  16. private static final Logger log = LoggerFactory.getLogger(StartApplication.class);
  17. @Autowired
  18. JdbcTemplate jdbcTemplate;
  19. @Autowired
  20. CustomerRepository customerRepository;
  21. public static void main(String[] args) {
  22. SpringApplication.run(StartApplication.class, args);
  23. }
  24. @Override
  25. public void run(String... args) {
  26. log.info("StartApplication...");
  27. startCustomerApp();
  28. }
  29. // Tested with H2 database
  30. void startCustomerApp() {
  31. jdbcTemplate.execute("DROP TABLE customer IF EXISTS");
  32. jdbcTemplate.execute("CREATE TABLE customer(" +
  33. "id SERIAL, name VARCHAR(255), age NUMERIC(2), created_date timestamp)");
  34. List<Customer> list = Arrays.asList(
  35. new Customer("Customer A", 19),
  36. new Customer("Customer B", 20),
  37. new Customer("Customer C", 21),
  38. new Customer("Customer D", 22)
  39. );
  40. list.forEach(x -> {
  41. log.info("Saving...{}", x.getName());
  42. customerRepository.save(x);
  43. });
  44. log.info("[FIND_BY_ID]");
  45. log.info("{}", customerRepository.findByCustomerId(1L));
  46. log.info("{}", customerRepository.findByCustomerId2(2L));
  47. log.info("{}", customerRepository.findByCustomerId3(3L));
  48. log.info("[FIND_ALL]");
  49. log.info("{}", customerRepository.findAll());
  50. log.info("{}", customerRepository.findAll2());
  51. log.info("{}", customerRepository.findAll3());
  52. log.info("{}", customerRepository.findAll4());
  53. log.info("[FIND_NAME_BY_ID]");
  54. log.info("{}", customerRepository.findCustomerNameById(4L));
  55. log.info("[COUNT]");
  56. log.info("{}", customerRepository.count());
  57. }
  58. }

输出量

  1. INFO com.mkyong.StartApplication - Saving...Customer A
  2. INFO com.mkyong.StartApplication - Saving...Customer B
  3. INFO com.mkyong.StartApplication - Saving...Customer C
  4. INFO com.mkyong.StartApplication - Saving...Customer D
  5. INFO com.mkyong.StartApplication - [FIND_BY_ID]
  6. INFO com.mkyong.StartApplication - Customer{ID=1, name='Customer A', age=19, createdDate=2019-08-01T15:48:45.950848}
  7. INFO com.mkyong.StartApplication - Customer{ID=2, name='Customer B', age=20, createdDate=2019-08-01T15:48:45.961819}
  8. INFO com.mkyong.StartApplication - Customer{ID=3, name='Customer C', age=21, createdDate=2019-08-01T15:48:45.961819}
  9. INFO com.mkyong.StartApplication - [FIND_ALL]
  10. INFO com.mkyong.StartApplication - [
  11. Customer{ID=1, name='Customer A', age=19, createdDate=2019-08-01T15:48:45.950848},
  12. Customer{ID=2, name='Customer B', age=20, createdDate=2019-08-01T15:48:45.961819},
  13. Customer{ID=3, name='Customer C', age=21, createdDate=2019-08-01T15:48:45.961819},
  14. Customer{ID=4, name='Customer D', age=22, createdDate=2019-08-01T15:48:45.961819}
  15. ]
  16. //...omitted, duplicate code
  17. INFO com.mkyong.StartApplication - [FIND_NAME_BY_ID]
  18. INFO com.mkyong.StartApplication - Customer D
  19. INFO com.mkyong.StartApplication - [COUNT]
  20. INFO com.mkyong.StartApplication - 4

下载源代码

$ git clone https://github.com/mkyong/spring-boot.git
$ cd spring-jdbc
$查找com.mkyong.customer

参考文献

  • Spring Boot JDBC示例 _
  • H2数据库引擎
  • Spring JDBC文档
  • 使用SQL数据库
  • JdbcTemplate queryForInt()已弃用
  • Java JDBC教程

标签: h2 jdbc 查询 spring spring jdbc

翻译自: https://mkyong.com/spring/spring-jdbctemplate-querying-examples/

发表评论

表情:
评论列表 (有 0 条评论,69人围观)

还没有评论,来说两句吧...

相关阅读