在上篇文章https://blog.csdn.net/u012045045/article/details/105897047 的基礎上繼續。
有2種方法:
目錄
1.在service實現類上添加@Transactional
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已經默認爲我們添加了這個註解。
一、在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並沒有找到啓動類的事務管理器。
此時,做以下操作即可。
將啓動類和配置文件關聯在一起,他們就彼此知道對方的存在了。