`
king_tt
  • 浏览: 2124601 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring与ibatis的整合及多数据库连接

 
阅读更多

最近在家里整理书籍,看到一本《Spring in Action》,基于手头上的项目都不是很大,基本上都没有使用Spring,都快忘差不多了,所以写了个Spring与ibatis整合的小例子,权当练手之作,废话少说

DAO类

  1. publicinterfaceUserDao{
  2. publicvoidaddUser(StringuserName);
  3. publicvoiddelUser(StringuserName);
  4. publicvoideditUser(StringuserName);
  5. publicListgetUser(StringuserName);
  6. }

DAOImpl 实现接口类


  1. publicclassUserImplextendsSqlMapClientDaoSupportimplementsUserDao{
  2. @Override
  3. publicvoidaddUser(StringuserName){
  4. //TODOAuto-generatedmethodstub
  5. System.out.println("=======添加用户"+userName);
  6. UserModeluserModel=newUserModel();
  7. userModel.setLoginName("spring");
  8. userModel.setPasswd("123");
  9. userModel.setUserName(userName);
  10. getSqlMapClientTemplate().insert("insertObject",userModel);
  11. //第二条测试数据
  12. UserModeluserModel2=newUserModel();
  13. userModel2.setLoginName("spring");
  14. userModel2.setPasswd("123");
  15. userModel2.setUserName(userName+"这是一个测试用户,用来测试spring的事务回滚,如果该数据不能插入进去,那么上面的插入也不会执行成功");
  16. getSqlMapClientTemplate().insert("insertObject",userModel2);
  17. }
  18. @Override
  19. publicvoiddelUser(StringuserName){
  20. //TODOAuto-generatedmethodstub
  21. System.out.println("=======删除用户");
  22. }
  23. @Override
  24. publicvoideditUser(StringuserName){
  25. //TODOAuto-generatedmethodstub
  26. System.out.println("=======编辑用户");
  27. }
  28. @Override
  29. publicListgetUser(StringuserName){
  30. //TODOAuto-generatedmethodstub
  31. System.out.println("=======查询用户");
  32. returngetSqlMapClientTemplate().queryForList("getAllUser");
  33. }
  34. }

注意public class UserImplextends SqlMapClientDaoSupport implements UserDao

大家应该在这个类中的addUser方法中可以看到//第二条测试数据 这段代码,其中我在serModel2.setUserName()方法中传了一个很长的用户名参数,这参数的长度已经大于数据库中字段给定的大小,这里就是为了测试事务回滚的。当然,这只是个测试程序,实际应用中,这段代码应该是放到Service层中的


Service层

  1. publicclassUserServices{
  2. //此处因为在spring中注入了userImpl
  3. publicUserDaouserDao;
  4. //必须set
  5. publicvoidsetUserDao(UserDaouserDao){
  6. this.userDao=userDao;
  7. }
  8. /**
  9. *若没有action则在services里面抛异常,在Dao里面设置事务,
  10. *有action则在services里面设置事务,在Action抛异常
  11. *事务和异常不能在一个类里面
  12. */
  13. publicvoidaddUser(){
  14. try{
  15. userDao.addUser("张三");
  16. }catch(RuntimeExceptione){
  17. System.out.println("出错");
  18. }
  19. }
  20. publicListgetUser(){
  21. returnuserDao.getUser("张三");
  22. }
  23. }

若没有action 则在services里面抛异常,在Dao里面设置事务,有action 则在services里面设置事务,在Action抛异常。不然Spring不会实现事务的回滚

userSql.xml ibatis的配置文件,非常简单

  1. <!--insertonedata-->
  2. <insertid="insertObject"parameterClass="user">
  3. INSERTINTOsys_user(
  4. loginName,
  5. userName,
  6. passwd)
  7. VALUES(
  8. #loginName#,
  9. #userName#,
  10. #passwd#)
  11. </insert>

SqlMapConfig.xml ibatis的配置文件

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEsqlMapConfig
  3. PUBLIC"-//ibatis.apache.org//DTDSQLMapConfig2.0//EN"
  4. "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
  5. <sqlMapConfig>
  6. <sqlMapresource="user/sql/UserSql.xml"/>
  7. </sqlMapConfig>

因为使用了Spring对Ibatis进行管理,所以这里的配置很简单,至于数据库地址的配置这一块,将在下面列出

ServiceFactory 类,这个文件主要是用于测试程序的

  1. packageutil;
  2. importorg.springframework.beans.factory.BeanFactory;
  3. importorg.springframework.context.support.ClassPathXmlApplicationContext;
  4. importuser.services.UserServices;
  5. publicclassServiceFactory{
  6. privatestaticBeanFactoryfactory=null;
  7. static{
  8. ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext(
  9. newString[]{"applicationContext.xml"});
  10. //ApplicationContextcontext=
  11. //newClassPathXmlApplicationContext("applicationContext.xml");
  12. factory=(BeanFactory)context;
  13. }
  14. /**
  15. *获得用户服务类
  16. *@return用户服务
  17. */
  18. publicstaticUserServicesgetUserInfoDAO(){
  19. return(UserServices)factory.getBean("userServices");
  20. }
  21. /**
  22. *获得用户服务类
  23. *@return用户服务
  24. */
  25. publicstaticUserServicesgetUserInfoDAO1(){
  26. return(UserServices)factory.getBean("userServices1");
  27. }
  28. }

因为applicationContext.xml文件是放在src的根目录下,所以这边只用填写applicationContext.xml即可

applicationContext.xml Spring的配置文件,也是整合的关键地方,这里添加了多个数据库的支持,数据库分别是MySql和SQLite

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8. http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  9. http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  10. <beanid="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  11. <propertyname="location"value="classpath:properties/database.properties"/>
  12. </bean>
  13. <!--=========================transactionManager=========================-->
  14. <beanid="autoProxyCreator"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  15. <propertyname="beanNames">
  16. <value>userDao</value>
  17. </property>
  18. <propertyname="interceptorNames">
  19. <list>
  20. <value>transactionInterceptor</value>
  21. <value>transactionInterceptor2</value>
  22. </list>
  23. </property>
  24. </bean>
  25. <!--===================配置1==========================-->
  26. <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
  27. <propertyname="driverClassName"value="${mysql.driverClassName}"/>
  28. <propertyname="url"value="${mysql.url}"/>
  29. <propertyname="username"value="${mysql.username}"/>
  30. <propertyname="password"value="${mysql.password}"/>
  31. </bean>
  32. <!--=================================事务处理-->
  33. <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  34. <propertyname="dataSource"ref="dataSource"/>
  35. </bean>
  36. <beanid="transactionInterceptor"class="org.springframework.transaction.interceptor.TransactionInterceptor">
  37. <propertyname="transactionManager"ref="transactionManager"/>
  38. <propertyname="transactionAttributes">
  39. <props>
  40. <propkey="add*">PROPAGATION_REQUIRED,-SQLException</prop>
  41. <propkey="del*">PROPAGATION_REQUIRED,-Exception</prop>
  42. <propkey="edit*">PROPAGATION_REQUIRED,-Exception</prop>
  43. <propkey="get*">PROPAGATION_REQUIRED,readOnly</prop>
  44. </props>
  45. </property>
  46. </bean>
  47. <!--读取ibatis配置文件-->
  48. <beanid="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  49. <propertyname="configLocation"value="classpath:SqlMapConfig.xml"/>
  50. <propertyname="dataSource"ref="dataSource"/>
  51. </bean>
  52. <!--===================配置2==========================-->
  53. <beanid="dataSource2"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
  54. <propertyname="driverClassName"value="${sqlite.driverClassName}"/>
  55. <propertyname="url"value="${sqlite.url}"/>
  56. <propertyname="username"value="${sqlite.username}"/>
  57. <propertyname="password"value="${sqlite.password}"/>
  58. </bean>
  59. <!--=================================事务处理2-->
  60. <beanid="transactionManager2"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  61. <propertyname="dataSource"ref="dataSource2"/>
  62. </bean>
  63. <beanid="transactionInterceptor2"class="org.springframework.transaction.interceptor.TransactionInterceptor">
  64. <propertyname="transactionManager"ref="transactionManager2"/>
  65. <propertyname="transactionAttributes">
  66. <props>
  67. <propkey="add*">PROPAGATION_REQUIRED,-Exception</prop>
  68. <propkey="del*">PROPAGATION_REQUIRED,-Exception</prop>
  69. <propkey="edit*">PROPAGATION_REQUIRED,-Exception</prop>
  70. <propkey="get*">PROPAGATION_REQUIRED,readOnly</prop>
  71. </props>
  72. </property>
  73. </bean>
  74. <!--读取ibatis配置文件2-->
  75. <beanid="sqlMapClient2"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  76. <propertyname="configLocation"value="classpath:SqlMapConfig.xml"/>
  77. <propertyname="dataSource"ref="dataSource2"/>
  78. </bean>
  79. <!--============调用示例================-->
  80. <!--实现层1-->
  81. <beanid="userDao"class="user.dao.UserImpl">
  82. <propertyname="sqlMapClient"ref="sqlMapClient"/>
  83. </bean>
  84. <!--服务层的注入1-->
  85. <beanid="userServices"class="user.services.UserServices">
  86. <propertyname="userDao"ref="userDao"/>
  87. </bean>
  88. <!--实现层2-->
  89. <beanid="userDao1"class="user.dao.UserImpl">
  90. <propertyname="sqlMapClient"ref="sqlMapClient2"/>
  91. </bean>
  92. <!--服务层的注入2-->
  93. <beanid="userServices1"class="user.services.UserServices">
  94. <propertyname="userDao"ref="userDao1"/>
  95. </bean>
  96. </beans>

这里使用了自动事务处理的方法,配置1为MySql的,配置2为SQLite的

整体来说,Spring和ibatis的整合还是很简单的,只要了解了Spring的基本使用,理解了上面的几个需要注意的地方,整合工作就会很简单了,上面的代码中有很多不规范的地方,大家在做整合的过程中一定要严格注意Service层和DAO层的区别,比如说我这里在做对数据库添加用户信息的时候,这一段代码严格意义上来讲,应该放到Service层的。

还有需要说明的是

若没有action 则在services里面抛异常,在Dao里面设置事务,有action 则在services里面设置事务,在Action抛异常。不然Spring不会实现事务的回滚


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics