1. 理解可插拔组件的设计
一个可插拔组件的设计通常由3部分组成:
- 接口
- 实现
- 工厂
2. 使用自定义类型处理器
2.1 实现自定义类型处理器
public interface TypeHandlerCallback {
public void setParameter(
ParameterSetter setter, Object parameter)
throws SQLException;
public Object getResult(ResultGetter getter)
throws SQLException;
public Object valueOf(String s);
}
2.2 创建TypeHandlerCallback
public class YesNoTypeHandlerCallback implements TypeHandlerCallback {
private static final String YES = "YES";
private static final String NO = "NO";
public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
}
public Object getResult(ResultGetter getter) throws SQLException {
}
public Object valueOf(String s) {
}
}
1. 设置参数
private String booleanToYesNo(Boolean b) {
if (b == null) {
throw new IllegalArgumentException(
"Could not convert null to a boolean value. " + "Valid arguments are 'true' and 'false'.");
} else if (b.booleanValue()) {
return YES;
} else {
return NO;
}
}
ParameterSetter使你能够访问很多设置方法,每一种方法应用于不同的数据类型
public void setParameter(
ParameterSetter setter, Object parameter
) throws SQLException {
setter.setString(booleanToYesNo((Boolean) parameter));
}
2. 获取结果
private Boolean yesNoToBoolean(String s) {
if (YES.equalsIgnoreCase(s)) {
return Boolean.TRUE;
} else if (NO.equalsIgnoreCase(s)) {
return Boolean.FALSE;
} else {
throw new IllegalArgumentException(
"Could not convert " + s + " to a boolean value. " + "Valid arguments are 'YES' and 'NO'.");
}
}
public Object getResult(ResultGetter getter)<span style="white-space:pre"> </span>//ResultGetter 包含很多用于获取不同类型值的方法
throws SQLException {
return yesNoToBoolean(getter.getString());
}
3. 处理空值:valueOf()方法干什么用?
数据库中使用一个可为空的列。
public class YesNoTypeHandlerCallback implements TypeHandlerCallback {
public static final String YES = "YES";<span style="white-space:pre"> </span>///数据库中YES和NO对应的常量
public static final String NO = "NO";
public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {<span style="white-space:pre"> </span>///使用类型处理器设置参数
setter.setString(booleanToYesNo((Boolean) parameter));
}
public Object getResult(ResultGetter getter) throws SQLException {<span style="white-space:pre"> </span>///使用类型处理器获取结果
return yesNoToBoolean(getter.getString());
}
public Object valueOf(String s) {<span style="white-space:pre"> </span>///将字符串转换为我们的类型
return yesNoToBoolean(s);
}
private Boolean yesNoToBoolean(String s) {
if (YES.equalsIgnoreCase(s)) {
return Boolean.TRUE;
} else if (NO.equalsIgnoreCase(s)) {
return Boolean.FALSE;
} else {
throw new IllegalArgumentException(
"Could not convert " + s + " to a boolean value. " + "Valid arguments are 'YES' and 'NO'.");
}
}
private String booleanToYesNo(Boolean b) {
if (b == null) {
throw new IllegalArgumentException(
"Could not convert null to a boolean value. " + "Valid arguments are 'true' and 'false'.");
} else if (b.booleanValue()) {
return YES;
} else {
return NO;
}
}
}
2.3 注册TypeHandlerCallback以供使用
- 在SqlMapConfig.xml文件中注册,以使它全局可用
<typeHandler
callback="com.domain.package.YesNoTypeHandlerCallback"
javaType="boolean" jdbcType="VARCHAR" />
- 在某个SqlMap.xml 文件中注册,以使它局部可用
- 专门针对某个结果映射或参数映射进行注册
3. 使用CacheController
public interface CacheController {
public void configure(Properties props);
public void putObject(CacheModel cacheModel, Object key, Object object);
public Object getObject(CacheModel cacheModel, Object key);
public Object removeObject(CacheModel cacheModel, Object key);
public void flush(CacheModel cacheModel);
}
3.1 创建CacheController
3.2 CacheController的放入、获取以及清除操作
3.3 注册CacheController以供使用
<typeAlias alias="MapCacheController"
type="com.domain.package.MapCacheController"/>
<cacheModel id="PersonCache" type="MapCacheController">
<flushInterval hours="24" />
<flushOnExecute statement="updatePerson" />
<flushOnExecute statement="insertPerson" />
<flushOnExecute statement="deletePerson" />
</cacheModel>
4. 配置ibatis不支持的DataSource
要配置一个新的DataSource,需要为ibatis提供一个工厂(为框架提供DataSource实例),
public interface DataSourceFactory {
public void initialize(Map map);
public DataSource getDataSource();
}
5 定制事务管理
ibatis提供两个接口TransactionConfig和Transaction. 以便创建自己的事务管理适配器。
通常需要同时实现这两个接口以构成一个完整的实现。
5.1 理解TransactionConfig接口
public interface TransactionConfig {
public void initialize(Properties props) throws SQLException, TransactionException;
public Transaction newTransaction(int transactionIsolation) throws SQLException, TransactionException;
public int getMaximumConcurrentTransactions();
public void setMaximumConcurrentTransactions(int max);
public DataSource getDataSource();
public void setDataSource(DataSource ds);
}
5.2 理解Transaction 接口
public interface Transaction {
public void commit() throws SQLException, TransactionException;
public void rollback() throws SQLException, TransactionException;
public void close() throws SQLException, TransactionException;
public Connection getConnection() throws SQLException, TransactionException;
}