【Spring 框架(自学)】Day07(事务管理)已完结--2022/4/8
Spring的事务注解管理(事务管理)
Spring开启事务,只适合中小型项目的开发,有两大步骤:
- 声明事务管理器:DataSourceTransactionManager
- 连接数据库,指定数据源(事务的提交回滚)
- 开启事务注解驱动:annotation-driven(导入后缀为tx的)
- 传入事务管理器的id
//定义实体类映射数据库
//定义持久层Dao接口,书写方法
<!--用Mybatis映射持久层实现方法-->
//定义业务层Service接口,定义接口实现类
<!--配置Spring容器-->
<!-- 1 .声明database配置文件:property-placeholder-->
<!-- 2 .声明数据源,连接数据库 :DruidDataSource
<!--声明数据库连接的信息:property
<!--数据库最大连接数:property
-->
<!-- 3 .声明SqlSessionFactory:SqlSessionFactoryBean
3.1 传入数据源:dataSource
3.2 mybatis配置文件交给spring容器管理:configLocation
-->
<!-- 4 .将持久层(Dao)交给Spring容器管理,创建Mapper对象:MapperScannerConfigurer
4.1 传入SqlSession,得到getMapper()方法:sqlSessionFactoryBeanName
4.2 指定持久层(Dao)所在的包名,并为每个Mapper创建对象:basePackage
MapperScannerConfigurer属性:会为所有Dao层接口执行getMapper()方法
-->
<!-- 5 .创建Service对象,将Dao层对象赋予给Service层:property
实现功能、层级的分离
-->
<!--声明事务管理器对象:DataSourceTransactionManager-->
<bean id = "tranSactionManager" class = "...DataSourceTransactionManager">
<!--传入数据源:dataSource-->
</bean>
<!--开启事务注解驱动-->
<tx:annotation-driven transaction-manager="传入声明事务管理器对象"></tx:annotation-driven>
//Service接口实现类在public上加入注解
/*
@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.DEFAULT,
readOnly = false,
rollbackFor = {
NullPointerException.class,Exception.class
}
)
*/
//@Transactional
@Override
public void buyGoods(Integer id, Integer nums) {
//购买商品
Sale sale = new Sale();
sale.setGid(id);
sale.setNums(nums);
saleMapper.insertSale(sale);
//对商品进行查询 让后进行更新
Goods goods = goodsMapper.selectGoods(id);
if (goods == null){
throw new NullPointerException(id+"商品不存在");
}else if (goods.getAmount() < nums){
throw new Exception(id+"商品数量不足");
}
Goods buyGoods = new Goods();
buyGoods.setId(id);
buyGoods.setAmount(nums);
goodsMapper.updateGoods(buyGoods);
}
AspectJ的事务注解管理(事务管理)
/*
省略Spring容器配置之前的所有配置,同上,无任何改变
*/
<!--配置Spring容器-->
<!--声明事务管理器对象:DataSourceTransactionManager-->
<bean id = "transactionmanager" class = "...DataSourceTransactionManager"></bean>
<!--开启事务注解驱动-->
<tx:advice id = "myAdvice" transaction-manager="传入声明事务管理器对象">
<!--配置事务的属性-->
<tx:attributes>
<!--给具体方法配置事务,且method可以拥有多个
name:完整的方法名称,也可以用通配符*代替
propagation:传播行为
isolation:隔离级别
rollback-for:你指定的异常类名(全限定类名),遇到异常时回滚
-->
<tx:method name = "方法名" propagation="REQUIRED" isolation="DEFAULT"
rollback-for="java.lang.NullPointerException,com.springexer.Except.Exception"> </tx:method>
</tx:attributes>
</tx:advice>
<!--配置aop((Aspect注解方法)-->
<aop:config>
<!--找到文件所在地
com.xx.service
com.xxx.service
com.service
-->
<aop:pointcut id="myPt" expression="execution(* *..Service.*.*(..))"/>
<!--配置增强器:关联advice和pointcut
advice-ref:绑定事务注解驱动
pointcut-ref:切入点表达式的id
-->
<aop:advisor advice-ref="myAdvice" pointcut-ref="myPt"></aop:advisor>
</aop:config>
Spring集成Mybatis与Web
回头再看
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?