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.javapackage 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はもういらないです.