`
LiYunpeng
  • 浏览: 954966 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Spring 3.0 整合 iBatis 3 Beta10 配置

阅读更多
弄了好长时间了,上网找各种资料,文档,最后发现Spring 3.0 reference里头写到

Note
Spring supports iBATIS 2.x. The iBATIS 1.x support classes are no longer provided.

Spring 支持2.x 没有说支不支持3.X 那应该也就是不支持了 而且iBatis3还没有发布正式版本,还有就是iBatis发生了一些明显变化,jar包也缩减整合到一个jar包里面了,所以Spring 应该是暂时不支持iBatis3了。
经过几天的学习和查找,自己弄出来了一套,当然,俺不是啥高手,只是喜欢研究,研究的不对希望谅解,以下仅供参考:
以我的Flex工程为例

web.xml配置Spring监听 和2.x相同
ps:不知啥原因,Eclipse使用User library不管用,虽然导进来了,可是启动的时候提示ClassNotFoundException,最开始还纳闷,后来直接复制到lib文件夹下了。

	<!-- Spring param Config -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			com/citipf/liyunpeng/applicationContext*.xml
		</param-value>
	</context-param>

	<!-- Spring Listener Config -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>


applicationContext.xml 为了省事,这里就都写到一个配置文件里
.properties 读取配置文件
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>/com/citipf/liyunpeng/mainConfig.properties</value>
			</list>
		</property>
	</bean>


C3P0连接池配置
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
		<property name="driverClass"><value>${jdbc.driverClass}</value></property>
		<property name="jdbcUrl"><value>${jdbc.url}</value></property>
		<property name="user"><value>${jdbc.user}</value></property>
		<property name="password"><value>${jdbc.password}</value></property>
		<property name="initialPoolSize"><value>${jdbc.initialPoolSize}</value></property>
		<property name="minPoolSize"><value>${jdbc.minPoolSize}</value></property>
		<property name="maxPoolSize"><value>${jdbc.maxPoolSize}</value></property>
	</bean>

正常数据源配置
<!-- 
	 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
		<property name="driverClassName">
            <value>${jdbc.driverClass}</value>
        </property>
        <property name="url">
            <value>${jdbc.url}</value>
        </property>
        <property name="username">
            <value>${jdbc.user}</value>
        </property>
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
	 </bean>
	 -->

iBatis 配置  (Java文件在下面)
	<bean id="sqlMapClient" 
		class="com.citipf.liyunpeng.dao.iBatis.SqlSessionFactoryBean">
		<property name="configLocation" value="/com/citipf/liyunpeng/ibatisConfig.xml"></property>
		<property name="dataSource" ref="dataSource"></property>
	</bean>

Dao 以及 Service
<bean id="stockDaoImpl" class="com.citipf.liyunpeng.dao.iBatis.StockDaoImpl">
		<property name="sqlSessionFactory" ref="sqlMapClient" />
	</bean>
	
	<!-- Service -->
	<bean id="citiService" class="com.citipf.liyunpeng.CitiPFService">
		<property name="stockDao" ref="stockDaoImpl" />
	</bean>

-----------------------Java代码---------------------------------
由于Spring3.0并不支持iBatis 3所以,使用iBatis2的
org.springframework.orm.ibatis.SqlMapClientFactoryBean配置方式Spring会去找iBatis2中支持的类,则会出现ClassNotFoundException(明确查过7z l *.jar >iBatisJarFiles.txt,iBatis3确实没有相应的类)
所以需要自己来重写SqlSessionFactory和DaoSupport,而不是使用
org.springframework.orm.ibatis.SqlMapClientFactoryBean
org.springframework.orm.ibatis.support.SqlMapClientDaoSupport

SqlSessionFactory.java  在网上找的相关代码然后自己修改的
package com.citipf.liyunpeng.dao.iBatis;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.parsing.XNode;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
import org.springframework.util.Assert;

public class SqlSessionFactoryBean implements FactoryBean<Object>,InitializingBean{
	Log logger = LogFactory.getLog(SqlSessionFactoryBean.class);
	private Resource configLocation;
	private Resource[] mapperLocations;
	private DataSource dataSource;
	private boolean useTransactionAwareDataSource = true;
	
	SqlSessionFactory sqlSessionFactory;
	public void afterPropertiesSet() throws Exception {
		Assert.notNull(configLocation,"configLocation must be not null");
		
		sqlSessionFactory = createSqlSessionFactory();
	}

	private SqlSessionFactory createSqlSessionFactory() throws IOException {
		Reader reader = new InputStreamReader(getConfigLocation().getInputStream());
		try {
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
			Configuration conf = sqlSessionFactory.getConfiguration();
			if(dataSource != null) {
				DataSource dataSourceToUse = this.dataSource; 
				if (this.useTransactionAwareDataSource  && !(this.dataSource instanceof TransactionAwareDataSourceProxy)) {  
		            dataSourceToUse = new TransactionAwareDataSourceProxy(this.dataSource);  
		        }
				
				conf.setEnvironment(new Environment("development",new ManagedTransactionFactory(),dataSourceToUse));
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(conf);
			}
			
			if(mapperLocations != null) {
				Map<String, XNode> sqlFragments = new HashMap<String, XNode>();
				for(Resource r : mapperLocations) {
					logger.info("Loading iBatis3 mapper xml from file["+r.getFile().getAbsolutePath()+"]");
					
					Reader mapperReader = new InputStreamReader(r.getInputStream());
					try {
						XMLMapperBuilder mapperBuilder = new XMLMapperBuilder(mapperReader,conf,r.getFile().getAbsolutePath(),sqlFragments);
						mapperBuilder.parse();
					}finally {
						mapperReader.close();
					}
				}
			}
			return sqlSessionFactory;
		}finally {
			reader.close();
		}
	}
	
	public Object getObject() throws Exception {
		return sqlSessionFactory;
	}
	
	public DataSource getDataSource() {
		return dataSource;
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public Class<? extends Object> getObjectType() {
		return SqlSessionFactory.class;
	}

	public boolean isSingleton() {
		return true;
	}

	public Resource getConfigLocation() {
		return configLocation;
	}

	public void setConfigLocation(Resource configurationFile) {
		this.configLocation = configurationFile;
	}

	public void setMapperLocations(Resource[] mapperLocations) {
		this.mapperLocations = mapperLocations;
	}

}


IBatisDaoSupport.java
package com.citipf.liyunpeng.dao.iBatis;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import org.springframework.util.Assert;
import org.springframework.dao.support.DaoSupport;
//import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public abstract class IBatisDaoSupport extends DaoSupport {

	protected final Log log = LogFactory.getLog(getClass());
    
    private SqlSessionFactory sqlSessionFactory;
    private SqlSessionTemplate sqlSessionTemplate;
	@Override
	protected void checkDaoConfig() throws IllegalArgumentException {
		Assert.notNull("sqlSessionFactory must be not null");
	}
	
	public SqlSessionFactory getSqlSessionFactory() {
		return sqlSessionFactory;
	}

	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
		this.sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
	}
	
	public SqlSessionTemplate getSqlSessionTemplate() {
		return sqlSessionTemplate;
	}
	
	public static class SqlSessionTemplate {
		SqlSessionFactory sqlSessionFactory;
		
		public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
			this.sqlSessionFactory = sqlSessionFactory;
		}

		public Object execute(SqlSessionCallback action)  {
			SqlSession session = null;
			try {
				session = sqlSessionFactory.openSession();
				Object result = action.doInSession(session);
				return result;
			}finally {
				if(session != null) {
					try {
						session.getConnection().close();
						session.close();
					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
			}
		}
		
		public Object selectOne(final String statement,final Object parameter) {
			return execute(new SqlSessionCallback() {
				public Object doInSession(SqlSession session) {
					return session.selectOne(statement, parameter);
				}
			});
		}
		
		@SuppressWarnings("unchecked")
		public List selectList(final String statement,final Object parameter,final int offset,final int limit) {
			return (List)execute(new SqlSessionCallback() {
				public Object doInSession(SqlSession session) {
					return session.selectList(statement, parameter, new RowBounds(offset,limit));
				}
			});
		}
		
		
		public int delete(final String statement,final Object parameter) {
			return (Integer)execute(new SqlSessionCallback() {
				public Object doInSession(SqlSession session) {
					return session.delete(statement, parameter);
				}
			});
		}
		
		public int update(final String statement,final Object parameter) {
			return (Integer)execute(new SqlSessionCallback() {
				public Object doInSession(SqlSession session) {
					return session.update(statement, parameter);
				}
			});
		}
		
		public int insert(final String statement,final Object parameter) {
			return (Integer)execute(new SqlSessionCallback() {
				public Object doInSession(SqlSession session) {
					return session.insert(statement, parameter);
				}
			});
		}
	} 
	
	public static interface SqlSessionCallback {
		
		public Object doInSession(SqlSession session);
		
	}
	
	
}


接下来Dao实现IBatisDaoSupport.java就可以了

仅供参考,个人研究的并不太透彻,如果有错误的地方希望高人指点,不过那些找不到的类确确实实是在iBatis2中的,iBatis3确实已经不要了~~,呵呵!!
3
2
分享到:
评论
4 楼 LiYunpeng 2010-11-01  
ffj1985 写道
if(session != null) { 
                    try { 
                        session.getConnection().close(); 
                        session.close(); 
                    } catch (SQLException e) { 
                        e.printStackTrace(); 
                    } 
                } 

楼主对于这段代码,我有一个疑问,为什么要 session.getConnection().close();  ,这样会关闭连接,损耗资源,但是不关闭的话,spring无法回收Connection,楼主有好的解决方法吗?

我记得当时我用了C3P0~这样Connection就可以重用了
3 楼 ffj1985 2010-10-28  
if(session != null) { 
                    try { 
                        session.getConnection().close(); 
                        session.close(); 
                    } catch (SQLException e) { 
                        e.printStackTrace(); 
                    } 
                } 

楼主对于这段代码,我有一个疑问,为什么要 session.getConnection().close();  ,这样会关闭连接,损耗资源,但是不关闭的话,spring无法回收Connection,楼主有好的解决方法吗?
2 楼 liu_shui8 2010-05-26  
请问,啥时候出3.1?
1 楼 melin 2010-04-13  
spring3.1 会支持ibatis3。

更加简化配置与开发,不需要写dao的实现类

<bean id="sqlSessionFactory" class="org.springframework.orm.ibatis3.SqlSessionFactoryBean">
	<property name="configLocation" value="classpath:ibatis/ibatis-config.xml" />
	<property name="mapperLocations">
		<list>
			<value>classpath:com/javaeye/melin/web/dao/mapper/*Mapper.xml</value>
			<value>classpath:ibatis/mapper/*Mapper.xml</value>
		</list>
	</property> 
	<property name="dataSource" ref="dataSource" />
</bean>

<bean id="menuDao"
	class="org.springframework.orm.ibatis3.support.MapperFactoryBean">
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
	<property name="mapperInterface" value="com.javaeye.melin.web.dao.IMenuDao" />
</bean>

相关推荐

    Spring 3.0 整合Ibatis 3

    ### Spring 3.0 整合 iBatis 3 的实践与配置 #### 一、背景介绍 在软件开发过程中,经常会遇到需要整合多种技术框架的情况。本文将详细介绍如何将 Spring 3.0 与 iBatis 3 进行整合。尽管作者提到 iBatis 3 在当时...

    spring3.0+ibatis 集成实例

    Spring 3.0 和 iBatis 的集成是一个常见的企业级应用开发模式,它结合了Spring的强大依赖注入(DI)和面向切面编程(AOP)能力与iBatis灵活的SQL映射机制,实现了业务逻辑层与数据访问层的分离,提高了代码的可维护...

    spring3.0,ibatis2.0,dwr2.0 框架整合

    iBatis与Spring整合后,可以通过Spring的DAO支持来管理数据库事务,实现数据访问的事务控制。使用MyBatis-Spring库可以轻松地将这两个框架集成在一起,使得数据访问更加方便。 第三,Direct Web Remoting (DWR) 2.0...

    Spring3.0+Ibatis+Oracle全注解开发详细过程

    在本文中,我们将深入探讨如何使用Spring 3.0、iBATIS和Oracle数据库进行全注解开发。这种技术栈组合常用于构建企业级Java Web应用程序,以实现灵活的数据访问和松散耦合的架构。 首先,让我们了解Spring 3.0中的...

    Spring3.0+Ibatis+Orace全注解开发

    该文件是一个完整的Spring3.0+Ibatis+Oracle全注解式开发项目,里面详细的介绍了注解的使用,注解描述很全,下载就可以导入到您的myeclipse中运行,很好的Spring注解开发小项目

    spring3.0 + ibatis+jquery+注解建立dao、service类

    3. **配置Spring**:编写`applicationContext.xml`,配置数据源,iBatis的SqlSessionFactory,以及使用注解的扫描路径。 4. **创建DAO接口**:使用`@Repository`注解,定义SQL查询方法。 5. **实现Mapper XML文件**...

    SSI框架整合(Struts2.1+Spring3.0+Ibatis 2.3)

    SSI框架整合(Struts2.1+Spring3.0+Ibatis 2.3) 下载之后执行.sql文件创建表和sequence 记得改数据库访问地址以及数据库登录用户名密码 项目访问路径 localhost:8080/SSI_Demo1 一个简单的例子(Oracle数据库增删改查...

    struts2.1.8+spring3.0+ibatis2.3优雅框架

    在与Spring整合时,iBatis可以作为Spring的数据访问层组件,通过SqlSessionFactory和SqlSessionTemplate等类进行配置,使得数据库操作可以通过DAO(Data Access Object)模式进行。 整合Struts2、Spring和iBatis的...

    spring3.0jar包

    在数据访问层,Spring 3.0 改进了对JDBC、Hibernate和iBatis等ORM框架的集成。`@Transactional` 注解可以方便地声明事务边界,而`@Repository` 注解配合Spring的数据访问异常转换机制,使得数据库操作的错误处理更加...

    spring3.2与Ibatis整合

    Spring 3.2 与 iBatis 的整合是Java企业级开发中常见的一种技术组合,它结合了Spring的依赖注入和事务管理能力以及iBatis的SQL映射框架的灵活性。这种整合允许开发者将业务逻辑与数据访问层解耦,提高了代码的可维护...

    spring mvc3.0+ibatis3.0(基于oracle) Demo

    折腾了好几天,终于从零开始把spring mvc 3.0 + ibatis 3.0 (基于oracle)的Demo完全跑通了。Demo中有不少注释,使用的jar包基本是最精简的了。留着做个备用,也给大家一个参考!

    struts2+spring3+ibatis项目整合案例

    在这个“struts2+spring3+ibatis项目整合案例”中,我们将深入探讨这三个框架如何相互配合,实现项目的集成。 Struts2作为MVC(Model-View-Controller)架构的实现,主要负责处理用户请求,控制应用的流程。它提供...

    Spring3.0源代码

    1. **依赖注入**:Spring3.0的核心特性之一,允许开发者通过配置来管理对象之间的依赖关系,而不是硬编码这些依赖。在`src`目录下,可以找到`org.springframework.beans`和`org.springframework.context`包,这两个...

    ibatis 与spring3整合

    "Ibatis 与 Spring3 整合"这一主题,涉及到的是两个知名Java框架——Ibatis(一个轻量级的持久层框架)和Spring(一个全面的企业级应用框架)的协同工作。下面我们将深入探讨这一整合过程中的关键知识点。 Ibatis ...

    spring ibatis整合所需jar包

    3. iBatis配置:创建一个名为`sqlmap-config.xml`的iBatis配置文件,定义数据源、事务管理器以及SQL映射文件的位置。 4. 映射文件:每个数据库表对应一个或多个SQL映射文件,如`UserMapper.xml`,其中定义了SQL语句...

    Spring对IBatis的整合

    ### Spring对IBatis的整合 #### 一、Spring与IBatis整合概述 Spring框架与IBatis(现称为MyBatis)的整合为开发者提供了一种更简洁、更强大的数据库访问方式。Spring通过其内置的支持机制极大地简化了原有的IBatis...

    Spring+ibatis 保留ibatis事务的配置

    根据提供的文件信息,本文将详细解析如何在Spring与ibatis框架整合时,通过特定配置来保留ibatis事务处理机制,并实现对事务的自定义控制。文章将围绕标题、描述及部分代码片段展开讨论。 ### Spring与ibatis整合...

Global site tag (gtag.js) - Google Analytics