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实现编码