ibatis-TypeHandlerCallback使用

场景

数据入库前需要加密,替换特殊字符,枚举类型转化;数据读取时需要对数值字段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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值