系列十五、Spring5编程式事务

一、业务代码

1.1、pom


    
    
      mysql
      mysql-connector-java
      8.0.26
    
    
    
      org.springframework
      spring-jdbc
      5.3.27
    
    
      org.mybatis
      mybatis
      3.5.11
    
    
      org.mybatis
      mybatis-spring
      2.1.0
    
    
      com.github.pagehelper
      pagehelper
      5.3.2
    

    
      org.springframework
      spring-beans
      5.2.5.RELEASE
    
    
      org.springframework
      spring-context
      5.2.5.RELEASE
    
    
      org.springframework
      spring-core
      5.2.5.RELEASE
    
    
      org.springframework
      spring-expression
      5.2.5.RELEASE
    

    
      commons-logging
      commons-logging
      1.1.1
    
    
      com.alibaba
      druid
      1.2.16
    
    
      junit
      junit
      4.13.2
    
    
      com.alibaba
      fastjson
      1.2.76
    

    
    
      org.projectlombok
      lombok
      1.18.22
    
    
      org.slf4j
      slf4j-api
      1.7.32
    
    
      ch.qos.logback
      logback-classic
      1.2.10
    

1.2、实体

1.2.1、UserDO

package org.star.entity.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @Author:
 * @Date: 2023/8/28 16:51
 * @Description:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDO implements Serializable {
    /**
     * 编号
     */
    private Integer id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 密码
     */
    private String password;

    /**
     * 手机号码
     */
    private String mobile;

    /**
     * 用户状态(0启用、1禁用)
     */
    private Integer status;
}

1.2.2、RoleUserDO

package org.star.entity.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/8/28 21:38
 * @Description:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RoleUserDO implements Serializable {
    /**
     * 用户ID
     */
    private Integer uId;

    /**
     * 角色ID
     */
    private Integer rId;

    /**
     * 删除标识(0未删除、1已删除)
     */
    private Integer deleted;
}

1.3、mapper

1.3.1、UserMapper.xml

package org.star.mapper;

import org.star.entity.model.UserDO;

import java.util.List;

/**
 * @Author:
 * @Date: 2023/8/28 16:53
 * @Description:
 */
public interface UserMapper {

    /**
     * 查询所有用户信息
     * @return
     */
    List listAllUser();

    /**
     * 根据ID查询用户
     * @param id 用户ID
     * @return
     */
    UserDO getUserById(Long id);

    /**
     * 禁用用户
     * @param id 用户ID
     * @return
     */
    boolean disableUser(Integer id);

}

1.3.2、RoleUserMapper.xml

package org.star.mapper;

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/8/28 21:45
 * @Description:
 */
public interface RoleUserMapper {

    /**
     * 根据用户ID删除角色
     * @param uId
     * @return
     */
    boolean delUserRole(Integer uId);

}

1.4、UserService

package org.star.service;

import com.github.pagehelper.PageInfo;
import org.star.entity.model.UserDO;

import java.util.List;

/**
 * @Author: 一叶浮萍归大海
 * @Date: 2023/8/28 17:41
 * @Description:
 */
public interface UserService {

    /**
     * 查询所有用户信息
     *
     * @return
     */
    List listAllUser();

    /**
     * 分页查询用户信息
     * @param pageNum   当前页码
     * @param pageSize  每页显示的记录数
     * @return
     */
    PageInfo pageUser(int pageNum, int pageSize);

    /**
     * 禁用用户
     * @param uId 用户ID
     * @return
     */
    boolean disableUser(Integer uId);
}

1.5、UserServiceImpl

package org.star.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.star.entity.model.UserDO;
import org.star.mapper.RoleUserMapper;
import org.star.mapper.UserMapper;
import org.star.service.UserService;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author: 一叶浮萍归大海
 * @Date: 2023/8/28 17:41
 * @Description:
 */
@Service
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;
    @Resource
    private RoleUserMapper roleUserMapper;
    @Resource
    private DataSourceTransactionManager transactionManager;

    @Override
    public List listAllUser() {
        return userMapper.listAllUser();
    }

    @Override
    public PageInfo pageUser(int pageNum, int pageSize) {
        // 设置当前页码以及每页显示的记录数
        PageHelper.startPage(pageNum,pageSize);
        // 执行查询
        List userDOS = userMapper.listAllUser();
        // 设置pageInfo对象
        PageInfo pageInfo = new PageInfo<>(userDOS);

        return pageInfo;
    }

    /**
     * 正常情况下,事务全部提交
     * @param uId 用户ID
     * @return
     */
    @Override
    public boolean disableUser(Integer uId) {
        TransactionDefinition td = new DefaultTransactionDefinition();
        TransactionStatus transactionStatus = transactionManager.getTransaction(td);
        try {
            // 1、禁用当前用户
            boolean disableResult = userMapper.disableUser(uId);

            // 两个操作之前模拟异常,看事务是否会回滚
            int i = 10 /0;

            // 2、删除用户关联的角色信息
            boolean delResult = roleUserMapper.delUserRole(uId);
            // 提交事务
            transactionManager.commit(transactionStatus);
            if (disableResult && delResult) {
                return true;
            }
        } catch (Exception e) {
            // 回滚事务
            transactionManager.rollback(transactionStatus);
        }

        return false;
    }
}

二、配置信息

2.1、jdbc.properties

db.driverClass=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/20230828_spring5?useSSL=false&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT
db.username=root
db.password=123456

2.2、applicationContext.xml




    
    

    
    
        
        
        
        
    


    
    
        
        
        
        
            
                
            
        
        
            
                
                    
                        
                        
                            helperDialect=mysql
                            reasonable=true
                        
                    
                
            
        
    

    
    
        
        
    

    
    
        
    

三、测试

3.1、AppTest

package org.star;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.star.entity.model.UserDO;
import org.star.mapper.UserMapper;
import org.star.service.UserService;
import org.star.service.impl.UserServiceImpl;

import java.util.List;

/**
 * Unit test for simple App.
 */
@Slf4j
public class AppTest {

    private ClassPathXmlApplicationContext context = null;

    @Before
    public void initApplicationContext() {
        context = new ClassPathXmlApplicationContext("applicationContext.xml");
    }

    // ================================= service test ================================
    @Test
    public void txTest() {
        UserService userService = context.getBean(UserServiceImpl.class);
        boolean result = userService.disableUser(1);
        log.info("result:{}", result);
    }

    @Test
    public void pageUserTest() {
        UserService userService = context.getBean(UserServiceImpl.class);
        PageInfo pageInfo = userService.pageUser(1, 10);

        log.info("pageInfo:{}", JSON.toJSONString(pageInfo));
    }

    // ================================= mapper test =================================
    @Test
    public void getUserByIdTest() {
        UserMapper userMapper = context.getBean(UserMapper.class);
        UserDO userDO = userMapper.getUserById(1L);
        log.info("userDO", JSON.toJSONString(userDO));
    }

    @Test
    public void listAllUserTest() {
        userMapperTest();
        // userServiceTest();
    }

    private void userServiceTest() {
        UserService userService = context.getBean(UserServiceImpl.class);
        List userDOS = userService.listAllUser();
        System.out.println("userService userDOS = " + userDOS);
    }

    private void userMapperTest() {
        UserMapper userMapper = context.getBean(UserMapper.class);
        List userDOS = userMapper.listAllUser();
        System.out.println("userMapper userDOS = " + userDOS);
    }


}

你可能感兴趣的:(Spring5系列,数据库,spring)