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会自动默认分别注入DataSourceTransactionManagerJpaTransactionManager,所以我们不需要任何额外配置就可以用@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 工程目录

《SpringBoot基础教程4-1-1 使用JdbcTemplate操作数据库及事务管理》

7 结束语

本文是SpringBoot操作数据库的开篇,后续会介绍基于MybatisJPAMybatis Puls的数据库操作,已经基于Sharding Jdbc分库分表,读写分离操作,敬请期待,本文源码

欢迎关注博主公众号,第一时间推送最新文章

《SpringBoot基础教程4-1-1 使用JdbcTemplate操作数据库及事务管理》

    原文作者:数据库基础
    原文地址: https://my.oschina.net/Mkeeper/blog/2987425
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