10. ibatis数据访问对象


1. 隐藏实现细节




1.1 为何要分离


将具体实现和数据访问接口分离开,就可以为异质数据源提供一套同源的接口。


1.2 一个简单示例





 1. Dao.xml配置文件

包含了告诉ibatis如何构造DAO所需的信息


dao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE daoConfig
PUBLIC
"-//ibatis.apache.org//DTD DAO Configuration 2.0//EN"
"http://ibatis.apache.org/dtd/dao-2.dtd">
<daoConfig>
	<context id="example">
		<transactionManager type="SQLMAP">
			<property name="SqlMapConfigResource" value="examples/SqlMapConfig.xml" />
		</transactionManager>
		<dao interface="examples.dao.AccountDao" implementation="examples.dao.impl.AccountDao" />
	</context>
<pre></daoConfig>

 


2.创建DaoManager

创建一个DaoManager实例(类似于JDBC的DataSource,是数据访问层的起始点),可从这个实例获得DAO。


package org.apache.mapper2.examples.chapter10.dao;

import com.ibatis.dao.client.DaoManager;
import com.ibatis.dao.client.DaoManagerBuilder;
import com.ibatis.common.resources.Resources;
import java.io.Reader;
import java.io.IOException;

public class DaoService {<span style="white-space:pre">			</span>//创建和存储DaoManager实例
	private static DaoManager daoManager;

	public static synchronized DaoManager getDaoManager() {
		String daoXmlResource = "dao.xml";
		Reader reader;
		if (null == daoManager) {
			try {
				reader = Resources.getResourceAsReader(daoXmlResource);
				daoManager = DaoManagerBuilder.buildDaoManager(reader);
				return daoManager;
			} catch (IOException e) {
				throw new RuntimeException("Unable to create DAO manager.", e);
			}
		} else {
			return daoManager;
		}
	}

	public static Dao getDao(Class interfaceClass) {
		return getDaoManager().getDao(interfaceClass);
	}
}


2. 配置DAO


2.1 <properties>元素

和SqlMapConfig.xml文件中的使用方法一样,用来指定一个特性文件,该文件所列出的所有特性都可以通过${name}语法,使用在DAO层配置文件中


2.2 <context>元素


指一组相关的DAO配置信息和一组DAO实现

<context id="example">


2.3 <transactionManager>元素





实现DaoTransactionManager接口,定义自己的事务管理器

<transactionManager
type="com.mycompany.MyNiftyTransactionManager">
<property name="someProp" value="aValue"/><span style="white-space:pre">			</span>//都会被传递给该事务管理器类的configure()方法
<property name="someOtherProp" value="anotherValue"/>
</transactionManager>


2.4 DAO元素


两个属性:interface 和implementation

<dao interface="com.mycompany.system.dao.AccountDao"
implementation=
"com.mycompany.system.dao.impl.AccountDaoImpl"/>

3. 配置技巧


3.1 多个服务器


将特定于环境的信息从dao.xml文件中移出,放在外部文件,

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE daoConfig
PUBLIC
"-//ibatis.apache.org//DTD DAO Configuration 2.0//EN"
"http://ibatis.apache.org/dtd/dao-2.dtd">
<daoConfig>
	<properties resource="server.properties" />
	<context>
		<transactionManager type="JDBC">
			<property name="DataSource" value="SIMPLE" />
			<property name="JDBC.Driver" value="${jdbcDriver}" />
			<property name="JDBC.ConnectionURL" value="${jdbcUrl}" />
			<property name="JDBC.Username" value="${jdbcUser}" />
			<property name="JDBC.Password" value="${jdbcPassword}" />
			<property name="JDBC.DefaultAutoCommit" value="${jdbcAutoCommit}" />
		</transactionManager>
		<dao interface="..." implementation="..." />
	</context>
</daoConfig>


