spring与ibatis的整合及多数据库连接的解决方案

引用:http://blog.csdn.net/wjssbp/article/details/6347448

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

 

DAO类

 

[java] view plain copy
  1. public interface UserDao {  
  2.   public void addUser(String userName);  
  3.   public void delUser(String userName);  
  4.   public void editUser(String userName);  
  5.   public List getUser(String userName);  
  6. }  
 

 

DAOImpl 实现接口类


[java] view plain copy
  1. public class UserImpl extends SqlMapClientDaoSupport implements UserDao{  
  2.     @Override  
  3.     public void addUser(String userName) {  
  4.         // TODO Auto-generated method stub  
  5.         System.out.println("=======添加用户"+userName);  
  6.           
  7.         UserModel userModel = new UserModel();  
  8.         userModel.setLoginName("spring");  
  9.         userModel.setPasswd("123");  
  10.         userModel.setUserName(userName);  
  11.         getSqlMapClientTemplate().insert("insertObject",userModel);  
  12.           
  13.         //第二条测试数据  
  14.         UserModel userModel2 = new UserModel();  
  15.         userModel2.setLoginName("spring");  
  16.         userModel2.setPasswd("123");  
  17.         userModel2.setUserName(userName+"这是一个测试用户,用来测试spring的事务回滚,如果该数据不能插入进去,那么上面的插入也不会执行成功");  
  18.         getSqlMapClientTemplate().insert("insertObject",userModel2);  
  19.     }  
  20.     @Override  
  21.     public void delUser(String userName) {  
  22.         // TODO Auto-generated method stub  
  23.         System.out.println("=======删除用户");  
  24.     }  
  25.     @Override  
  26.     public void editUser(String userName) {  
  27.         // TODO Auto-generated method stub  
  28.         System.out.println("=======编辑用户");  
  29.     }  
  30.     @Override  
  31.     public List getUser(String userName) {  
  32.         // TODO Auto-generated method stub  
  33.         System.out.println("=======查询用户");  
  34.         return getSqlMapClientTemplate().queryForList("getAllUser");  
  35.     }  
  36. }  
 

注意 public class UserImplextends SqlMapClientDaoSupport implements UserDao

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


 

Service层

 

[java] view plain copy
  1. public class UserServices {  
  2.       
  3.     //此处因为在spring中注入了userImpl  
  4.     public UserDao userDao;  
  5.     //必须set  
  6.     public void setUserDao(UserDao userDao) {  
  7.         this.userDao = userDao;  
  8.     }  
  9.       
  10.     /** 
  11.      * 若没有action 则在services里面抛异常,在Dao里面设置事务, 
  12.      * 有action 则在services里面设置事务,在Action抛异常 
  13.      * 事务和异常不能在一个类里面 
  14.      */  
  15.     public void addUser() {  
  16.         try {  
  17.             userDao.addUser("张三");  
  18.         }catch(RuntimeException  e){  
  19.             System.out.println("出错");  
  20.         }  
  21.     }  
  22.       
  23.     public List getUser() {  
  24.         return userDao.getUser("张三");  
  25.     }  
  26. }  

 

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

 

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

 

[xhtml] view plain copy
  1.       
  2. <!-- insert one data -->  
  3.   <insert id="insertObject" parameterClass="user">  
  4.         INSERT INTO sys_user(  
  5.             loginName,  
  6.             userName,  
  7.             passwd)   
  8.         VALUES (  
  9.             #loginName#,  
  10.             #userName#,  
  11.             #passwd#)  
  12.     </insert>  

 

SqlMapConfig.xml ibatis的配置文件

 

[xhtml] view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE sqlMapConfig        
  3.     PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"        
  4.     "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">  
  5. <sqlMapConfig>  
  6.     <sqlMap resource="user/sql/UserSql.xml"/>  
  7. </sqlMapConfig>  
 

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

 

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

 

[java] view plain copy
  1. package util;  
  2. import org.springframework.beans.factory.BeanFactory;  
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  4. import user.services.UserServices;  
  5. public class ServiceFactory {  
  6.      private static BeanFactory factory = null;       
  7.      static {   
  8.              ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(   
  9.                            new String[] {"applicationContext.xml"});   
  10. //             ApplicationContext context =   
  11. //               new ClassPathXmlApplicationContext("applicationContext.xml");  
  12.              factory = (BeanFactory) context;   
  13.      }    
  14.        
  15.      /**  
  16.       * 获得用户服务类  
  17.       * @return 用户服务  
  18.       */   
  19.      public static UserServices getUserInfoDAO(){   
  20.              return (UserServices) factory.getBean("userServices");   
  21.      }   
  22.        
  23.      /**  
  24.       * 获得用户服务类  
  25.       * @return 用户服务  
  26.       */   
  27.      public static UserServices getUserInfoDAO1(){   
  28.              return (UserServices) factory.getBean("userServices1");   
  29.      }   
  30.        
  31.        
  32. }  

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

 

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

 

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

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

 

 

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

还有需要说明的是

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

你可能感兴趣的:(spring与ibatis的整合及多数据库连接的解决方案)