首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring 3.0 调整 iBatis 3 Beta10 配置

2012-10-24 
Spring 3.0 整合 iBatis 3 Beta10 配置弄了好长时间了,上网找各种资料,文档,最后发现Spring 3.0 reference

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" name="code"><bean id="dataSource" ><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" ><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" value="/com/citipf/liyunpeng/ibatisConfig.xml"></property><property name="dataSource" ref="dataSource"></property></bean>

Dao 以及 Service
<bean id="stockDaoImpl" ref="sqlMapClient" /></bean><!-- Service --><bean id="citiService" 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;@Overrideprotected 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确实已经不要了~~,呵呵!!<bean id="sqlSessionFactory" 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"ref="sqlSessionFactory" /><property name="mapperInterface" value="com.javaeye.melin.web.dao.IMenuDao" /></bean> 2 楼 liu_shui8 2010-05-26   请问,啥时候出3.1? 3 楼 ffj1985 2010-10-28   if(session != null) { 
                    try { 
                        session.getConnection().close(); 
                        session.close(); 
                    } catch (SQLException e) { 
                        e.printStackTrace(); 
                    } 
                } 

楼主对于这段代码,我有一个疑问,为什么要 session.getConnection().close();  ,这样会关闭连接,损耗资源,但是不关闭的话,spring无法回收Connection,楼主有好的解决方法吗? 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就可以重用了

热点排行