微人事第五天:springboot整合JdbcTemplate
现在来对springboot对持久层的整合
1.创建项目
勾选web,MYSQL Driver和JDBC API依赖
然后再pom.xml文件中修改连接数据库的版本号(修改成自己数据库的版本)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.27</version>
</dependency>
然后需要配置数据库连接池:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
2.连接数据库的配置
使用JdbcTemplate需要提供数据库连接参数
这里在application.properties中配置
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/javaboy?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
3.创建对应数据库表的实体类
在mysql数据库中有一个名称为javaboy的数据库,其中有一张表是user
user表中有id,username,address这三个字段。
现在创建的实体类对应的就是user表,并在实体类中创建set和get方法。
package org.javaboy.jdbctemplate.bean;
//创建实体类,对应user表
public class User {
private Integer id;
private String username;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
'}';
}
}
4.创建service类提供业务逻辑(也就是crud方法)
package org.javaboy.jdbctemplate.service;
import org.javaboy.jdbctemplate.JdbctemplateApplication;
import org.javaboy.jdbctemplate.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public Integer addUser(User user) {
return jdbcTemplate.update("insert into user (id,username,address) value (?,?,?)",
user.getId(),user.getUsername(),user.getAddress());
}
}
上面代码的核心就是注入了JdbcTemplate类,然后使用了JdbcTemplate中的update方法(这里你无论是删除,增加还是修改都用update方法,因为crud这些操作本质上就是对数据库进行修改),然后在update中的第一个参数编写sql语句,提供的具体值用?占位,之后的参数就是传递具体的值来替换?
那为何JdbcTemplate可以被注入呢?我们来讲解一下其中的原理
连按两下shift,输入JdbcTemplateAutoConfiguration查看
可以看到注解如下,也就是说生效的条件是要有DataSource和JdbcTemplate
其中DataSource我们在application.properties中已经配置过了,JdbcTemplate也在pom.xml文件中加入依赖了。
其中方法:如果你没有配置一个JdbcOperations系统就会帮你默认配置一个JdbcTemplate,JdbcOperations是JdbcTemplate的父类。
在方法中可以看到会帮你创建一个JdbcTemplate实例,然后返回这个实例
所以就可以解释为何能在service类中注入JdbcTemplate了。
5.测试类中测试
在springboot自带的测试类中注入UserService,然后使用这个类的方法
package org.javaboy.jdbctemplate;
import org.javaboy.jdbctemplate.bean.User;
import org.javaboy.jdbctemplate.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class JdbctemplateApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
User user = new User();
user.setId(1);
user.setUsername("javaboy");
user.setAddress("www.javaboy.org");
userService.addUser(user);
}
}
6.点击运行测试类
在mysql数据库中查看:
可以看到数据添加成功。
上面就是使用JdbcTemplate对数据库进行添加操作,接下来来演示一下修改操作:
假设我们要把刚刚添加的那条数据的username中的javaboy修改掉
首先在service类中添加修改方法:
这里原理和添加是一样的
//更新方法
public Integer updateUsernameById(User user) {
return jdbcTemplate.update("update user set username = ? where id = ?",
user.getUsername(),user.getId());
}
然后在测试类中进行测试:
@Test
public void test1() {
User user = new User();
user.setId(1);
user.setUsername("javaboy-2");
userService.updateUsernameById(user);
}
点击运行测试类,刷新数据库:
可以看到修改成功。
删除方法也是同样道理这里就不再演示了。
下面再来演示一下查询操作:
service中添加方法:
//查询方法
public List<User> getAllUser2() {
return jdbcTemplate.query("select * from user",new BeanPropertyRowMapper<>(User.class));
}
测试类:
@Test
public void test2() {
List<User> allUser2 = userService.getAllUser2();
for (User user : allUser2) {
System.out.println(user);
}
}
运行结果: