二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。

上一章简单介绍了SpringBoot的热布署和多环境配置(四)如果没有看过,​​请观看上一章​​

一. SpringBoot 使用 JdbcTemplate

JdbcTemplate 实际上是 Spring 时就拥有的。 具体可以看,老蝴蝶以前写的 Spring系列文章 ​​Spring的JdbcTemplate的简单使用(七)​​

在 SpringBoot 时,继续讲解 JdbcTemplate, 一方面是扩展其用法,另一方面,是为了知识的完整性,引出 Jpa,Mybatis,MybatisPlus 等数据库框架,Druid数据库连接池配置。

老蝴蝶按照上一章节的方式,创建了 JdbcTemplate的项目,添加了热布署等依赖信息。

一.一 在 pom.xml 文件里面添加依赖

一.一.一 添加数据库驱动依赖

这儿使用 Mysql 数据库进行讲解

<!--引入MySql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

默认引入的是 8.0.18 版本。

一.一.二 添加 springboot整合jdbc的依赖

<!--引入springboot与jdbc整合的依赖,spring-boot-starter-jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

注意,引入的是 spring-boot-starter-jdbc, 并不是 spring-jdbc

一.二 application.yml 中配置数据库连接信息

# 引入 数据库的相关配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: abc123

一.三 注入 JdbcTemplate 模板对象

@SpringBootTest
@Log4j2
public class JdbcApplicationTests {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
void contextLoads() {
log.info("输出数据库jdbcTemplate连接信息,{}",jdbcTemplate);
}
}

运行 contextLoads() 测试方法,可以发现, JdbcTemplate对象,注入成功。

SpringBoot整合JdbcTemplate(五)_sql

老蝴蝶展示出 数据库元信息,让大家看一下。

@Test
void metaDataTest() throws Exception {
//获取 DataSource 对象
DataSource dataSource=jdbcTemplate.getDataSource();
//获取 DatabaseMetaData 数据库元数据
DatabaseMetaData databaseMetaData = dataSource.getConnection().getMetaData();
log.info("用户名是{}",databaseMetaData.getUserName());
log.info("url是{}",databaseMetaData.getURL());
log.info("数据库类型是{}",databaseMetaData.getDatabaseProductName());

}

运行 metaDataTest() 测试方法,打印出了数据库的元信息

SpringBoot整合JdbcTemplate(五)_JdbcTemplate_02

注意,这儿引入的是 HikariPool 连接池,以后,我们会用 Druid 连接池替换它。

一.四 引入 jdbc驱动,却不配置数据库连接信息

如果忘记了 一.二 步骤中的内容,即在配置文件里面,没有配置相关的数据库连接信息。

启动的时候,测试会报错。

SpringBoot整合JdbcTemplate(五)_spring_03

主方法 JdbcApplication.java 运行时,也会报错

@SpringBootApplication
public class JdbcApplication {
public static void main(String[] args) {

SpringApplication.run(JdbcApplication.class,args);
System.out.println("运行 JdbcTemplate 配置文件");
}
}

SpringBoot整合JdbcTemplate(五)_sql_04

依赖里面检测到了 jdbc的依赖,但是没有添加 jdbc的配置信息,所以会报错。

需要在启动时,在 @SpringBootApplication 注解时,排除掉 DataSource配置的依赖

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

这样,才启动的时候,就不检查 数据库的配置信息了。 主要针对的是,从网上找的项目,里面放置上大量的第三方依赖,而又不想手动从pom.xml中移除依赖的情况,如 RedisTemplate,RestTemplate 等。

二. JdbcTemplate 的详细用法

JdbcTemplate 里面封装了大量的方法,我们可以直接使用,简化我们的开发。

二.一 使用前准备

二.一.一 数据库准备

准备一个 user 表。

CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(15) DEFAULT NULL,
`sex` varchar(20) DEFAULT NULL,
`age` int(6) DEFAULT NULL,
`description` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

二.一.二 实体准备

在pojo 包下,创建一个 User 类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
/**
* @param id id编号
* @param name 姓名
* @param sex 性别
* @param age 年龄
* @param description 描述
*/
private Integer id;
private String name;
private String sex;
private Integer age;
private String description;
}

二.一.三 业务层接口和实现准备

public interface UserService {
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
}

二.一.四 测试类准备

@SpringBootTest
@Log4j2
public class CrudJdbcApplicationTests {
@Autowired
private UserService userService;

}

二.二 增删改 基本用法

均省略 UserService接口中的方法。

SpringBoot整合JdbcTemplate(五)_spring_05

增,删,改,调用的都是 update 方法, 可以进行单条数据更新,也可以进行批量数据的更新。

二.二.一 添加数据

