场景
数据入库前需要加密,替换特殊字符,枚举类型转化;数据读取时需要对数值字段null保护等。。
应用实例
- 1.字段加密入库,解密读取
public class EncodeTypeHandler implements TypeHandlerCallback {
@Override
public void setParameter(ParameterSetter parameterSetter, Object o) throws SQLException {
String id = encode((String) o);
parameterSetter.setString(id);
}
@Override
public Object getResult(ResultGetter resultGetter) throws SQLException {
return decode(resultGetter.getString());
}
@Override
public Object valueOf(String s) {
return s;
}
}
- 2.字段特殊字符处理(替换’\0’)
public class SpecialCharTypeHandler implements TypeHandlerCallback {
@Override
public void setParameter(ParameterSetter parameterSetter, Object o) throws SQLException {
if (o == null) {
parameterSetter.setString(null);
return;
}
String id = (String)o;
parameterSetter.setString(id.replaceAll("\0", ""));
}
@Override
public Object getResult(ResultGetter resultGetter) throws SQLException {
return resultGetter.getString();
}
@Override
public Object valueOf(String s) {
return s;
}
}
- 3.字段保护(防止数据库里的值是null)
public class IntegerTypeHandler implements TypeHandlerCallback {
@Override
public Object getResult(ResultGetter getter) throws SQLException {
if (getter.wasNull()) {
return 0;
}
return getter.getInt();
}
@Override
public void setParameter(ParameterSetter setter, Object parameter)
throws SQLException {
setter.setInt((Integer)parameter);
}
@Override
public Object valueOf(String s) {
return s;
}
}
- 4.枚举类型转化
public class OrderStatusTypeHandler implements TypeHandlerCallback {
@Override
public void setParameter(ParameterSetter parameterSetter, Object o) throws SQLException {
if(o==null)
o = OrderStatus.Init;
int b = ((OrderStatus) o).getCode();
parameterSetter.setInt(b);
}
@Override
public Object getResult(ResultGetter resultGetter) throws SQLException {
if (resultGetter.wasNull())
return null;
int code = resultGetter.getInt();
OrderStatus orderStatus = null;
orderStatus = OrderStatus.getOrderStatus(code);
return orderStatus;
}
@Override
public Object valueOf(String s) {
return s;
}
}
配置
在sqlMapConfig或者在sqlMap都可以配置
- 配置别名使用
1.在sqlMapConfig里配置:
<sqlMapConfig>
<settings enhancementEnabled="true" lazyLoadingEnabled="false" cacheModelsEnabled="false"
useStatementNamespaces="false" maxRequests="32" maxSessions="10" maxTransactions="5"/>
<typeAlias alias="SpecialCharTypeHandler" type="com.mo.SpecialCharTypeHandler"/>
<sqlMap resource="sqlmap/PayOrderDao.xml"/>
</sqlMapConfig>
2.在sqlMap(PayOrderDao.xml)里配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="SpecialCharTypeHandler" type="com.mo.SpecialCharTypeHandler"/>
...
</sqlMap>
- 根据参数类型匹配使用
1.在sqlMapConfig里配置:
<?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>
<settings enhancementEnabled="true" lazyLoadingEnabled="false" cacheModelsEnabled="true"
useStatementNamespaces="false" maxRequests="32" maxSessions="10" maxTransactions="5"/>
<typeHandler javaType="com.mo.OrderStatus" callback="com.mo.OrderStatusTypeHandler"/>
<sqlMap resource="sqlmap/PayOrderDao.xml"/>
</sqlMapConfig>
2.在sqlMap(PayOrderDao.xml)里配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<typeHandler javaType="com.OrderStatus" callback="com.mo.OrderStatusTypeHandler"/>
...
</sqlMap>
使用
- 别名配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="OrderStatusTypeHandler" type="com.mo.OrderStatusTypeHandler"/>
..
<update id="updatePayStatus">
update tbl_pay_order
set
order_status=#orderStatus,handler=OrderStatusTypeHandler#,
where id=#id#;
</update>
..
</sqlMap>
- 参数类型匹配(不需要指定handler)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<typeHandler javaType="com.mo.OrderStatus" callback="com.mo.OrderStatusTypeHandler"/>
..
<update id="updatePayStatus">
update tbl_pay_order
set
order_status=#orderStatus#,
where id=#id#;
</update>
..
</sqlMap>