SpringBoot
封装的JdbcTemplate
,使用模板模式,去除JDBC
繁琐的重复代码,并提供了基于注解的事务管理;下面详细介绍如何使用JdbcTemplate
操做数据和事务管理。java
<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
spring: datasource: url: jdbc:mysql://127.0.0.1:3306/springboot username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver
以上就是须要新增的配置,是否是很是简单mysql
数据库:SpringBoot
表:git
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;
@Data @Builder public class User { private Integer userId; private String userName; private String password; private String phone; }
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
这个自动化配置类,构造事务管理器。github
@Transactional
不只能够注解在方法上,也能够注解在类上。当注解在类上的时候意味着全部的public方法都是开启事务的。spring
@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()); } }
请读者动动手,运行测试用例test()
, transactionalTest()
sql
本文是SpringBoot
操做数据库的开篇,后续会介绍基于Mybatis
、JPA
、Mybatis Puls
的数据库操做,已经基于Sharding Jdbc
分库分表,读写分离操做,敬请期待,本文源码。数据库
欢迎关注博主公众号,第一时间推送最新文章springboot