Spring 3.0 iBatis 3 Beta 10構成を統合


長い間、インターネットでいろいろな資料を探しました.文書、最後にSpring 3.0 referenceの中にNote Spring supports iBATIS 2.x.The iBATIS 1.x support clases are no longer provided.Springサポート2.xと書いてあります.それはつまりサポートしないと言っていません.Batis 3はまだ正式版が発表されていません.また、iBatisは明らかに変化しています.jarパッケージもJarパッケージに縮小されていますので、SpringはしばらくiBatis 3をサポートしていません.数日間の勉強と検索を経て、自分でセットを作りました.もちろん、私は専門家ではないです.研究が好きです.理解してもらえないです.以下は参考にしてください.私のFlexプロジェクトを例にしてweb.xml配置Spring監聴と2.x同じps:どういうわけか、EclipseはUser libraryを使っています.しかし、起動時にClass NortFoundExceptionを提示しました.最初はまだ分かりませんでした.その後直接に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>
appication Contect.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>
C 3 P 0接続池の配置
<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コード---------------Spring 3.0はiBatis 3に対応していないので、iBatis 2のorg.spring frame ebork.orm.ibatis.Sql MapClint FactoryBern配置方式Springを使ってiBatis 2でサポートされているクラスを探します.だから、自分でSql Session FactoryとDao Supportを書き換える必要があります.org.springframe ebook.orm.ibatis.Sql MapClient FactoryBernorg.springframe ork.ork.orm.ibatis.support.Sql MapClinterDactory.Sectory.  ネットで探した関連コードは自分で修正しました.
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;
	}

}
IBat Dao Support.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はIBat DaoSupport.javaを実現すればいいです.個人の研究はあまり徹底していません.間違ったところがあれば、高い人に指摘してもらいたいですが、見つけられない種類は確かにiBatis 2の中にあります.iBatis 3はもういらないです.