JdbcTemplate 是 Spring 提供的一套 JDBC 模板框架,利用 AOP 技术来解决直接使用 JDBC 时大量重复代码的问题。JdbcTemplat 虽然没有 MyBatis 那么灵活,但是直接使用 JDBC 要方便很多。 Spring Boot 中对 JdbcTemplate 使用提供了自动配置类 JdbcTemplateAutoConfiguration ,部分源码如下:
从上面这段源码中可以看出,当 classpath 下存在 DataSource 和 JdbcTemplate 井且 DataSource
只有一个实例时,自动配置才会生效,若开发者没有提供 JdbcOperations ,则 Spring Boot 会自动向
容器中注入 JdbcTemplate (JdbcTemplat dbcOperations 的子类)。由此可以看到,开发者想要使用 JdbcTemplate ,只需要提供 JdbcTemplate 的依赖和 Data Source 依赖即可。具体操作步骤如下。
- 创建数据库和表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `hr_user`;
CREATE TABLE `hr_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`age` tinyint DEFAULT NULL COMMENT '年龄',
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '名字',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
BEGIN;
INSERT INTO `hr_user` VALUES (1, 20, 'wg1');
INSERT INTO `hr_user` VALUES (2, 20, 'wg2');
INSERT INTO `hr_user` VALUES (3, 20, 'wg3');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
- 创建项目
创建 Spring Boot 项目,添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
- 数据库配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://test
spring.datasource.username=root
spring.datasource.password=root123456
- 创建实体类
public class User {
private Integer id;
private String name;
private Integer age;
//省略get/set方法
}
- 创建数据库访问层
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.util.List;
@Repository
public class UserDao {
@Resource
JdbcTemplate jdbcTemplate;
public int addUser(User user) {
return jdbcTemplate.update("INSERT INTO user(name , age) VALUES (? , ?)", user.getName(), user.getAge());
}
public int updateUser(User user) {
return jdbcTemplate.update("UPDATE user SET name= ?,age= ? WHERE id=? ", user.getName(), user.getAge());
}
public int deleteUser(Integer id) {
return jdbcTemplate.update("DELETE FROM user WHERE id=?", id);
}
public User getBookById(Integer id) {
return jdbcTemplate.queryForObject("select * from book where id = ? ",
new BeanPropertyRowMapper<>(User.class), id);
}
public List<User> getAllBooks() {
return jdbcTemplate.query("select * from book",new BeanPropertyRowMapper<>(User.class));
}
}
• 创建 UserDao ,注入 JdbcTemplate。由于已经添加了 spring-jdbc 相关的依赖, JdbcTemplate 会被自动注册到 Spring 容器中,因此这里可以直接注入 JdbcTemplate 使用。
• JdbcTemplate ,增删改三种类型的操作主要使用 update、batchUpdate 方法来完成。 query、queryForObject 方法主要用来完成查询功能。另外,还有 execute 方法可以用来执行任意的SQL、call 方法用来调用存储过程等。
• 在执行查询操作时,需要有一个 RowMapper 将查询出来的列和实体类中的属性一一对应起来。如果列名和属性名都是相同的,那么可以直接使用 BeanPropertyRowMapp ;如果列名和属性名不同,就需要开发者自己实现 RowMapper 接口,将列和实体类属性一一对应起来。
- 创建 Service 和 Controller
@Service
public class UserService {
@Resource
private UserDao userDao;
public int addUser(User user) {
return userDao.addUser(user);
}
public int updateUser(User user) {
return userDao.updateUser(user);
}
public int deleteUser(Integer id) {
return userDao.deleteUser(id);
}
public User getUserById(Integer id) {
return userDao.getBookById(id);
}
public List<User> getAllUsers() {
return userDao.getAllBooks();
}
}
@RestController
public class UserController {
@Resource
private UserService userService;
@GetMapping("userTest")
public void userTest() {
HrUser hrUser = new HrUser();
hrUser.setAge(23);
hrUser.setName("张三");
//添加操作
int i = userService.addUser(hrUser);
System.out.println("addUser>>" + i);
HrUser hrUser1 = new HrUser();
hrUser1.setId(1);
hrUser1.setName("李四");
hrUser1.setAge(24);
//修改操作
int i1 = userService.updateUser(hrUser);
System.out.println("updateUser>>" + i1);
//获取数据
HrUser getHrUser = userService.getUserById(1);
System.out.println("getUserById>>" + getHrUser);
//获取所有数据
List<HrUser> allHrUsers = userService.getAllUsers();
System.out.println("getAllUsers>>" + allHrUsers);
//删除数据
int i2 = userService.deleteUser(1);
System.out.println("deleteUser>>" + i2);
}
}
- 最后,在浏览器中访问即:http://localhost:8080/userTest 地址。