springboot自學之路-11(springboot集成事務)

在上篇文章https://blog.csdn.net/u012045045/article/details/105897047 的基礎上繼續。

有2種方法:

目錄

1.在service實現類上添加@Transactional

2.使用xml配置


1.在service實現類上添加@Transactional

一、在service實現類上添加@Transactional

package com.example._04mybatis.controller;

import com.example._04mybatis.domain.User;
import com.example._04mybatis.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * @Package: com.example._04mybatis.controller
 * @ClassName: PersonController
 * @Description: <p>Description: </p>
 * @author: zq
 * @since: 2020/5/2 22:05
 * @version: 1.0
 * @Copyright: 2020 zq. All rights reserved.
 */
@Controller
public class UserController {

    @Autowired
    IUserService service;

    @RequestMapping("/getAllUser")
    @ResponseBody
    public List<User> getAllUser() {

        return service.findAll();

    }

    @RequestMapping("/getSelectUser")
    @ResponseBody
    public List<User> getSelectUser(int id) {

        return service.findSelect(id);

    }

    @RequestMapping("/insert")
    @ResponseBody
    public Integer insert(User user) {

        return service.insert(user);

    }
}
package com.example._04mybatis.service;

import com.example._04mybatis.domain.User;

import java.util.List;

/**
 * @Package: com.example._04mybatis.service
 * @ClassName: IPersonService
 * @Description: <p>Description: </p>
 * @author: zq
 * @since: 2020/5/2 22:01
 * @version: 1.0
 * @Copyright: 2020 zq. All rights reserved.
 */
public interface IUserService {

    List<User> findAll();

    List<User> findSelect(int id);

    Integer insert(User user);
}
package com.example._04mybatis.service.impl;

import com.example._04mybatis.domain.User;
import com.example._04mybatis.mapper.UserMapper;
import com.example._04mybatis.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @Package: com.example._04mybatis.service.impl
 * @ClassName: PersonServiceImpl
 * @Description: <p>Description: </p>
 * @author: zq
 * @since: 2020/5/2 22:02
 * @version: 1.0
 * @Copyright: 2020 zq. All rights reserved.
 */
@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    UserMapper mapper;

    @Override
    public List<User> findAll() {
        return mapper.findAll();
    }

    @Override
    public List<User> findSelect(int id) {
        return mapper.findSelect(id);
    }

    @Transactional
    @Override
    public Integer insert(User user) {
        Integer insert = mapper.insert(user);
        int i = 1 / 0;
        return insert;
    }
}
package com.example._04mybatis.mapper;

import com.example._04mybatis.domain.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @Package: com.example._04mybatis.mapper
 * @ClassName: PersonMapper
 * @Description: <p>Description: </p>
 * @author: zq
 * @since: 2020/5/2 22:03
 * @version: 1.0
 * @Copyright: 2020 zq. All rights reserved.
 */
public interface UserMapper {

    List<User> findAll();

    List<User> findSelect(@Param("id") int id);

    Integer insert(User user);

}
<?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.example._04mybatis.mapper.UserMapper">

    <select id="findAll" resultType="com.example._04mybatis.domain.User">

        select * from user

    </select>

    <select id="findSelect" resultType="com.example._04mybatis.domain.User">

        select * from user where id=#{id}

    </select>

    <insert id="insert">
        
        insert into user (name,age)values (#{name},#{age})
        
    </insert>

</mapper>

二、在啓動類添加 @EnableTransactionManagement

package com.example._04mybatis;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
 * @Package: com.example._04mybatis
 * @ClassName: AppConfig
 * @Description: <p>Description: </p>
 * @author: zq
 * @since: 2020/5/2 22:13
 * @version: 1.0
 * @Copyright: 2020 zq. All rights reserved.
 */
@SpringBootApplication
@MapperScan("com.example.*.mapper")
@EnableTransactionManagement
public class AppConfig {

    public static void main(String[] args) {
        SpringApplication.run(AppConfig.class, args);
    }

}

三、驗證訪問http://localhost:8084/citic/insert?name=zhangqw&age=27

查看數據庫,並沒有插入數據。

此時將啓動類的@EnableTransactionManagement刪掉也是可以的,因爲springboot已經默認爲我們添加了這個註解。

2.使用xml配置

一、在resources下添加配置文件applicationContext-tx.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <tx:advice id="advice" transaction-manager="transactionManager">

        <tx:attributes>
            <tx:method name="list*" read-only="true"/>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="query*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>


    </tx:advice>
    <aop:config>

        <aop:pointcut id="pointCut" expression="execution(* com.example._04mybatis.service.impl.*.*(..))"/>
        <aop:advisor advice-ref="advice" pointcut-ref="pointCut"/>

    </aop:config>
</beans>

二、添加切面依賴

 <!--添加aop依賴,主要是爲了支持aspectJ表達式 begin-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <optional>true</optional>
        </dependency>
        <!--添加aop依賴,主要是爲了支持aspectJ表達式 end-->

三、啓動類引入配置文件並新建事務處理器

package com.example._04mybatis;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

/**
 * @Package: com.example._04mybatis
 * @ClassName: AppConfig
 * @Description: <p>Description: </p>
 * @author: zq
 * @since: 2020/5/2 22:13
 * @version: 1.0
 * @Copyright: 2020 zq. All rights reserved.
 */
@SpringBootApplication
@MapperScan("com.example.*.mapper")
//@EnableTransactionManagement
@ImportResource("classpath:applicationContext-tx.xml")
public class AppConfig {

    @Bean("transactionManager")
    public PlatformTransactionManager transactionManager(DataSource dataSource) {

        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return transactionManager;


    }

    public static void main(String[] args) {
        SpringApplication.run(AppConfig.class, args);
    }

}

四、此時將service實現類的@Transactional去掉後,跟方法一的實現效果是一樣的。

五、此時你可能發現applicationContext-tx.xml的transactionManager是紅色的,是因爲idea並沒有找到啓動類的事務管理器。

此時,做以下操作即可。

將啓動類和配置文件關聯在一起,他們就彼此知道對方的存在了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章