[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就能跑起来了。
[SpringBoot guides系列翻译]通过JDBC和Spring访问关系数据库的更多相关文章
- SpringBoot实战(四)之使用JDBC和Spring访问数据库
这里演示的是h2databse示例,所以简单的介绍普及下h2database相关知识 H2数据库是一个开源的关系型数据库. H2是一个嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提 ...
- [SpringBoot guides系列翻译]调用RESTfulWebService
原文 参考链接 CommandLineRunner Bean 翻译如何调用RESTful WebService 这节将演示如何在SpringBoot里面调用RESTful的WebService. 构建 ...
- [SpringBoot guides系列翻译]调度任务
原文 调度任务 用spring实现一个任务调度. 你将做的 你将做一个应用每5秒钟打印当前时间,用@Scheduled注解. 你需要啥 15分钟 文本编辑器或者IDE JDK1.8+ Gradle4+ ...
- [SpringBoot guides系列翻译]SpringBoot构建RESTful程序入门
原文地址 构建一个RESTful的WebService 这个指南将带你用Spring创建一个RESTful的helloworld程序. 你将完成 在下面地址上创建一个接收http get请求的服务 h ...
- [SpingBoot guides系列翻译]文件上传
文件上传 这节的任务是做一个文件上传服务. 概况 参考链接 原文 thymeleaf spring-mvc-flash-attributes @ControllerAdvice 你构建的内容 分两部分 ...
- [SpingBoot guides系列翻译]Redis的消息订阅发布
Redis的消息 部分参考链接 原文 CountDownLatch 概述 目的 这节讲的是用Redis来实现消息的发布和订阅,这里会使用Spring Data Redis来完成. 这里会用到两个东西, ...
- Springboot 系列(十)使用 Spring data jpa 访问数据库
前言 Springboot data jpa 和 Spring jdbc 同属于 Spring开源组织,在 Spring jdbc 之后又开发了持久层框架,很明显 Spring data jpa 相对 ...
- springboot成神之——spring boot,spring jdbc和spring transaction的使用
本文介绍spring boot,spring jdbc和spring transaction的使用 项目结构 依赖 application model层 mapper层 dao层 exception层 ...
- SpringBoot基础系列-使用日志
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996897.html SpringBoot基础系列-使用日志 概述 SpringBoot ...
随机推荐
- 构建apache web 服务器
一.Apache服务器工作模式 1.Prefork模式:Prefork MPM使用多个子进程,每个子进程只有一个线程,每个进程在某个确定的时间只能维护一个连接 2.Worker模式: Worker M ...
- 对称加密算法 ~ Des
一.对称加密 (Symmetric Key Encryption) 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret ...
- ASP.NET Core的实时库: SignalR -- 预备知识
大纲 本系列会分为2-3篇文章. 第一篇介绍SignalR的预备知识和原理 然后会介绍SignalR和如何在ASP.NET Core里使用SignalR. 本文的目录如下: 实时Web简述 Long ...
- 用Docker解决坑爹的环境搭建系列——postgresql
sudo docker pull postgres mkdir -p /data/docker/pgsql sudo docker run -p 54321:5432 --name pgsql -v ...
- linux文件权限总结(创建root不可以删除文件、只可追加的日志文件等)
文件类型 对于文件和目录的访问权力是根据读访问,写访问,和执行访问来定义的. 我们来看一下 ls 命令的输出结果 [root@iZ28dr6w0qvZ test]# ls -l 总用量 72 -rw- ...
- C# ASP.NET MVC:使用Cookie记住账号密码
MVC记住账号密码 使用cookie操作 前端: <div> 用户名:<input type="text" id="UserName" val ...
- android Fragment中使用Toolbar
在Activity中可以直接使用 setSupportActionBar(toolbar); 就可以重写 onCreateOptionsMenu 和 onOptionsItemSelected 方法: ...
- 在Hyper-V上安装RemixOS 的Android模拟器
不想用实体机,想不想弄个快速的Android虚拟环境,今天我们就来说说把Android模拟器(RemixOS)安到Hyper-v上的办法. 1. 下载RemixOs 或者直接去 论坛获得下载地址 2 ...
- 织梦5.7sp1最新问题:后台不显示编辑器
1.在后台的“系统基本参数”里修改“站点设置”的“网页主页链接:空”. 2.修改“核心设置”DedeCMS安装目录:空“. 3.试试,问题解决.
- LOJ #6051. 「雅礼集训 2017 Day11」PATH
完了感觉最近留了好多坑的说,这题也是模模糊糊地会一点 首先我们发现题目要求的是单调不上升的序列个数,那么一个套路就是用值减去下标 然后考虑连续位置的限制,这个我们做一个置换然后尽量向后取 这样拿值和位 ...