二.二.一.一 测试方法
@Test
public void addTest(){
//1. 构建对象
User user=new User();
user.setName("欢欢");
user.setAge(22);
user.setSex("女");
user.setDescription("一个非常可爱的女孩纸");
//2. 添加方法
userService.addUser(user);

}
二.二.一.二 实现方法
@Override
public void addUser(User user) {
//1.sql语句
String sql="insert into user(name,sex,age,description) values(?,?,?,?) ";
//2.调用 update语句,执行方法
jdbcTemplate.update(sql,user.getName(),user.getSex(),user.getAge(),
user.getDescription());
}
二.二.一.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_sql_06

可以发现,数据被插入到数据库里面了。

二.二.二 修改数据

二.二.二.一 测试方法
@Test
public void updateTest(){
//1. 构建对象
User user=new User();
user.setId(2);
user.setName("欢欢");
user.setDescription("岳泽霖最好的朋友");
//2. 修改方法
userService.updateUser(user);
}
二.二.二二 实现方法
@Override
public void updateUser(User user) {
//1.sql语句
String sql="update user set name=?,description=? where id=? ";
//2.调用 update语句,执行方法
jdbcTemplate.update(sql,user.getName(),user.getDescription(),user.getId());
}
二.二.二.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_spring_07

数据修改成功。

二.二.三 删除数据

老蝴蝶不想删除 欢欢这条数据,所以新添加一条 岳泽霖的数据,将岳泽霖进行删除,欢欢保留在数据库里面。

SpringBoot整合JdbcTemplate(五)_JdbcTemplate_08

二.二.三.一 测试方法
@Test
public void deleteTest(){
userService.deleteUser(3);
}
二.二.三.二 实现方法
@Override
public void deleteUser(Integer id) {
String sql="delete from user where id=?";
jdbcTemplate.update(sql,id);
}
二.二.三.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_SpringBoot_09

数据删除成功。

二.二.四 批量数据

二.二.四.一 测试方法
@Test
public void batchAddTest(){
//1. 构建对象
User user=new User();
user.setName("小欢欢");
user.setAge(22);
user.setSex("女");
user.setDescription("一个小坏蛋");

User user1=new User();
user1.setName("小泽霖");
user1.setAge(25);
user1.setSex("男");
user1.setDescription("一个大坏蛋");
//2. 放置到集合里面
List<User> userList=new ArrayList<>();
userList.add(user);
userList.add(user1);
userService.batchAddUser(userList);
}
二.二.四.二 实现方法
@Override
public void batchAddUser(List<User> userList) {
//1.sql语句
String sql="insert into user(name,sex,age,description) values(?,?,?,?) ";
//2. 构建参数集合信息
List<Object[]> objects=new ArrayList<>();
for(User user:userList){
Object[] obj=new Object[4];
obj[0]=user.getName();
obj[1]=user.getSex();
obj[2]=user.getAge();
obj[3]=user.getDescription();
objects.add(obj);
}
//3.调用 batchUpdate 批量更新,执行方法
jdbcTemplate.batchUpdate(sql,objects);
}
二.二.五.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_JdbcTemplate_10

数据批量添加成功,批量修改与批量删除,也是相同的用法。

三 查询的基本用法

新建一个 QueryJdbcApplicationTests 测试类,用于测试查询的相关方法。

三.一 queryForObject 方法

三.一.一 方法重载

SpringBoot整合JdbcTemplate(五)_sql_11

通常使用的是

<T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args)

方法

三.一.二 举例,根据 Id进行查询单个对象信息

三.一.二.一 测试方法

@Test
public void queryByIdTest(){
User user=userService.queryById(2);
log.info(user);
}

三.一.二.二 实现方法

@Override
public User queryById(Integer id) {
String sql="select id,name,sex,age,description from user where id=?";
//用 RowMapper 进行封装对象信息
User user=jdbcTemplate.queryForObject(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet resultSet, int num) throws SQLException {
//根据resultSet 表示结果集, num 表示索引行
User tempUser=new User();
tempUser.setId(resultSet.getInt("id"));
tempUser.setName(resultSet.getString("name"));
tempUser.setSex(resultSet.getString("sex"));
tempUser.setAge(resultSet.getInt("age"));
tempUser.setDescription(resultSet.getString("description"));
return tempUser;
}
},id);

jdbcTemplate.queryForObject
return user;
}

三.一.二.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_SpringBoot_12

三.二 query方法

三.二.一 方法重载

SpringBoot整合JdbcTemplate(五)_sql_13

通常使用的是

<T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object... args)

方法。

三.二.二 举例,查询全部数据

三.二.二.一 测试方法

@Test
public void queryAllTest(){
List<User> userList=userService.queryForAll();
userList.forEach(n->log.info(n));
}

三.二.二.二 实现方法

@Override
public List<User> queryForAll() {
String sql="select id,name,sex,age,description from user ";
List<User> userList=jdbcTemplate.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet resultSet, int num) throws SQLException {
//根据resultSet 表示结果集, num 表示索引行
User tempUser=new User();
tempUser.setId(resultSet.getInt("id"));
tempUser.setName(resultSet.getString("name"));
tempUser.setSex(resultSet.getString("sex"));
tempUser.setAge(resultSet.getInt("age"));
tempUser.setDescription(resultSet.getString("description"));
return tempUser;
}
});
return userList;
}

