Nemo

Nemo

路漫漫其修远兮,吾将上下而求索。

Nemo

Nemo

关注TA

路漫漫其修远兮,吾将上下而求索。

  • 普罗旺斯
  • 负责帅就完事了

最近留言

该文章投稿至  综合  板块


mybatis generator 自定义 TypeHandler 对数据库敏感字段进行加解密

2017年11月07 15:35 5,393 0 复制链接

1、先创建一个自定义的类型转换器:

/**
 * 自定义typeHandler
 * 1 插入数据库, 加密 
 * 2 查询,解密 
 * @author Nemo
 *  
 */    
public class CryptTypeHandler implements TypeHandler<CryptType> {    
  
    public CryptType getResult(ResultSet rs, String columnName) throws SQLException {  
        String value="";  
        CryptType v=new CryptType(value);  
        value=rs.getString(columnName);  
        if(value!=null){  
            value=decrypt(value.toString());  
            v.setValue(value);  
        }  
        return v;  
    }  
  
    public CryptType getResult(ResultSet rs, int columnIndex) throws SQLException {  
        String value="";  
        CryptType v=new CryptType(value);  
        value =rs.getString(columnIndex);  
        if(value!=null){  
            v.setValue(value);  
        }  
        return v;  
    }  
  
    public CryptType getResult(CallableStatement cs, int columnIndex) throws SQLException {  
        String value="";  
        CryptType v=new CryptType();  
        value =cs.getString(columnIndex);  
        if(value!=null){  
            v.setValue(value);  
        }  
        return v;  
    }  
  
    public void setParameter(PreparedStatement ps, int i, CryptType parameter, JdbcType arg3) throws SQLException {  
        String value="";  
        if(parameter!=null && parameter.toString()!=null){  
            value=encrypt(parameter.toString());  
        }  
        ps.setString(i, value.toString());  
    }  
      
    /**插入数据库  
     * @param value  
     * @return  
     */    
    private String encrypt(String value) {    
        value=CryptUtils.encrypt(value);  
        return value;  
    }    
        
    /** 从数据库读出  
     * @param value  
     * @return  
     */    
    private String decrypt(String value){    
        value=CryptUtils.decrypt(value);  
        return value;  
    }  
        
}  


然后在mybatis  generator的配置文件中添加需要自动生成的定义:

<table catalog="${mybatis.generator.schema}" tableName="sys_user">
<columnOverride column="id_card_no" jdbcType="VARCHAR" typeHandler="com.nemo.core.CryptTypeHandler"/>
</table>

其中

<columnOverride column="id_card_no" jdbcType="VARCHAR" typeHandler="com.nemo.core.CryptTypeHandler"/>   

则是说明定义sys_user表中的id_card_no字段的转换需要经过自定义的类型转换处理。

  1. columnOverride 对数据库字段重写
  2. CryptTypeHandler自定义typeHandler原理:重写TypeHandlergetResultsetParameter方法,使用sKey进行加解密

至此mybatis generator生成的mapper文件则会添加默认的转换处理了。

打开mybatis generator生成的SysUserMapper.xml文件,可以看到:

<result column="suser_id_card_no" jdbcType="VARCHAR" property="idCardNo" typeHandler="com.nemo.core.CryptTypeHandler" />

如果需要手写的sql,也需要如上定义typeHandler声明。

比如:

where id_card_no = #{id_card_no,jdbcType=VARCHAR,typeHandler=com.nemo.core.CryptTypeHandler}

目前发现的问题是,加密字段不能使用模糊查询了。也许在以后会有一些更好的解决方案。


点赞(0)
点了个评

回复@{{reply.nickName}}