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>
<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> -->
<bean id="sqlMapClient" value="/com/citipf/liyunpeng/ibatisConfig.xml"></property><property name="dataSource" ref="dataSource"></property></bean>
<bean id="stockDaoImpl" ref="sqlMapClient" /></bean><!-- Service --><bean id="citiService" ref="stockDaoImpl" /></bean>
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;}}
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);}}