三.二.二.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_sql_14

三.三 queryForMap方法

三.三.一 方法重载

SpringBoot整合JdbcTemplate(五)_JdbcTemplate_15

通常使用的是

Map<String, Object> queryForMap(String sql, @Nullable Object... args)

方法。

三.三.二 举例,查询全部数据

三三.二.一 测试方法

@Test
public void queryForMapTest(){
Map<String,Object> userMap=userService.queryForMapById(2);
log.info(userMap);
}

三.三.二.二 实现方法

@Override
public Map<String, Object> queryForMapById(Integer id) {
String sql="select id,name,sex,age,description from user where id=?";
Map<String,Object> map=jdbcTemplate.queryForMap(sql,id);
return map;
}

三.三.二.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_JdbcTemplate_16

三.四 queryForObject方法

三.四.一 方法重载

SpringBoot整合JdbcTemplate(五)_sql_11

三.四.二 举例,查询全部数据

三四.二.一 测试方法

@Test
public void queryForSingleTest(){
Integer count=userService.countAll();
log.info("查询总数目,{}",count);
}

三.四.二.二 实现方法

@Override
public Integer countAll() {
String sql="select count(1) from user";
Integer count=jdbcTemplate.queryForObject(sql,Integer.class);
return count;
}

三.四.二.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_数据_18

三.五 queryForList方法

三.五.一 方法重载

SpringBoot整合JdbcTemplate(五)_数据_19

三.五.二 举例,查询全部数据

三.五.二.一 测试方法

@Test
public void queryForIdsTest(){
List<Integer> idList=userService.queryForIdList();
log.info(idList);
}

三.五.二.二 实现方法

@Override
public List<Integer> queryForIdList() {
String sql="select id from user";
List<Integer> idList=jdbcTemplate.queryForList(sql,Integer.class);
return idList;
}

三.五.二.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_SpringBoot_20

三.六 execute 方法

三.六.一 方法重载

SpringBoot整合JdbcTemplate(五)_sql_21

三.六.二.一 测试方法

@Test
public void executeTest(){
userService.createTable();
}

三.六.二.二 实现方法

@Override
public void createTable() {
String sql="create table dept(id int(11),name varchar(200))";
jdbcTemplate.execute(sql);
}

三.六.二.三 查看数据结果

dept 部门表 创建成功。

SpringBoot整合JdbcTemplate(五)_spring_22

三.七 query 方法

三.七.一 方法重载

SpringBoot整合JdbcTemplate(五)_sql_13

三.七.二.一 测试方法

@Test
public void beanTest(){
List<User> userList=userService.queryBeanForAll();
userList.forEach(n->log.info(n));
}

三.七.二.二 实现方法

@Override
public List<User> queryBeanForAll() {
String sql="select id,name,sex,age,description from user ";
List<User> userList=jdbcTemplate.query(sql,new MyUserMapper());
return userList;
}
class MyUserMapper implements RowMapper<User>{

@Override
public User mapRow(ResultSet resultSet, int num) throws SQLException {
//根据resultSet 表示结果集, num 表示索引行
User tempUser=new User();
tempUser.setId(resultSet.getInt("id"));
tempUser.setName(resultSet.getString("name"));
tempUser.setSex(resultSet.getString("sex"));
tempUser.setAge(resultSet.getInt("age"));
tempUser.setDescription(resultSet.getString("description"));
return tempUser;
}
}

三.七.二.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_SpringBoot_24

三.八 queryForRowSet 方法

三.七.一 方法重载

SpringBoot整合JdbcTemplate(五)_sql_25

三.七.二.一 测试方法

@Test
public void rowSetTest(){
List<User> userList=userService.queryRowSetForAll();
userList.forEach(n->log.info(n));
}

三.七.二.二 实现方法

@Override
public List<User> queryRowSetForAll() {
String sql="select id,name,sex,age,description from user ";
SqlRowSet sqlRowSet=jdbcTemplate.queryForRowSet(sql);
List<User> userList=new ArrayList<>();
while(sqlRowSet.next()){
User tempUser=new User();
tempUser.setId(sqlRowSet.getInt("id"));
tempUser.setName(sqlRowSet.getString("name"));
tempUser.setSex(sqlRowSet.getString("sex"));
tempUser.setAge(sqlRowSet.getInt("age"));
tempUser.setDescription(sqlRowSet.getString("description"));
userList.add(tempUser);
}
return userList;
}

三.七.二.三 查看数据结果

SpringBoot整合JdbcTemplate(五)_JdbcTemplate_26

本章节的代码放置在 github 上:

​https://github.com/yuejianli/springboot/tree/develop/JdbcTemplate​

谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!