这篇文章主要介绍了春天实战之使用TransactionProxyFactoryBean实现声明式事务操作,结合实例形式分析了春天使用TransactionProxyFactoryBean实现声明式事务相关配置、接口设置与使用技巧,需要的朋友可以参考下
本文实例讲述了春天实战之使用TransactionProxyFactoryBean实现声明式事务操作。分享给大家供大家参考,具体如下:
一 配置文件
?可扩展标记语言版本=1.0 编码=GBK ?
bean xmlns:xsi= http://www。w3。 org/2001/XML架构-实例
xmlns= http://www。spring框架。组织/架构/bean
xmlns:p= http://www。spring框架。组织/架构/p
xsi:架构位置= http://www。spring框架。组织/模式/bean
http://www。spring框架。org/schema/beans/spring-beans-4.0。xsd
!-定义数据源豆子,使用C3P0数据源实现,并注入数据源的必要信息-
bean id= data source class= com。m零钱。v2。c3p 0。“组合工具栏数据源”
destroy-method=close
司机:司机。MySQL。JDBC。“司机”
p:JDBC URL= JDBC:MySQL://localhost/spring
p:user=root
密码=32147
p:maxPoolSize=40
p:minPoolSize=2
p:initialPoolSize=2
p:maxIdleTime=30/
!-配置JDBC数据源的局部事务管理器,使用数据源事务管理器类-
!-该类实现PlatformTransactionManager接口,是针对采用数据源连接的特定实现-
!-配置数据源事务管理器时需要依注入数据源的引用-
bean id=transactionManager
org。spring框架。JDBC。数据来源。数据源事务管理器
p:dataSource-ref=dataSource/
!-配置一个业务逻辑豆子-
bean id= newsDao class= org。疯狂吧。app。道。impl。新闻导报
p:ds-ref=dataSource/
!-为业务逻辑豆配置事务代理
transactionManager用于为配置事务代理注入所需的事务管理器
目标用于指定为哪个豆配置事务代理-
bean id=newsDaoTrans class=
org。spring框架。交易。截击机。transactionproxyfactorybean
p:事务管理器-ref=事务管理器
p:target-ref=newsDao
!-指定事务属性-
属性名=事务属性
小道具
prop key= * PROPAGATION _ REQUIRED/prop
/道具
/属性
/bean
/豆子
二 DAO
一接口
包org。疯狂吧。app。道;
公共接口新闻岛
{
公共空插入(字符串标题,字符串内容);
}
2实现类
包org。疯狂吧。app。道。impl
导入javax。SQL。数据来源;
导入Java。SQL。连接;
导入org。spring框架。JDBC。核心。JDBC模板;
导入org。疯狂吧。app。道。*;
公共类新闻报实现新闻岛
{
私有数据源ds;
公共空集合(数据源集合)
{
this.ds=ds
}
公共空的插入(字符串标题、字符串内容)
{
JdbcTemplate jt=新JDBC模板;
jt.update(insert into news_inf
值(空,)
,标题,内容);
//两次插入的数据违反唯一键约束
jt.update(insert into news_inf
值(空,)
,标题,内容);
//如果没有事务控制,则第一条记录可以被插入
//如果增加事务控制,将发现第一条记录也插不进去。
}
}
三 测试类
包李;
导入org。spring框架。语境。支持。*;
导入org。spring框架。语境。*;
导入org。疯狂吧。app。道。*;
公共课程春季考试
{
公共静态void main(String[] args)
{
//创建春天容器
应用程序上下文ctx=新建
classpathmlaplicationcontext( bean。XML’);
//获取事务代理豆
新闻道道=(新闻道)ctx。getBean(newsDaoTrans ,newsdao。类);
//执行插入操作
dao.insert(疯狂Java ,轻量级Java EE企业应用实战);
}
}
四 测试
数据库中无数据,说明事务生效。
线程“主要”组织。spring框架。道。重复键异常中出现异常:PreparedStatementCallbackSQL[插入到news_inf值(空,)];重复条目疯狂关键字"新闻标题"的“Java”;嵌套异常是com。MySQL。JDBC。例外情况。JDBC 4。mysqltigrityconstraintviolationexception:重复条目疯狂关键字"新闻标题"的" Java "
位于org。spring框架。JDBC。支持。sqlerrorcodesqlexception转换器。do translate(sqlerrorcodesqlexception translator。Java:239)
位于org。spring框架。JDBC。支持。abstractfallbacksqlexceptiontranslator。translate(abstractfallbacksqlexceptiontranslator。Java:73)
位于org。spring框架。JDBC。核心。JDBC模板。执行(JDBC模板。Java:660)
位于org。spring框架。JDBC。核心。JDBC模板。更新(JDBC模板。Java:909)
位于org。spring框架。JDBC。核心。JDBC模板。更新(JDBC模板。Java:970)
位于org。spring框架。JDBC。核心。JDBC模板。更新(JDBC模板。Java:980)
位于org。疯狂吧。app。道。impl。newsdaoimpl。插入(newsdaoimpl。Java:33)
位于星期日反思。nativemethodaccessorimpl。调用0(本机方法)
位于星期日反思。nativemethodaccessorimpl。调用(nativemethodaccessorimpl。Java:62)
位于星期日反思。delegatingmethodaccessorimpl。调用(delegatingmethodaccessorimpl。Java:43)
位于Java。郎。反思。方法。调用(方法。Java:498)
位于org。spring框架。AOP。支持。奥普特利斯。invokejoinpointusingreflection(aoputils。Java:317)
位于org。spring框架。AOP。框架。反射方法调用。调用连接点(反射方法调用。Java:190)
位于org。spring框架。AOP。框架。反射方法调用。继续(反射方法调用。Java:157)
位于org。spring框架。交易。截击机。交易拦截器$1。proceedwithintiation(事务拦截器。Java:98)
位于org。spring框架。交易。截击机。transactionaspectsupport。invokewithtransaction(transactionaspectsupport。Java:262)
位于org。spring框架。交易。截击机。事务拦截器。调用(事务拦截器。Java:95)
位于org。spring框架。AOP。框架。反射方法调用。继续(反射方法调用。Java:179)
位于org。spring框架。AOP。框架。jdkdynamicaopproxy。调用(jdkdynamicaopproxy。Java:207)
at com.sun.proxy.$Proxy4.insert(未知来源)
在李springtest。main(springtest。Java:28)
导致原因:com。MySQL。JDBC。例外情况。JDBC 4。MySQL integrityconstraintviolationexception:重复条目疯狂关键字"新闻标题"的" Java "
位于星期日反思。nativeconstructoraccessorimpl。新实例0(本机方法)
位于星期日反思。nativestructoraccessorimpl。新实例(nativestructoraccessorimpl。Java:62)
位于星期日反思。delegatingconstructoraccessorimpl。新实例(delegatingconstructoraccessorimpl。Java:45)
位于Java。郎。反思。构造函数。新实例(构造函数。Java:423)
位于com。MySQL。JDBC。util。handlenewinstance(util。Java:409)
位于com。MySQL。JDBC。util。getinstance(util。Java:384)
位于com。MySQL。JDBC。SQL错误。createsql异常(sql错误。Java:1039)
位于com。MySQL。JDBC。mysqlio。checkerrorpacket(mysqlio。Java:4232)
位于com。MySQL。JDBC。mysqlio。checkerrorpacket(mysqlio。Java:4164)
位于com。MySQL。JDBC。mysqlio。发送命令(mysqlio。Java:2615)
位于com。MySQL。JDBC。mysqlio。sqlquerydirect(mysqlio。Java:2776)
位于com。MySQL。JDBC。连接实现。exec SQL(连接实现。Java:2838)
位于com。MySQL。JDBC。准备好的声明。执行内部(准备好的语句。Java:2082)
位于com。MySQL。JDBC。准备好的声明。执行update(预准备语句。Java:2334)
位于com。MySQL。JDBC。准备好的声明。执行update(预准备语句。Java:2262)
位于com。MySQL。JDBC。准备好的声明。执行update(预准备语句。Java:2246)
位于com。m零钱。v2。c3p 0。impl。newproxypreparedstatement。执行update(newproxypreparedstatement。Java:147)
位于org。spring框架。JDBC。核心。JDBC模板$2。doinpreparedstatement(JDBC模板。Java:916)
位于org。spring框架。JDBC。核心。JDBC模板$2。doinpreparedstatement(JDBC模板。Java:909)
位于org。spring框架。JDBC。核心。JDBC模板。执行(JDBC模板。Java:644)
.18更
更多对java相关内容感兴趣的读者,请查看我们的专题:《Spring框架入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》。
希望这篇文章对大家的java编程有所帮助。