本小节教你如何访问关系数据库。

我们本节建立一个利用JdbcTemplate访问关系数据库的应用。

这个例子中我们将获取一个客户的信息,包括姓和名,因此,我们建立相应的实体类。

 1 package cn.tiny77.guide04;
 2 
 3 public class Customer {
 4     private long id;
 5     private String firstName, lastName;
 6 
 7     public Customer(long id, String firstName, String lastName) {
 8         this.id = id;
 9         this.firstName = firstName;
10         this.lastName = lastName;
11     }
12 
13     @Override
14     public String toString() {
15         return String.format(
16                 "Customer[id=%d, firstName='%s', lastName='%s']",
17                 id, firstName, lastName);
18     }
19 }

 

Spring提供的JdbcTemplate模板类可以帮助我们轻松地操作关系数据库。
在通常的JDBC代码中,大多数代码是关于获取资源、连接管理、异常处理和常见错误检查这些跟业务无关的代码,JdbcTemplate则可以帮助你关心这些问题,你只需要专注于手头任务的开发。

 1 package cn.tiny77.guide04;
 2 
 3 import org.slf4j.Logger;
 4 import org.slf4j.LoggerFactory;
 5 import org.springframework.beans.factory.annotation.Autowired;
 6 import org.springframework.boot.CommandLineRunner;
 7 import org.springframework.boot.SpringApplication;
 8 import org.springframework.boot.autoconfigure.SpringBootApplication;
 9 import org.springframework.jdbc.core.JdbcTemplate;
10 
11 import java.util.Arrays;
12 import java.util.List;
13 import java.util.stream.Collectors;
14 
15 @SpringBootApplication
16 public class Application implements CommandLineRunner {
17 
18     private static final Logger log = LoggerFactory.getLogger(Application.class);
19 
20     public static void main(String args[]) {
21         SpringApplication.run(Application.class, args);
22     }
23 
24     @Autowired
25     JdbcTemplate jdbcTemplate;
26 
27     public void run(String... strings) throws Exception {
28 
29         log.info("Creating tables");
30 
31         jdbcTemplate.execute("DROP TABLE customers IF EXISTS");
32         jdbcTemplate.execute("CREATE TABLE customers(" +
33                 "id SERIAL, first_name VARCHAR(255), last_name VARCHAR(255))");
34 
35         // 将姓和名分开放到数组里面
36         List<Object[]> splitUpNames = Arrays.asList("John Woo", "Jeff Dean", "Josh Bloch", "Josh Long").stream()
37                 .map(name -> name.split(" "))
38                 .collect(Collectors.toList());
39 
40         // 打印新数组
41         splitUpNames.forEach(name -> log.info(String.format("Inserting customer record for %s %s", name[0], name[1])));
42 
43         // 批量插入到数据库
44         jdbcTemplate.batchUpdate("INSERT INTO customers(first_name, last_name) VALUES (?,?)", splitUpNames);
45 
46         // 查询Json
47         log.info("Querying for customer records where first_name = 'Josh':");
48         jdbcTemplate.query(
49                 "SELECT id, first_name, last_name FROM customers WHERE first_name = ?", new Object[] { "Josh" },
50                 (rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("first_name"), rs.getString("last_name"))
51         ).forEach(customer -> log.info(customer.toString()));
52     }
53 }

 

 

Spring Boot 支持 H2,一个内存关系数据库, 并且自动建立链接。当我们使用Spring-jdbc时候, Spring boot 自动建立Jdbc Template,并通过@Autowired自动装配。

这个应用继承CommandLineRunner, 当应用加载完成它将会运行 run函数。

首先,你要通过JdbcTemplate的方法excute方法来安装DDL(即建表)

其次,你要将用户的姓名拆分并放到数组里面,这里用了lamdba表达式,不懂的小伙伴可以稍微补一下。

你可以通过JdbcTemplate的batchUpdate方法插入上面的数据,该方法第一个参数是sql模板,第二个是参数是一个二维数组。
二维数组的每一个元素都和sql模板生成一个sql,生成的方式为每个数组元素的值分别按顺序替换掉sql模板中的问号

对于单一的插入,使用JdbcTemplate的insert方法,但是对于批量插入,最好使用batchUpdate。

用?代替参数可以避免sql 注入

最后你使用query方法来查询表中的记录。

最后一行利用lamdba表达式把结果转换为Customer对象并打印出来。

运行结果:

 

项目下载