3.2  多种数据库方言


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE daoConfig
PUBLIC
"-//ibatis.apache.org//DTD DAO Configuration 2.0//EN"
"http://ibatis.apache.org/dtd/dao-2.dtd">
<daoConfig>
	<properties resource="config.properties" />
	<context>
		<transactionManager type="JDBC">
			<property name="DataSource" value="SIMPLE" />
			<property name="JDBC.Driver" value="${jdbcDriver}" />
			<property name="JDBC.ConnectionURL" value="${jdbcUrl}" />
			<property name="JDBC.Username" value="${jdbcUser}" />
			<property name="JDBC.Password" value="${jdbcPassword}" />
			<property name="JDBC.DefaultAutoCommit" value="${jdbcAutoCommit}" />
		</transactionManager>
		<dao interface="com.company.system.dao.AccountDao" implementation="${impl}.AccountDaoImpl" /><span style="white-space:pre">			</span>///包名作为特性文件一部分
	</context>
</daoConfig>


3.3 运行时配置更改

public static DaoManager getDaoManager(Properties props)<span style="white-space:pre">		</span>///
{
String daoXml = "/org/apache/mapper2/examples/Dao.xml";
Reader reader;
DaoManager localDaoManager;
try {
	reader = Resources.getResourceAsReader(daoXml);
	localDaoManager =
	DaoManagerBuilder.buildDaoManager(reader, props);
	} catch (IOException e) {
	throw new RuntimeException(
	"Unable to create DAO manager.", e);
	}
	return localDaoManager;
	}
}

4. 基于SQLMap的DAO实现示例

DAO接口:

package org.apache.mapper2.examples.chapter10.dao;

import org.apache.mapper2.examples.bean.Account;
import org.apache.mapper2.examples.bean.IdDescription;
import java.util.List;
import java.util.Map;

public interface AccountDao {
	public void insert(Account account);

	public void update(Account account);

	public int delete(Account account);

	public int delete(Integer accountId);

	public List<Account> getAccountListByExample(Account account);

	public List<Map<String, Object>> getMapListByExample(Account account);

	public List<IdDescription> getIdDescriptionListByExample(Account account);

	public Account getById(Integer accountId);

	public Account getById(Account account);
}


4.1 配置ibatis DAO


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE daoConfig
PUBLIC
"-//ibatis.apache.org//DTD DAO Configuration 2.0//EN"
"http://ibatis.apache.org/dtd/dao-2.dtd">
<daoConfig>
	<context id="sqlmap">
		<transactionManager type="SQLMAP">
			<property name="SqlMapConfigResource" value="SqlMapConfig.xml" />
		</transactionManager>
		<dao interface="com.mycompany.system.dao.AccountDao"
			implementation="com.mycompany.system.dao.sqlmap.AccountDaoImpl" />
	</context>
</daoConfig>


4.2 创建DaoManager实例


private DaoManager getDaoManager() {
DaoManager tempDaoManager = null;
Reader reader;
try {
reader = Resources.getResourceAsReader("Dao.xml");
tempDaoManager =
DaoManagerBuilder.buildDaoManager(reader);
} catch (Exception e) {
e.printStackTrace();
fail("Cannot load dao.xml file.");
}
return tempDaoManager;
}


4.3 定义事务管理器


将基于我们在SQLMap配置文件中定义的事务管理器,此配置文件嵌套在<transactionManager>元素的SqlMapConfigResource特性

SQLMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC
"-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
	<properties resource="SqlMapConfig.properties" />
	<settings errorTracingEnabled="true" cacheModelsEnabled="true"
		enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="32"
		maxSessions="10" maxTransactions="5" useStatementNamespaces="true" />
	<transactionManager type="JDBC">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="${driver}" />
			<property name="JDBC.ConnectionURL" value="${connectionUrl}" />
			<property name="JDBC.Username" value="${username}" />
			<property name="JDBC.Password" value="${password}" />
		</dataSource>
	</transactionManager>
	<sqlMap resource="com/mycompany/system/dao/sqlmap/Account.xml" />
</sqlMapConfig>


4.4 加载映射


4.5 DAO实现编码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值