[SpringBoot guides系列翻译]通过JDBC和Spring访问关系数据库
参考链接
目的
通过JDBC和Spring去访问关系型数据库。
你将构建的项目
你将构建一个通过Sping的JdbcTemplate
去访问关系型数据库的项目。
你需要的
- 大约15min
- 喜欢的编辑器或IDE
- jdk1.8+
- Gradle4+ 或 Maven3.2+
如何完成
跟着教程演示使用Maven的方式。
通过Maven构建
如果不熟悉最基本的Maven用法,看这里
创建结构结构
mkdir -p src/main/java/hello
编写pom.xml
<?xml version="1.0" encoding="UTF-8" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springframework</groupId>
<artifactId>gs-relational-data-access</artifactId>
<version>0.1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.9.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<artifactId>spring-boot-starter-jdbc</artifactId>
<groupId>org.springframework.boot</groupId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
build的时候用到了spring-boot-maven-plugin插件。他提供了很多便捷的特性。
- 把用到的所有依赖打包成一个整体,这样方便服务的执行以及分发。
- 把
public static void main()
标记成可执行类。 - 提供了内置的依赖解析器用于设置相符的Spring Boot依赖的版本号。
再介绍一下上面的几个依赖引用
- Spring Boot Starter Parent:提供Maven项目的依赖和插件管理功能。
- Spring Boot Starter JDBC:Spring里面基于
HikariCP
的JDBC库。 - h2:内存数据库,用于测试和开发。
创建一个Customer 对象
创建一个Customer对象,包含firstname 和 lastname来表示应用层的数据对象。
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);
}
}
存取数据
Spring提供了JdbcTemplate
来简化JDBC相关的sql关系数据操作。大部分的JDBC代码可能会陷入资源获取,链接管理,异常处理,一般的错误检查等和我们代码要实现的主要功能没有关系的问题中。JdbcTemplate帮我们处理,你需要做的就是关注你的逻辑代码。下面开始写Application.java。
src/main/java/hello/Application.java
package hello;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
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;
@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... args) throws Exception {
log.info("创建表");
jdbcTemplate.execute("drop table customer if exists");
jdbcTemplate.execute("create table customer(id serial, first_name varchar(255), last_name varchar(255))");
List<Object[]> splitUpNames = Arrays.asList("John Woo", "Jeff Dean", "Josh Bloch", "Josh Long").stream()
.map(name -> name.split(" "))
.collect(Collectors.toList());
splitUpNames.forEach(name -> log.info(String.format("插入表数据,first_name %s last_name %s", name[0], name[1])));
jdbcTemplate.batchUpdate("insert into customer (first_name, last_name) values (?,?)", splitUpNames);
log.info("查询customer,first_name='Josh'");
jdbcTemplate.query("select * from customer where first_name=?", new Object[]{"Josh"},
(rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("first_name"), rs.getString("last_name")))
.forEach(customer -> {
log.info(customer.toString());
});
;
}
}
有几点注意一下:
@SpringBootApplication
注解,相当于启用了几个注解@Configuration
,表示这个类定义的是应用程序上下文。@EnableAutoConfiguration
,表示Spring会通过class path,bean设置,属性设置来添加bean。@ComponentScan
查找当前hello
包中包含的component,configuration,service。
@Autowired
注解,可以用在构造器,字段,setter方法,config方法中,配置了之后Spring会自动装配。需要的时候也就是会帮你获取。Application
类实现了了Spring Boot的CommandLineRunner
接口,这意味着它的run()
方法会在程序装载的时候自动执行。- 这个的java的lambda表达式用起来感觉挺好的。找时间好好学学。
- 调用JdbcTemplate的时候使用
?
来避免sql注入攻击。
编译生成可执行jar
代码写好之后就能运行打包了。
运行:mvn spring-boot:run
打包: mvn clean package
然后 java -jar target/gs-relational-data-access-0.1.0.jar
就能跑起来了。