springBooot整合mybatis及统一事务管理

springBoot配置数据库连接以及事务管理

springBoot配置数据库(整合mybatis)

  1. 依赖引入:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>sfl.test.com</groupId>
    <artifactId>dataBasePro</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--父依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

    <!--编码格式及jdk版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
            <version>5.1.46</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>
    </dependencies>

    <!--打包方式 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.5.3.RELEASE</version>
                <configuration>
                    <mainClass>com.sfl.Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

2.建立对应的项目结构:

在这里插入图片描述

3.配置文件相关:
resource目录下新建配置文件:application.yml,application-dev.yml(便于项目启动选用对应的配置文件)
application.yml:

spring:
  profiles:
    active: dev

application-dev.yml

server:
  port: 8080
spring:
  datasource:
    username: sfl123
    password: 123456
    url: jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8

mybatis:
  mapper-locations: classpath:mapping/*Mapper.xml
  type-aliases-package: com.sfl.entity

#showSql
logging:
  level:
    com:
      sfl:
        mapper: debug

4.编写测试代码
controller:

@RestController
@RequestMapping("/testBoot")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getUser/{id}")
    public String getUser(@PathVariable int id){
        return userService.getUser(id).toString();
    }

    @RequestMapping("/insUser")
    public int insUser(){
        User user = new User();
        user.setPassWord("1234577");
        user.setUserName("qqq");
        user.setRealName("qqq");
        return  userService.insUser(user);
    }

    @RequestMapping("/updUser")
    public int uodUser(){
        User user = new User();
        user.setPassWord("678");
        user.setUserName("张飞1");
        user.setRealName("zhangFei1");
        user.setId(1);
        return  userService.updUser(user);
    }

    @RequestMapping("/delUser")
    public int del(){
        int id = 6;
        return userService.del(id);
    }

service:

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public User getUser(int id){
        return userMapper.sel(id);
    };

    public int insUser(User user){
        int i = userMapper.ins(user);
        if(i==2){
            throw new RuntimeException("事务出错");
        }
        return i;
    }

    public int updUser(User user){
        int i = userMapper.upd(user);
        if(i==2){
            throw new RuntimeException("事务出错");
        }
        return i;
    }

    public int del(int id){
        int i = userMapper.del(id);
        if(i==2){
            throw new RuntimeException("事务出错");
        }
        return i;
    }

mapper:

@Repository
public interface UserMapper {
    User sel(int id);
    int ins(User user);
    int upd(User user);
    int del(int id);
}

resource目录下新建mapper配置文件,与mapper类命名一致:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sfl.mapper.UserMapper">

    <resultMap id="BaseResultMap" type="com.sfl.entity.User">
        <result column="id" jdbcType="INTEGER" property="id" />
        <result column="userName" jdbcType="VARCHAR" property="userName" />
        <result column="passWord" jdbcType="VARCHAR" property="passWord" />
        <result column="realName" jdbcType="VARCHAR" property="realName" />
    </resultMap>

    <select id="sel" resultType="com.sfl.entity.User">
        select * from user where id = #{id}
    </select>

    <insert id="ins" parameterType="com.sfl.entity.User" useGeneratedKeys="true" keyProperty="id">
        insert into user(userName,passWord,realName) values(#{userName},#{passWord},#{realName})
    </insert>

    <update id="upd" parameterType="com.sfl.entity.User" useGeneratedKeys="true" keyProperty="id">
        update user set userName = #{userName},passWord=#{passWord},realName=#{realName} where id = #{id}
    </update>

    <delete id="del" parameterType="com.sfl.entity.User" >
        delete from user where id = #{id}
    </delete>
</mapper>

启动类配置(加入@MapperScan注解,扫描mapper文件):

@MapperScan("com.sfl.mapper")
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

加入事务管理

事务可以通过@Transactional注解来实现,一般加在service层。在这里我们进行统一的事务管理,可以用xml方式,这里采用配置类的方式:

@Configuration
public class TxAnoConfig {
    @Autowired
    private DataSource dataSource;

    /**
     * 获取事务管理器-修改信息1111
     * @return
     */
    @Bean("txManager")
    public DataSourceTransactionManager txManger(){
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * 事务拦截器
     */
    @Bean("txAdvice")
    public TransactionInterceptor txAdvice(DataSourceTransactionManager txManager){
        NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
        /* 只读事务,不做更新操作*/
        RuleBasedTransactionAttribute readOnlyTx = new RuleBasedTransactionAttribute();
        readOnlyTx.setReadOnly(true);
        /*不支持事务,当前存在事务时,将挂起事务,运行方法*/
        readOnlyTx.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);

        /*写事务,需要更新操作 */
        RuleBasedTransactionAttribute requiredTx = new RuleBasedTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED,
                Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
        requiredTx.setTimeout(5);

        Map<String, TransactionAttribute> txMap = new HashMap<>();
        txMap.put("ins*",requiredTx);
        txMap.put("upd*",requiredTx);
        txMap.put("get*",readOnlyTx);
        txMap.put("del*",requiredTx);
        txMap.put("add*",requiredTx);
        txMap.put("query*",readOnlyTx);
        source.setNameMap(txMap);
        return new TransactionInterceptor(txManager,source);
    }

    /*切面拦截规则 参数会自动从容器中注入*/
    @Bean
    public DefaultPointcutAdvisor defaultPointcutAdvisor(TransactionInterceptor txAdvice){
        DefaultPointcutAdvisor pointcutAdvisor = new DefaultPointcutAdvisor();
        pointcutAdvisor.setAdvice(txAdvice);
        AspectJExpressionPointcut pointCut = new AspectJExpressionPointcut();
        pointCut.setExpression("execution(* com.sfl.service.*.*(..))");
        pointcutAdvisor.setPointcut(pointCut);
        return pointcutAdvisor;
    }

事务配置分三步:
1.获取事务管理器DataSourceTransactionManager
2.生成事务拦截器(切面):TransactionInterceptor,对查询和操作数据库表实行不同的管理,查询是只读事务。
3.切面拦截规则,针对特定包下

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值