【前言】REST教程第三篇,介绍Spring中使用JDBC访问数据的方法。原文链接 http://spring.io/guides/gs/relational-data-access/
【目标】在这里,你将使用JdbcTemplate创建一个应用来访问关系数据库中的数据。
【准备工作】(由于轻车熟路了,我只列出pom.xml中dependencis中的内容,其他准备工作可以参考原文)
org.springframework.boot
spring-boot-starter
org.springframework
spring-jdbc
com.h2database
h2
第一个是spring应用的artifact,第二个是jdbc,第三个是h2数据库
下面用到的一个简单的数据库访问逻辑:处理客户的姓名。这里创建一个Customer类
package hello;
public class Customer {
private long id;
private String firstName, lastName;
public Customer(long id, String firstName, String lastName) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return String.format(
"Customer[id=%d, firstName='%s', lastName='%s']",
id, firstName, lastName);
}
// getters & setters omitted for brevity
}
Spring提供了一个模板类JdbcTemplate,能够很方便的用于SQL关系数据库和JDBC。大部分JDBC代码受限于被访问数据库的访问授权,连接管理,异常处理,错误校验,这些完全是(用户)代码不关心却不得不做的事情。JdbcTemplate模板帮你完成上面所以的操作!这样你只需要关注手头上的工作。
(下面的代码很长)
package hello;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
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 org.springframework.jdbc.core.RowMapper;
@SpringBootApplication
public class Application implements CommandLineRunner {
public static void main(String args[]) {
SpringApplication.run(Application.class, args);
}
@Autowired
JdbcTemplate jdbcTemplate;
@Override
public void run(String... strings) throws Exception {
System.out.println("Creating tables");
jdbcTemplate.execute("drop table customers if exists");
jdbcTemplate.execute("create table customers(" +
"id serial, first_name varchar(255), last_name varchar(255))");
String[] fullNames = new String[]{"John Woo", "Jeff Dean", "Josh Bloch", "Josh Long"};
for (String fullname : fullNames) {
String[] name = fullname.split(" ");
System.out.printf("Inserting customer record for %s %s\n", name[0], name[1]);
jdbcTemplate.update(
"INSERT INTO customers(first_name,last_name) values(?,?)",
name[0], name[1]);
}
System.out.println("Querying for customer records where first_name = 'Josh':");
List results = jdbcTemplate.query(
"select id, first_name, last_name from customers where first_name = ?", new Object[] { "Josh" },
new RowMapper() {
@Override
public Customer mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Customer(rs.getLong("id"), rs.getString("first_name"),
rs.getString("last_name"));
}
});
for (Customer customer : results) {
System.out.println(customer);
}
}
}
main()方法中的SpringApplication.run()在第一篇里也出现过,这里的作用和第一篇里相同。
SpringBoot执行H2数据库,一种内存数据库引擎,并且自动连接(代码中完全看不到指定了H2数据库。。。)。因为我们用了spring-jdbc,SpringBoot自动创建JdbcTemplate模板类。域@Autowired JdbcTemplate jdbcTemplate;会创建一个(JdbcTemplate)实例去自动加载并连接数据库,为我们提供Jdbc服务。
这个类实现了接口CommandLineRunner,该接口会在应用上下文加载完成后执行run()方法。
【小结】掌握JdbcTemplate的用法,复习@SpringBootApplication注解和SpringApplication.run()方法,注解@AutoWired实现JdbcTemplate对象的实例化,CommandLineRunner接口,RowMapper