Mybatis自定义类型转换器
使用场景:
当我们实体类数据格式与数据库中格式不一致时,可以通过自定义类型转换器方式去转换我们想要的数据格式。
使用方法
1.实现TypeHander接口
public class FlagEnumHandler implements TypeHandler {
/**
* 根据方法名称可知,这个方法是在insert、update中使用的,用来将实体类的参数转化为数据库类型的参数
*
* @param ps jdbc中要执行的statement
* @param i statement的第i个参数
* @param parameter 参数对象
* @param jdbcType jdbc允许的对象类型
* @throws SQLException
*/
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setInt(i, 0);
return;
}
FlagEnum flag = (FlagEnum) parameter;
if (flag.isFlag()) {
ps.setInt(i, 1);
} else {
ps.setInt(i, 0);
}
}
/**
* 用于将查询结果进行转换
*
* @param rs jdbc执行后的结果集
* @param columnName 列名称
* @return
* @throws SQLException
*/
@Override
public Object getResult(ResultSet rs, String columnName) throws SQLException {
int flag = rs.getInt(columnName);
Boolean flagBoolean = Boolean.FALSE;
if (flag == 1) {
flagBoolean = Boolean.TRUE;
}
return FlagEnum.getValue(flagBoolean);
}
@Override
public Object getResult(ResultSet rs, int columnIndex) throws SQLException {
return null;
}
@Override
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
return null;
}
}
2.在mybatis配置文件或者mapper中配置typeHandler
(1)mybatis配置文件中配置typeHandler属于全局变量,只要符合条件的全部处理。
<typeHandlers>
<typeHandler handler="com.study.mybatis.utils.FlagEnumHandler" javaType="com.study.mybatis.utils.FlagEnum" jdbcType="INTEGER"></typeHandler>
</typeHandlers>
注:这里的jdbcType就是setParameter方法中的第四个参数。
(2)mapper中配置typeHandler中属于局部变量,只适配当前指定的变量值。
查询语句:
<resultMap id="getUserInfoResultMap" type="com.study.mybatis.User">
<result property="userId" column="UserId"></result>
<result property="userName" column="UserName"></result>
<result property="flag" column="Flag" typeHandler="com.study.mybatis.utils.FlagEnumHandler"></result>
</resultMap>
插入语句:
<insert id="insertUserInfo" parameterType="com.study.mybatis.User">
insert into user_info (userId,userName,flag) values (#{userId},#{userName},#{flag,typeHandler=com.study.mybatis.utils.FlagEnumHandler})
</insert>