spring与ibatis的整合及多数据库连接
2013-02-14 17:14
507 查看
最近在家里整理书籍,看到一本《Spring in Action》,基于手头上的项目都不是很大,基本上都没有使用Spring,都快忘差不多了,所以写了个Spring与ibatis整合的小例子,权当练手之作,废话少说
DAO类
[java] view
plaincopy
public interface UserDao {
public void addUser(String userName);
public void delUser(String userName);
public void editUser(String userName);
public List getUser(String userName);
}
DAOImpl 实现接口类
[java] view
plaincopy
public class UserImpl extends SqlMapClientDaoSupport implements UserDao{
@Override
public void addUser(String userName) {
// TODO Auto-generated method stub
System.out.println("=======添加用户"+userName);
UserModel userModel = new UserModel();
userModel.setLoginName("spring");
userModel.setPasswd("123");
userModel.setUserName(userName);
getSqlMapClientTemplate().insert("insertObject",userModel);
//第二条测试数据
UserModel userModel2 = new UserModel();
userModel2.setLoginName("spring");
userModel2.setPasswd("123");
userModel2.setUserName(userName+"这是一个测试用户,用来测试spring的事务回滚,如果该数据不能插入进去,那么上面的插入也不会执行成功");
getSqlMapClientTemplate().insert("insertObject",userModel2);
}
@Override
public void delUser(String userName) {
// TODO Auto-generated method stub
System.out.println("=======删除用户");
}
@Override
public void editUser(String userName) {
// TODO Auto-generated method stub
System.out.println("=======编辑用户");
}
@Override
public List getUser(String userName) {
// TODO Auto-generated method stub
System.out.println("=======查询用户");
return getSqlMapClientTemplate().queryForList("getAllUser");
}
}
注意 public class UserImpl extends SqlMapClientDaoSupport implements UserDao
大家应该在这个类中的addUser方法中可以看到//第二条测试数据 这段代码,其中我在serModel2.setUserName()方法中传了一个很长的用户名参数,这参数的长度已经大于数据库中字段给定的大小,这里就是为了测试事务回滚的。当然,这只是个测试程序,实际应用中,这段代码应该是放到Service层中的
Service层
[java]
view plaincopy
public class UserServices {
//此处因为在spring中注入了userImpl
public UserDao userDao;
//必须set
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/**
* 若没有action 则在services里面抛异常,在Dao里面设置事务,
* 有action 则在services里面设置事务,在Action抛异常
* 事务和异常不能在一个类里面
*/
public void addUser() {
try {
userDao.addUser("张三");
}catch(RuntimeException e){
System.out.println("出错");
}
}
public List getUser() {
return userDao.getUser("张三");
}
}
若没有action 则在services里面抛异常,在Dao里面设置事务, 有action 则在services里面设置事务,在Action抛异常。不然Spring不会实现事务的回滚
userSql.xml ibatis的配置文件,非常简单
[xhtml]
view plaincopy
<!-- insert one data -->
<insert id="insertObject" parameterClass="user">
INSERT INTO sys_user(
loginName,
userName,
passwd)
VALUES (
#loginName#,
#userName#,
#passwd#)
</insert>
SqlMapConfig.xml ibatis的配置文件
[xhtml] view
plaincopy
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<sqlMap resource="user/sql/UserSql.xml"/>
</sqlMapConfig>
因为使用了Spring对Ibatis进行管理,所以这里的配置很简单,至于数据库地址的配置这一块,将在下面列出
ServiceFactory 类,这个文件主要是用于测试程序的
[java]
view plaincopy
package util;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import user.services.UserServices;
public class ServiceFactory {
private static BeanFactory factory = null;
static {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml"});
// ApplicationContext context =
// new ClassPathXmlApplicationContext("applicationContext.xml");
factory = (BeanFactory) context;
}
/**
* 获得用户服务类
* @return 用户服务
*/
public static UserServices getUserInfoDAO(){
return (UserServices) factory.getBean("userServices");
}
/**
* 获得用户服务类
* @return 用户服务
*/
public static UserServices getUserInfoDAO1(){
return (UserServices) factory.getBean("userServices1");
}
}
因为applicationContext.xml文件是放在src的根目录下,所以这边只用填写applicationContext.xml即可
applicationContext.xml Spring的配置文件,也是整合的关键地方,这里添加了多个数据库的支持,数据库分别是MySql和SQLite
[xhtml] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:properties/database.properties"/>
</bean>
<!-- =========================transactionManager========================= -->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>userDao</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<value>transactionInterceptor2</value>
</list>
</property>
</bean>
<!-- =================== 配置1 ========================== -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${mysql.driverClassName}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</bean>
<!-- ================================= 事务处理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-SQLException</prop>
<prop key="del*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="edit*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 读取ibatis配置文件 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- =================== 配置2 ========================== -->
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${sqlite.driverClassName}"/>
<property name="url" value="${sqlite.url}"/>
<property name="username" value="${sqlite.username}"/>
<property name="password" value="${sqlite.password}"/>
</bean>
<!-- ================================= 事务处理2 -->
<bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource2"/>
</bean>
<bean id="transactionInterceptor2" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager2"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="del*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="edit*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 读取ibatis配置文件2 -->
<bean id="sqlMapClient2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource2" />
</bean>
<!-- ============ 调用示例 ================ -->
<!-- 实现层1 -->
<bean id="userDao" class="user.dao.UserImpl">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>
<!-- 服务层的注入1 -->
<bean id="userServices" class="user.services.UserServices">
<property name="userDao" ref="userDao" />
</bean>
<!-- 实现层2 -->
<bean id="userDao1" class="user.dao.UserImpl">
<property name="sqlMapClient" ref="sqlMapClient2"/>
</bean>
<!-- 服务层的注入2 -->
<bean id="userServices1" class="user.services.UserServices">
<property name="userDao" ref="userDao1" />
</bean>
</beans>
这里使用了自动事务处理的方法,配置1为MySql的,配置2为SQLite的
整体来说,Spring和ibatis的整合还是很简单的,只要了解了Spring的基本使用,理解了上面的几个需要注意的地方,整合工作就会很简单了,上面的代码中有很多不规范的地方,大家在做整合的过程中一定要严格注意Service层和DAO层的区别,比如说我这里在做对数据库添加用户信息的时候,这一段代码严格意义上来讲,应该放到Service层的。
还有需要说明的是
若没有action 则在services里面抛异常,在Dao里面设置事务, 有action 则在services里面设置事务,在Action抛异常。不然Spring不会实现事务的回滚
DAO类
[java] view
plaincopy
public interface UserDao {
public void addUser(String userName);
public void delUser(String userName);
public void editUser(String userName);
public List getUser(String userName);
}
DAOImpl 实现接口类
[java] view
plaincopy
public class UserImpl extends SqlMapClientDaoSupport implements UserDao{
@Override
public void addUser(String userName) {
// TODO Auto-generated method stub
System.out.println("=======添加用户"+userName);
UserModel userModel = new UserModel();
userModel.setLoginName("spring");
userModel.setPasswd("123");
userModel.setUserName(userName);
getSqlMapClientTemplate().insert("insertObject",userModel);
//第二条测试数据
UserModel userModel2 = new UserModel();
userModel2.setLoginName("spring");
userModel2.setPasswd("123");
userModel2.setUserName(userName+"这是一个测试用户,用来测试spring的事务回滚,如果该数据不能插入进去,那么上面的插入也不会执行成功");
getSqlMapClientTemplate().insert("insertObject",userModel2);
}
@Override
public void delUser(String userName) {
// TODO Auto-generated method stub
System.out.println("=======删除用户");
}
@Override
public void editUser(String userName) {
// TODO Auto-generated method stub
System.out.println("=======编辑用户");
}
@Override
public List getUser(String userName) {
// TODO Auto-generated method stub
System.out.println("=======查询用户");
return getSqlMapClientTemplate().queryForList("getAllUser");
}
}
注意 public class UserImpl extends SqlMapClientDaoSupport implements UserDao
大家应该在这个类中的addUser方法中可以看到//第二条测试数据 这段代码,其中我在serModel2.setUserName()方法中传了一个很长的用户名参数,这参数的长度已经大于数据库中字段给定的大小,这里就是为了测试事务回滚的。当然,这只是个测试程序,实际应用中,这段代码应该是放到Service层中的
Service层
[java]
view plaincopy
public class UserServices {
//此处因为在spring中注入了userImpl
public UserDao userDao;
//必须set
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/**
* 若没有action 则在services里面抛异常,在Dao里面设置事务,
* 有action 则在services里面设置事务,在Action抛异常
* 事务和异常不能在一个类里面
*/
public void addUser() {
try {
userDao.addUser("张三");
}catch(RuntimeException e){
System.out.println("出错");
}
}
public List getUser() {
return userDao.getUser("张三");
}
}
若没有action 则在services里面抛异常,在Dao里面设置事务, 有action 则在services里面设置事务,在Action抛异常。不然Spring不会实现事务的回滚
userSql.xml ibatis的配置文件,非常简单
[xhtml]
view plaincopy
<!-- insert one data -->
<insert id="insertObject" parameterClass="user">
INSERT INTO sys_user(
loginName,
userName,
passwd)
VALUES (
#loginName#,
#userName#,
#passwd#)
</insert>
SqlMapConfig.xml ibatis的配置文件
[xhtml] view
plaincopy
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<sqlMap resource="user/sql/UserSql.xml"/>
</sqlMapConfig>
因为使用了Spring对Ibatis进行管理,所以这里的配置很简单,至于数据库地址的配置这一块,将在下面列出
ServiceFactory 类,这个文件主要是用于测试程序的
[java]
view plaincopy
package util;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import user.services.UserServices;
public class ServiceFactory {
private static BeanFactory factory = null;
static {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"applicationContext.xml"});
// ApplicationContext context =
// new ClassPathXmlApplicationContext("applicationContext.xml");
factory = (BeanFactory) context;
}
/**
* 获得用户服务类
* @return 用户服务
*/
public static UserServices getUserInfoDAO(){
return (UserServices) factory.getBean("userServices");
}
/**
* 获得用户服务类
* @return 用户服务
*/
public static UserServices getUserInfoDAO1(){
return (UserServices) factory.getBean("userServices1");
}
}
因为applicationContext.xml文件是放在src的根目录下,所以这边只用填写applicationContext.xml即可
applicationContext.xml Spring的配置文件,也是整合的关键地方,这里添加了多个数据库的支持,数据库分别是MySql和SQLite
[xhtml] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:properties/database.properties"/>
</bean>
<!-- =========================transactionManager========================= -->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>userDao</value>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
<value>transactionInterceptor2</value>
</list>
</property>
</bean>
<!-- =================== 配置1 ========================== -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${mysql.driverClassName}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</bean>
<!-- ================================= 事务处理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-SQLException</prop>
<prop key="del*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="edit*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 读取ibatis配置文件 -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- =================== 配置2 ========================== -->
<bean id="dataSource2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${sqlite.driverClassName}"/>
<property name="url" value="${sqlite.url}"/>
<property name="username" value="${sqlite.username}"/>
<property name="password" value="${sqlite.password}"/>
</bean>
<!-- ================================= 事务处理2 -->
<bean id="transactionManager2" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource2"/>
</bean>
<bean id="transactionInterceptor2" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager2"/>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="del*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="edit*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 读取ibatis配置文件2 -->
<bean id="sqlMapClient2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource2" />
</bean>
<!-- ============ 调用示例 ================ -->
<!-- 实现层1 -->
<bean id="userDao" class="user.dao.UserImpl">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>
<!-- 服务层的注入1 -->
<bean id="userServices" class="user.services.UserServices">
<property name="userDao" ref="userDao" />
</bean>
<!-- 实现层2 -->
<bean id="userDao1" class="user.dao.UserImpl">
<property name="sqlMapClient" ref="sqlMapClient2"/>
</bean>
<!-- 服务层的注入2 -->
<bean id="userServices1" class="user.services.UserServices">
<property name="userDao" ref="userDao1" />
</bean>
</beans>
这里使用了自动事务处理的方法,配置1为MySql的,配置2为SQLite的
整体来说,Spring和ibatis的整合还是很简单的,只要了解了Spring的基本使用,理解了上面的几个需要注意的地方,整合工作就会很简单了,上面的代码中有很多不规范的地方,大家在做整合的过程中一定要严格注意Service层和DAO层的区别,比如说我这里在做对数据库添加用户信息的时候,这一段代码严格意义上来讲,应该放到Service层的。
还有需要说明的是
若没有action 则在services里面抛异常,在Dao里面设置事务, 有action 则在services里面设置事务,在Action抛异常。不然Spring不会实现事务的回滚
相关文章推荐
- spring与ibatis的整合及多数据库连接的解决方案
- 【SSH (六)】struts2 整合 spring 并 连接数据库
- SSi(spring+struts_ibatis)多数据库连接解决方案
- Spring整合jpa连接Oracle数据库向数据库中自动添加实体类表出现NullPointerException
- spring+springmvc+ibatis整合注解方式实例(附带数据库)
- Activemq Spring 嵌入整合及通过数据库来验证连接权限
- 重温SSH小项目实践(2)--Ibatis与Spring配置数据库连接
- 重温SSH小项目实践(2)--Ibatis与Spring配置数据库连接
- spring整合mybatis 报错无法连接数据库
- Spring连接数据库整合-实例
- java连接数据库方式(三):MyBatis 与Spring整合
- Spring连接数据库整合-实例
- 结合iBATIS在Spring中配置数据库连接,事务管理
- 【Spring】整合JDBC连接数据库
- hibernate和spring整合时出现的数据库连接问题
- Spring-Mybatis整合时,无法连接数据库,Cannot create PoolableConnectionFactory
- hibernate和spring整合时,把连接数据库的信息单独提出一个文件的方法
- spring+springmvc+mybatis整合连接不上数据库,求大神帮忙
- spring与hibernate整合-使用properties文件分离数据库连接设置
- Spring连接数据库整合-实例