本小节教你如何访问关系数据库。
我们本节建立一个利用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对象并打印出来。
运行结果:
