实现效果:
使用Spring的JdbcTemplate模板构建一个应用程序来访问存储在关系数据库中的数据。
项目结构
└── src
└── main
└── java
└── hello
pom.xml
4.0.0
org.springframework
gs-relational-data-access
0.1.0
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
1.8
org.springframework.boot
spring-boot-starter-jdbc
com.h2database
h2
org.springframework.boot
spring-boot-maven-plugin
1.创建一个Customer对象
src/main/java/hello/Customer.java
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
}
2.存储和查询数据
Spring提供了一个名为JdbcTemplate的模板类,可以轻松使用SQL关系数据库和JDBC。 大多数JDBC代码都陷入资源获取,连接管理,异常处理和一般错误检查之中,这与代码要实现的内容完全无关。 JdbcTemplate会完成所有这些工作。 要做的就是专注于手头的业务。
src/main/java/hello/Application.java
package hello;
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.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@SpringBootApplication
public class Application implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String args[]) {
SpringApplication.run(Application.class, args);
}
@Autowired
JdbcTemplate jdbcTemplate;
@Override
public void run(String... strings) throws Exception {
log.info("Creating tables");
jdbcTemplate.execute("DROP TABLE customers IF EXISTS");
jdbcTemplate.execute("CREATE TABLE customers(" +
"id SERIAL, first_name VARCHAR(255), last_name VARCHAR(255))");
// Split up the array of whole names into an array of first/last names
List
Spring Boot
支持H2
数据库,一种内存中的关系数据库引擎,并自动创建连接。 因为使用的是spring-jdbc
,所以Spring Boot
会自动创建一个JdbcTemplate。@Autowired
注解JdbcTemplate字段自动加载它并使其可用。
Application类实现了Spring Boot的CommandLineRunner
接口,这意味着它将在加载完应用后执行run()
方法。
首先,使用JdbcTemplate的execute
方法安装一些DDL(数据库模式定义语言DDL(Data Definition Language))
.
其次,使用Java 8语法获取字符串列表,将它们拆分为Java数组中的firstname / lastname
对。
然后使用JdbcTemplate的
batchUpdate`方法在新创建的表中安装一些记录。 方法的第一个参数是要执行的sql语句,最后一个参数(Object的数组) 替换sql语中的“?”变量。
对于单行插入,用JdbcTemplate的
insert
方法很好。 但对于多个批量插入,最好使用batchUpdate
。
使用 ''?'' 绑定变量来避免SQL注入攻击。
最后,使用query
方法在表中搜索与条件匹配的记录。 再次使用“?”为查询创建参数,在调用时传入实际值。 最后一个参数使用Java 8 lambda语法,表示将每个结果行转换为新的Customer对象。
Java 8 lambdas能映射到单个方法接口,如Spring的RowMapper
。 如果是Java 7或更早版本,需要插入匿名接口实现,与lambdaexpresion
表达式包含的相同的方法。
建立一个可执行的 JAR
利用maven
打包war或者jar运行,这里不做介绍.
java -jar target/gs-relational-data-access-0.1.0.jar
测试
运行后将会出现类似下方的日志输出:
2015-06-19 10:58:31.152 INFO 67731 --- [ main] hello.Application : Creating tables
2015-06-19 10:58:31.219 INFO 67731 --- [ main] hello.Application : Inserting customer record for John Woo
2015-06-19 10:58:31.220 INFO 67731 --- [ main] hello.Application : Inserting customer record for Jeff Dean
2015-06-19 10:58:31.220 INFO 67731 --- [ main] hello.Application : Inserting customer record for Josh Bloch
2015-06-19 10:58:31.220 INFO 67731 --- [ main] hello.Application : Inserting customer record for Josh Long
2015-06-19 10:58:31.230 INFO 67731 --- [ main] hello.Application : Querying for customer records where first_name = 'Josh':
2015-06-19 10:58:31.242 INFO 67731 --- [ main] hello.Application : Customer[id=3, firstName='Josh', lastName='Bloch']
2015-06-19 10:58:31.242 INFO 67731 --- [ main] hello.Application : Customer[id=4, firstName='Josh', lastName='Long']
2015-06-19 10:58:31.244 INFO 67731 --- [ main] hello.Application : Started Application in 1.693 seconds (JVM running for 2.054)