1.spring-mybatis.xml加入配置
<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" />
2.实例
1)Dao层
UserDao
@Repository public interface UserDao { User qryById(Long id); List<User> pageUser(@Param("name")String name,Page<User> page); int add(User user); }
UserMapper:设置自增主键=》useGeneratedKeys="true" keyProperty="id"
<insert id="add" useGeneratedKeys="true" keyProperty="id"> INSERT INTO USER(<include refid="commonColumns"/>) VALUES (#{id},#{name},#{birthday}) </insert>
2)Service层
注意项:
- 事务回滚是根据抛出运行时异常(RuntimeException)进行回滚。
- 如果自定义异常DemoException是非运行时异常,也需进行回滚,则需要在@Transactional注解加入rollbackFor指定需回滚的异常。
- 因为事务配置在Service层,所以在Service层不要进行异常捕获,否则会造成事务无法回滚;若代码中必须要捕获,请捕获后再次抛出异常,以此让事务回滚。
UserService
@Transactional(rollbackFor = DemoException.class) public Boolean add(User user) throws DemoException{ int count = userDao.add(user); if(count != 1){ throw new DemoException("数据库更新不为1"); } LOGGER.info("新增user主键id=>{}",user.getId()); if(1 == 1) { throw new DemoException("测试事务事务是否回滚"); } return true; }
3)Controller层
UserController
@RequestMapping("add") @ResponseBody public Boolean add(User user) throws DemoException{ return userService.add(user); }
4)model对象
User:在set日期方法上加入DateTimeFormat格式化
@DateTimeFormat(pattern = "yyyy-MM-dd") public void setBirthday(Date birthday) { this.birthday = birthday; }
3.工程源码地址
https://github.com/BAN-WANG/demo