`
yuanfen860913
  • 浏览: 115680 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

ibatis3整合spring

阅读更多

因为ibatis3现在还是测试版,spring也没有出相应的整合。所以,我根据spring整合hibernate的原理,也出来show一下,高手就不要笑我了。开工

主要是的文件有:
Ibatis3SessionFactory.java 这个是由spring读取ibatis配置文件,并产生sessionFactory工厂的

Ibatis3DaoSupport.java 我们的dao主要继承它了,因为它有一个模板类,定义了许多方法.

IBatis3DaoTemplate.java 不是上面的说的模板类

SqlSessionCallback.java 回调方法。

一 . 我们先来看一下Ibatis3SessionFactory.java

Java代码
package com.ibatis3;

import java.io.IOException;
import java.io.Reader;

import javax.sql.DataSource;

import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
/*
* session工厂类
*/
public class Ibatis3SessionFactory implements FactoryBean, InitializingBean {
private String configLocation;

private DataSource dataSource;

private SqlSessionFactory sqlSessionFactory;

private boolean useTransactionAwareDataSource = true;

private String environmentId = "development";

public void setEnvironmentId(String environmentId) {
this.environmentId = environmentId;
}

public void setUseTransactionAwareDataSource(
boolean useTransactionAwareDataSource) {
this.useTransactionAwareDataSource = useTransactionAwareDataSource;
}

public Object getObject() throws Exception {
return this.sqlSessionFactory;
}

public Class getObjectType() {
return (this.sqlSessionFactory != null ? this.sqlSessionFactory
.getClass() : SqlSessionFactory.class);
}

public boolean isSingleton() {
return true;
}

public void afterPropertiesSet() throws Exception {
this.sqlSessionFactory = this.buildSqlSessionFactory(configLocation);
}
protected SqlSessionFactory buildSqlSessionFactory(String configLocation)
throws IOException {
if (configLocation == null) {
throw new IllegalArgumentException(
"configLocation entry is required");
}
DataSource dataSourceToUse = this.dataSource;
if (this.useTransactionAwareDataSource
&& !(this.dataSource instanceof TransactionAwareDataSourceProxy)) {
dataSourceToUse = new TransactionAwareDataSourceProxy(
this.dataSource);
}

Environment environment = new Environment(environmentId,
new ManagedTransactionFactory(), dataSourceToUse);

Reader reader = Resources.getResourceAsReader(configLocation);
XMLConfigBuilder parser = new XMLConfigBuilder(reader, null, null);
Configuration config = parser.parse();
config.setEnvironment(environment);

return new DefaultSqlSessionFactory(config);
}

public DataSource getDataSource() {
return dataSource;
}

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

public void setConfigLocation(String configLocation) {
this.configLocation = configLocation;
}
}
package com.ibatis3;

import java.io.IOException;
import java.io.Reader;

import javax.sql.DataSource;

import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
import org.apache.ibatis.transaction.managed.ManagedTransactionFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
/*
* session工厂类
*/
public class Ibatis3SessionFactory implements FactoryBean, InitializingBean {
private String configLocation;

private DataSource dataSource;

private SqlSessionFactory sqlSessionFactory;

private boolean useTransactionAwareDataSource = true;

private String environmentId = "development";

public void setEnvironmentId(String environmentId) {
this.environmentId = environmentId;
}

public void setUseTransactionAwareDataSource(
boolean useTransactionAwareDataSource) {
this.useTransactionAwareDataSource = useTransactionAwareDataSource;
}

public Object getObject() throws Exception {
return this.sqlSessionFactory;
}

public Class getObjectType() {
return (this.sqlSessionFactory != null ? this.sqlSessionFactory
.getClass() : SqlSessionFactory.class);
}

public boolean isSingleton() {
return true;
}

public void afterPropertiesSet() throws Exception {
this.sqlSessionFactory = this.buildSqlSessionFactory(configLocation);
}
protected SqlSessionFactory buildSqlSessionFactory(String configLocation)
throws IOException {
if (configLocation == null) {
throw new IllegalArgumentException(
"configLocation entry is required");
}
DataSource dataSourceToUse = this.dataSource;
if (this.useTransactionAwareDataSource
&& !(this.dataSource instanceof TransactionAwareDataSourceProxy)) {
dataSourceToUse = new TransactionAwareDataSourceProxy(
this.dataSource);
}

Environment environment = new Environment(environmentId,
new ManagedTransactionFactory(), dataSourceToUse);

Reader reader = Resources.getResourceAsReader(configLocation);
XMLConfigBuilder parser = new XMLConfigBuilder(reader, null, null);
Configuration config = parser.parse();
config.setEnvironment(environment);

return new DefaultSqlSessionFactory(config);
}

public DataSource getDataSource() {
return dataSource;
}

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

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

上面代码也借鉴了网络上部分代码,因为转来转去,也不知谁是原创。

二. 下面是最简单的回调函数:

Java代码
package com.ibatis3;

import org.apache.ibatis.session.SqlSession;

public interface SqlSessionCallback {
public Object doInSqlSession(SqlSession session);
}
package com.ibatis3;

import org.apache.ibatis.session.SqlSession;

public interface SqlSessionCallback {
public Object doInSqlSession(SqlSession session);
}


三.模板类

Java代码
package com.ibatis3;

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

import javax.sql.DataSource;

import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.taglibs.standard.tag.common.sql.DataSourceUtil;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.JdbcAccessor;
import org.springframework.transaction.support.TransactionSynchronizationManager;

public class IBatis3DaoTemplate extends JdbcAccessor {
private SqlSessionFactory sessionFactory;

public IBatis3DaoTemplate(SqlSessionFactory factory) {
this.sessionFactory = factory;
}

public SqlSession openSession() {
SqlSession session = (SqlSession) TransactionSynchronizationManager
.getResource(sessionFactory);
if (session == null) {
session = sessionFactory.openSession();
}
return session;
}

public void setSessionFactory(SqlSessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public List executeFind(SqlSessionCallback callback) {
return (List) execute(callback);
}

public Object execute(SqlSessionCallback callback) {

SqlSession session = openSession();

Object obj = callback.doInSqlSession(session);
if (session != null)
session.close();

return obj;
}

// 删除,根据语句
public int delete(final String statement) {
return delete(statement, null);
}

// 删除,根据语句,带条件
public int delete(final String statement, final Object param) {
return (Integer) execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (param != null)
return session.delete(statement, param);
else
return session.delete(statement);
}
});
}

// 修改带条件
public int update(final String statement, final Object param) {
return (Integer) execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (param != null)
return session.update(statement, param);
else
return session.update(statement);
}
});
}

// 修改不带条件
public int update(final String statement) {
return update(statement, null);
}

// 增加带条件
public int insert(final String statement, final Object param) {
return (Integer) execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (param != null)
return session.insert(statement, param);
else
return session.insert(statement);
}
});
}

// 增加不带条件
public int insert(final String statement) {
return insert(statement, null);
}

// 查询分页
public List selectList(final String statement, final Object param,
final RowBounds bounds) {
return executeFind(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (statement == null)
throw new IllegalArgumentException(
"Sql 'statement' require");
if (bounds != null && param != null)
return session.selectList(statement, param, bounds);
else if (bounds!=null)
return session.selectList(statement, null, bounds);
else if (param != null) {
return session.selectList(statement, param);
}

else
return session.selectList(statement);

}
});
}

// 条件分页
public List selectList(final String statement, final Object param,
int skip, int limit) {
return selectList(statement, param, new RowBounds(skip, limit));
}

// 查询不分页
public List selectList(final String statement, final Object param) {
return selectList(statement, param, null);
}

// 查询不带条件
public List selectList(final String statement) {
return selectList(statement, null);
}

// 条件查带处理查询结果,带分页
public void select(final String statement, final Object param,
final RowBounds bounds, final ResultHandler handler) {
if (statement == null || handler == null)
throw new IllegalArgumentException(
"'statement' and 'handler' require");

execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (handler != null && bounds != null && param != null)
session.select(statement, param, bounds, handler);
else if (bounds == null)
session.select(statement, param, handler);

return null;
}
});
}

// 自己处理查询结果 ,不带分页
public void select(final String statement, final Object param,
final ResultHandler handler) {
select(statement, param, null, handler);
}

// 查唯一结果
public Object selectOne(final String statement) {
return selectOne(statement, null);
}

// 查唯一结果带条件
public Object selectOne(final String statement, final Object param) {
if (statement == null)
throw new IllegalArgumentException("Sql 'statement' require");
return execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (param != null)
return session.selectOne(statement, param);
else
return session.selectOne(statement);

}
});
}

}
package com.ibatis3;

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

import javax.sql.DataSource;

import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.taglibs.standard.tag.common.sql.DataSourceUtil;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.JdbcAccessor;
import org.springframework.transaction.support.TransactionSynchronizationManager;

public class IBatis3DaoTemplate extends JdbcAccessor {
private SqlSessionFactory sessionFactory;

public IBatis3DaoTemplate(SqlSessionFactory factory) {
this.sessionFactory = factory;
}

public SqlSession openSession() {
SqlSession session = (SqlSession) TransactionSynchronizationManager
.getResource(sessionFactory);
if (session == null) {
session = sessionFactory.openSession();
}
return session;
}

public void setSessionFactory(SqlSessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public List executeFind(SqlSessionCallback callback) {
return (List) execute(callback);
}

public Object execute(SqlSessionCallback callback) {

SqlSession session = openSession();

Object obj = callback.doInSqlSession(session);
if (session != null)
session.close();

return obj;
}

// 删除,根据语句
public int delete(final String statement) {
return delete(statement, null);
}

// 删除,根据语句,带条件
public int delete(final String statement, final Object param) {
return (Integer) execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (param != null)
return session.delete(statement, param);
else
return session.delete(statement);
}
});
}

// 修改带条件
public int update(final String statement, final Object param) {
return (Integer) execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (param != null)
return session.update(statement, param);
else
return session.update(statement);
}
});
}

// 修改不带条件
public int update(final String statement) {
return update(statement, null);
}

// 增加带条件
public int insert(final String statement, final Object param) {
return (Integer) execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (param != null)
return session.insert(statement, param);
else
return session.insert(statement);
}
});
}

// 增加不带条件
public int insert(final String statement) {
return insert(statement, null);
}

// 查询分页
public List selectList(final String statement, final Object param,
final RowBounds bounds) {
return executeFind(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (statement == null)
throw new IllegalArgumentException(
"Sql 'statement' require");
if (bounds != null && param != null)
return session.selectList(statement, param, bounds);
else if (bounds!=null)
return session.selectList(statement, null, bounds);
else if (param != null) {
return session.selectList(statement, param);
}

else
return session.selectList(statement);

}
});
}

// 条件分页
public List selectList(final String statement, final Object param,
int skip, int limit) {
return selectList(statement, param, new RowBounds(skip, limit));
}

// 查询不分页
public List selectList(final String statement, final Object param) {
return selectList(statement, param, null);
}

// 查询不带条件
public List selectList(final String statement) {
return selectList(statement, null);
}

// 条件查带处理查询结果,带分页
public void select(final String statement, final Object param,
final RowBounds bounds, final ResultHandler handler) {
if (statement == null || handler == null)
throw new IllegalArgumentException(
"'statement' and 'handler' require");

execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (handler != null && bounds != null && param != null)
session.select(statement, param, bounds, handler);
else if (bounds == null)
session.select(statement, param, handler);

return null;
}
});
}

// 自己处理查询结果 ,不带分页
public void select(final String statement, final Object param,
final ResultHandler handler) {
select(statement, param, null, handler);
}

// 查唯一结果
public Object selectOne(final String statement) {
return selectOne(statement, null);
}

// 查唯一结果带条件
public Object selectOne(final String statement, final Object param) {
if (statement == null)
throw new IllegalArgumentException("Sql 'statement' require");
return execute(new SqlSessionCallback() {

public Object doInSqlSession(SqlSession session) {
if (param != null)
return session.selectOne(statement, param);
else
return session.selectOne(statement);

}
});
}

}



四.Ibatis3DaoSupport支持类

Java代码
package com.ibatis3;

import org.springframework.dao.support.DaoSupport;

import org.springframework.transaction.support.TransactionSynchronizationManager;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSession;

import javax.sql.DataSource;
/*
* Dao类
* 主要接收传入的sessionFactory
* 取得模板
*/
public class Ibatis3DaoSupport extends DaoSupport {
private SqlSessionFactory sessionFactory;
private IBatis3DaoTemplate template;

public void createTemplate(){
this.template = new IBatis3DaoTemplate(sessionFactory);
}

public IBatis3DaoTemplate getTemplate() {
//System.out.println(template);
return template;
}

public void setTemplate(IBatis3DaoTemplate template) {
this.template = template;
}

//创建或得到session
public SqlSession openSession() {

SqlSession session = (SqlSession) TransactionSynchronizationManager
.getResource(sessionFactory);
if (session == null) {
session = sessionFactory.openSession();
}

return session;
}

public SqlSessionFactory getSessionFactory() {
return sessionFactory;
}

public void setSessionFactory(SqlSessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
this.template = new IBatis3DaoTemplate(sessionFactory);

}


@Override
protected void checkDaoConfig() throws IllegalArgumentException {

if (sessionFactory == null) {
throw new IllegalArgumentException(
"Property 'sessionFactory' or 'template' is required");
}

}

}
package com.ibatis3;

import org.springframework.dao.support.DaoSupport;

import org.springframework.transaction.support.TransactionSynchronizationManager;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSession;

import javax.sql.DataSource;
/*
* Dao类
* 主要接收传入的sessionFactory
* 取得模板
*/
public class Ibatis3DaoSupport extends DaoSupport {
private SqlSessionFactory sessionFactory;
private IBatis3DaoTemplate template;

public void createTemplate(){
this.template = new IBatis3DaoTemplate(sessionFactory);
}

public IBatis3DaoTemplate getTemplate() {
//System.out.println(template);
return template;
}

public void setTemplate(IBatis3DaoTemplate template) {
this.template = template;
}

//创建或得到session
public SqlSession openSession() {

SqlSession session = (SqlSession) TransactionSynchronizationManager
.getResource(sessionFactory);
if (session == null) {
session = sessionFactory.openSession();
}

return session;
}

public SqlSessionFactory getSessionFactory() {
return sessionFactory;
}

public void setSessionFactory(SqlSessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
this.template = new IBatis3DaoTemplate(sessionFactory);

}


@Override
protected void checkDaoConfig() throws IllegalArgumentException {

if (sessionFactory == null) {
throw new IllegalArgumentException(
"Property 'sessionFactory' or 'template' is required");
}

}

}


五.ibatis配置文件,我放在src下面

Java代码
<?xml version="1.0" encoding="UTF-8"?>
;!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

;configuration>
<mappers>
<mapper resource="com/pojos/Dep.xml"/>
</mappers>
;/configuration>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">

<configuration>
<mappers>
<mapper resource="com/pojos/Dep.xml"/>
</mappers>
</configuration>


很简单,就是装载些映射文件,其实可以sessionFactory中完成。

六. pojo类和映射文件就不贴出了,请看附件

七. spring的配置文件,用了声明式事务.

Java代码
<?xml version="1.0" encoding="UTF-8"?>

lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- - - - - - - - Apache Dbcp Pool - - - - - - - -->
<bean id="datasource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="username" value="scott" />
<property name="password" value="tiger" />
<property name="url"
value="jdbc:oracle:thin:@127.0.0.1:1521:ora92" />
</bean>

<!-- sqlMapClientSessionBean -->
<bean id="sessionFactory"
class="com.ibatis3.Ibatis3SessionFactory">
<property name="configLocation" value="sqlMapConfig.xml"></property>
<property name="dataSource" ref="datasource"></property>
</bean>

<!-- dao -->
<bean id="depDao" class="com.dao.DepDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

<!-- - - - - - - spring Transaction Manager - - - - - - - -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource" />
</bean>
<!-- - - - - - - spring Transaction Attribute - - - - - - - -->
<tx:advice id="transactionAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--****** weave *********-->
<aop:config>
<aop:advisor advice-ref="transactionAdvice"
pointcut="execution(* com.test.*.*(..))" />
</aop:config>


lt;/beans>


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- - - - - - - - Apache Dbcp Pool - - - - - - - -->
<bean id="datasource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="username" value="scott" />
<property name="password" value="tiger" />
<property name="url"
value="jdbc:oracle:thin:@127.0.0.1:1521:ora92" />
</bean>

<!-- sqlMapClientSessionBean -->
<bean id="sessionFactory"
class="com.ibatis3.Ibatis3SessionFactory">
<property name="configLocation" value="sqlMapConfig.xml"></property>
<property name="dataSource" ref="datasource"></property>
</bean>

<!-- dao -->
<bean id="depDao" class="com.dao.DepDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

<!-- - - - - - - spring Transaction Manager - - - - - - - -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="datasource" />
</bean>
<!-- - - - - - - spring Transaction Attribute - - - - - - - -->
<tx:advice id="transactionAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--****** weave *********-->
<aop:config>
<aop:advisor advice-ref="transactionAdvice"
pointcut="execution(* com.test.*.*(..))" />
</aop:config>


</beans>

完整代码请下载下面附件,因本人水平有限,请勿用在生产环境:)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qqzhuyuehe/archive/2010/03/26/5419989.aspx

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics