SpringBoot整合JdbcTemplate
1.前言☕
大家好,我是Leo哥🫣🫣🫣,今天给大家带来关于精品SpringBoot专栏,暂且就给他起名为循序渐进学SpringBoot,这里我参考了我上一个专栏:循序渐进学SpringSecurity6。有需要的朋友可以抓紧学习来哈,带你从SpringSecurity从零到实战项目。好了,我们进入正题,为什么会有SpringBoot这个专栏呢,是这样的,今年Leo哥也是正在重塑知识体系,从基础到框架,而SpringBoot又是我们框架中的核心,我觉得很有必要通过以博客的形式将我的知识系列进行输出,同时也锻炼一下自己的写作能力,如果能帮到大家那就更好啦!!!本地系列教程会从SpringBoot基础讲起,会以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。好了,话不多说让我们开始吧😎😎😎。
2.概述
一般持久化的操作都是有一些专门来做持久化的框架来完成的,比如原始一些的JDBC, 老牌劲旅JPA(hibernate), 还有现在用的比较或的mybatis和MybatisPlus, 而SpringBoot中我们也是先要选择要使用的持久层框架,然后使用SpringBoot进行集成。而集成的步骤由于SpringBoot的自动化配置功能而大大简化。
今天我们先来搞个简单点的,先来个JdbcTemplate, 这个是Spring基于Jdbc而封装的一个持久层框架,致力于轻量、便捷地操作数据库。他的操作很简单,但是不如mybatis和jpa功能全面,但是比原生jdbc强点,说实话,实战中用的也比较少。
3.JdbcTemplate的特点
- 速度快,相对于ORM框架,JDBC的方式是最快的。
- 配置简单,Spring封装的,除了数据库连接之外,几乎没有额外的配置。
- 使用方便,就像DBUtils工具类,只需注入JdbcTemplate对象即可。
4.JdbcTemplate的几种类型的方法
JdbcTemplate虽然简单,功能却非常强大。它提供了非常丰富、实用的方法,归纳起来主要有以下几种类型的方法:
(1)execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句。
(2)update、batchUpdate方法:用于执行新增、修改与删除等语句。
(3)query和queryForXXX方法:用于执行查询相关的语句。
(4)call方法:用于执行 数据库存储 过程和函数相关的语句。
总的来说,新增、删除与修改三种类型的操作主要使用update和batchUpdate方法来完成。query和queryForObject方法中主要用来完成查询功能。execute方法可以用来执行任意的SQL、call方法来调用存储过程。
5.Spring Boot集成JdbcTemplate
SpringBoot集成JdbcTemplate很简单,需要引入依赖并做基础配置即可。接下来,我们就以一个具体的例子来学习如何利用Spring的JdbcTemplate进行数据库操作。
5.1 创建SpringBoot项目
我们这里还是采用Maven的方式创建SpringBoot项目,这里就不做过多赘述了。
5.2 添加POM依赖
不仅要加入jdbc依赖,还要加入数据库驱动依赖(这里加入mysql)以及lombok
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--引入jdbc stater 目的是使用JDBC模板接口-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
5.3 添加实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Integer age;
private String sex;
private String address;
private String avatar;
}
5.4 添加配置类
spring:
datasource:
url: jdbc:mysql://localhost:3306/leo-springboot-tutorial?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
username: root
password: root #数据库名、用户名和密码改为自己的
driver-class-name: com.mysql.cj.jdbc.Driver
5.5 添加测试类
1. 注册JdbcTemplate
@Autowired
JdbcTemplate jdbcTemplate;
2. 两种添加方法
/**
* 用于测试: 添加方法01
*/
@Test
public void test01() {
String sql = "insert into user (id, name, age,sex,address,avatar) values (?, ?,?,?,?,?)";
User user = new User();
user.setId(1);
user.setName("Leo哥");
user.setAge(18);
user.setSex("男");
user.setAddress("北京朝阳");
user.setAvatar("https://www.javatop.cn/images/logo.png");
int update = jdbcTemplate.update(sql, user.getId(),user.getName(),user.getAge(), user.getSex(),user.getAddress(),user.getAvatar());
System.out.println("update = " + update);
}
下面的方法通过GeneratedKeyHolder可以拿到在插入数据库数据之后,数据库分配给此项数据的ID,并返回给后台
/**
* 用于测试: 添加方法02
*/
@Test
public void test02() {
GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
User user = new User();
user.setId(3);
user.setName("lifi2");
user.setAge(20);
user.setSex("女");
user.setAddress("湖南漳州");
user.setAvatar("https://www.javatop.cn/images/logo.png");
int update = jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
String sql = "insert into user (id, name, age,sex,address,avatar) values (?, ?,?,?,?,?)";
PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setObject(1, user.getId());
ps.setObject(2, user.getName());
ps.setObject(3, user.getAge());
ps.setObject(4, user.getSex());
ps.setObject(5, user.getAddress());
ps.setObject(6, user.getAvatar());
return ps;
}
}, keyHolder);
System.out.println("主键ID = " + keyHolder.getKey().intValue());
user.setId(keyHolder.getKey().intValue());
}
可以在添加用户的时候直接获取到我们的主键ID并返回。
3. 删除方法
/**
* 用于测试: 删除方法
*/
@Test
public void test03() {
String sql = "delete from user where id = ?";
Integer id = 3;
int update = jdbcTemplate.update(sql, id);
System.out.println("受影响的行数" + update);
}
可以看到我们受影响的行数为1。
ID为3的用户也被删除了。
4. 修改方法
/**
* 用于测试: 修改方法
*/
@Test
public void test04() {
String sql = "update user set name = ? where id = ?";
int update = jdbcTemplate.update(sql, "张三", 2);
System.out.println("受影响的行数" + update);
}
可以看到我们受影响的行数为1。
ID为2的用户lifi被改为了张三。
5. 查询方法
/**
* 用于测试: 查询方法
*/
@Test
public void test05() {
List<User> list = jdbcTemplate.query("select * from user", new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
Integer id = rs.getInt("id");
String name = rs.getString("name");
Integer age = rs.getInt("age");
String sex = rs.getString("sex");
String address = rs.getString("address");
String avatar = rs.getString("avatar");
user.setId(id);
user.setName(name);
user.setAge(age);
user.setSex(sex);
user.setAddress(address);
user.setAvatar(avatar);
System.out.println("user = " + user);
return user;
}
});
}
6.总结
在大部分情况下,我们都会直接使用更加强大的持久化框架来访问数据库,比如MyBatis、Hibernate或者Spring Data JPA,我们这里讲解JdbcTemplate的整合,只是告诉大家有这么一种操作数据库的方式。
以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。
如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。
本文由博客一文多发平台 OpenWrite 发布!