通过JDBC和Spring去访问关系型数据库。
你将构建一个通过Sping的JdbcTemplate
去访问关系型数据库的项目。
跟着教程演示使用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()
标记成可执行类。再介绍一下上面的几个依赖引用
HikariCP
的JDBC库。创建一个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;@SpringBootApplicationpublic 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()
方法会在程序装载的时候自动执行。?
来避免sql注入攻击。代码写好之后就能运行打包了。
运行:mvn spring-boot:run
打包: mvn clean package
然后 java -jar target/gs-relational-data-access-0.1.0.jar
就能跑起来了。