SpringBoot基础教程4-1-1 使用JdbcTemplate操作数据库及事务管理
1 概述
SpringBoot
封装的JdbcTemplate
,使用模板模式,去除JDBC
繁琐的重复代码,并提供了基于注解的事务管理;下面详细介绍如何使用JdbcTemplate
操作数据和事务管理。
2 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
-
SpringBoot
会自动初始化JdbcTemplate
3 数据源配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/springboot
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
以上就是需要新增的配置,是不是非常简单
4 业务代码,实现数据库增删改查
4.1 新建数据库,新建表
数据库:SpringBoot
表:
CREATE TABLE `t_user` (
`user_id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR ( 255 ) NOT NULL,
`password` VARCHAR ( 255 ) NOT NULL,
`phone` VARCHAR ( 20 ) NOT NULL,
PRIMARY KEY ( `user_id` )
) ENGINE = INNODB AUTO_INCREMENT = 1018 DEFAULT CHARSET = utf8;
4.2 新建实体
@Data
@Builder
public class User {
private Integer userId;
private String userName;
private String password;
private String phone;
}
4.3 增删改查
public interface UserService {
/**
* 新增一个用户
*/
Integer create(User user);
/**
* 根据Name删除一个用户
*/
void deleteByName(String userName);
/**
* 获取用户总量
*/
Integer getAllUsers();
/**
* 删除所有用户
*/
void deleteAllUsers();
/**
* 先清空数据
* 再新增数据
* 要求再一个事物中执行
*/
void clearAdd(User user);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public Integer create(User user) {
return jdbcTemplate.update("insert into T_USER(USER_NAME, PASSWORD, PHONE) values (?, ?, ?)",
user.getUserName(), user.getPassword(), user.getPhone());
}
@Override
public void deleteByName(String userName) {
jdbcTemplate.update("delete from T_USER where USER_Name = ?", userName);
}
@Override
public Integer getAllUsers() {
return jdbcTemplate.queryForObject("select count(1) from T_USER", Integer.class);
}
@Override
public void deleteAllUsers() {
jdbcTemplate.update("delete from T_USER");
}
@Transactional
@Override
public void clearAdd(User user) {
this.deleteAllUsers();
this.create(user);
}
}
当引入jdbc
依赖之后,SpringBoot
会自动默认分别注入DataSourceTransactionManager
或JpaTransactionManager
,所以我们不需要任何额外配置就可以用@Transactional
注解进行事务的使用。spring-boot-starter-jdbc
会触发DataSourceTransactionManagerAutoConfiguration
这个自动化配置类,构造事务管理器。
@Transactional
不仅可以注解在方法上,也可以注解在类上。当注解在类上的时候意味着所有的public方法都是开启事务的。
4.4 编写测试用例
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserServiceImplTest {
@Resource
private UserService userService;
@Before
public void setUp() {
// 准备,清空user表
userService.deleteAllUsers();
}
@Test
public void test() {
// 插入5个用户
userService.create(User.builder().userName("a").password("123").phone("110").build());
userService.create(User.builder().userName("b").password("1234").phone("119").build());
userService.create(User.builder().userName("c").password("12345").phone("120").build());
userService.create(User.builder().userName("d").password("123456").phone("122").build());
userService.create(User.builder().userName("e").password("1234567").phone("135").build());
// 查数据库,应该有5个用户
Assert.assertEquals(5, userService.getAllUsers().intValue());
// 删除两个用户
userService.deleteByName("a");
userService.deleteByName("e");
// 查数据库,应该有5个用户
Assert.assertEquals(3, userService.getAllUsers().intValue());
}
@Test
public void transactionalTest(){
// 插入5个用户
userService.create(User.builder().userName("a").password("123").phone("110").build());
userService.create(User.builder().userName("b").password("1234").phone("119").build());
userService.create(User.builder().userName("c").password("12345").phone("120").build());
userService.create(User.builder().userName("d").password("123456").phone("122").build());
userService.create(User.builder().userName("e").password("1234567").phone("135").build());
User otherUser = User.builder().userName("f").password("12345678").phone("911").build();
// 查数据库,应该有5个用户
Assert.assertEquals(5, userService.getAllUsers().intValue());
userService.clearAdd(otherUser);
userService.create(User.builder().userName("a").password("123").phone("110").build());
// 查数据库,应该有2个用户
Assert.assertEquals(2, userService.getAllUsers().intValue());
UserService mockService = mock(UserServiceImpl.class);
when(mockService.create(otherUser)).thenThrow(new RuntimeException());
mockService.clearAdd(otherUser);
// 查数据库,应该有2个用户
Assert.assertEquals(2, userService.getAllUsers().intValue());
}
}
5 测试结果
请读者动动手,运行测试用例test()
, transactionalTest()
6 工程目录
7 结束语
本文是SpringBoot
操作数据库的开篇,后续会介绍基于Mybatis
、JPA
、Mybatis Puls
的数据库操作,已经基于Sharding Jdbc
分库分表,读写分离操作,敬请期待,本文源码。
欢迎关注博主公众号,第一时间推送最新文章