mybatis篇
TypeHandler在mybatis中是一个比较重要的功能,其作用是帮我们把数据库中的类型映射成java中的类型,比如Varchar -> String。mybatis已经内置了大量的TypeHandler
image
然而有时候这些内置的TypeHandler都不满足我们的业务需求时,就需要自定义自己的TypeHandler了。自定义TypeHandler有如下几个步骤:
编写类继承至BaseTypeHandler<T> 其中T为需要转换成的java类型
重写父类的抽象方法
注册TypeHandler
Mapper.xml中resultMap配置字段的TypeHandler
package single.mybatis.mapper.typehandle;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
// 该注解限定了只对jdbctype=tinyint类型起作用
@MappedJdbcTypes(JdbcType.TINYINT)
public class SexHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if ("女".equals(parameter)) {
ps.setInt(i, 2);
} else {
ps.setInt(i, 1);
}
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return tansSex(rs.getInt(columnName));
}
private String tansSex(int sex) {
if (sex == 1) {
return "男";
}
return "女";
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return tansSex(rs.getInt(columnIndex));
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return tansSex(cs.getInt(columnIndex));
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 设置驼峰映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 日志打印 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<!-- 开启别名 -->
<package name="single.mybatis.mapper.entity"/>
</typeAliases>
<!-- 注册TypeHandler -->
<typeHandlers>
<typeHandler handler="single.mybatis.mapper.typehandle.SexHandler"></typeHandler>
</typeHandlers>
<!-- 读取配置文件 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.174.128:3306/mybatis?characterEncoding=utf-8&autoReconnect=true&allowMutiQueries=true&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="single.mybatis.mapper.dao"/>
</mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="single.mybatis.mapper.dao.MybatisUserinfoMapper">
<resultMap type="single.mybatis.mapper.entity.MybatisUserinfoModel" id="MybatisUserinfoMap">
<result property="id" column="id" jdbcType="INTEGER"/>
<result property="username" column="username" jdbcType="VARCHAR"/>
<result property="age" column="age" jdbcType="INTEGER"/>
<result property="sex" column="sex" jdbcType="TINYINT" typeHandler="single.mybatis.mapper.typehandle.SexHandler"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>
<select id="selectList" resultMap="MybatisUserinfoMap">
select * from mybatis_userinfo
</select>
<insert id="insert" parameterType="single.mybatis.mapper.entity.MybatisUserinfoModel">
INSERT INTO
mybatis_userinfo(`username`, `age`, `sex`, `create_time`, `update_time`)
VALUES
(#{username}, #{age}, #{sex,typeHandler=single.mybatis.mapper.typehandle.SexHandler}, #{createTime}, #{updateTime});
</insert>
</mapper>
image
执行selectList方法,可以看到sex=1的变为转换成男了,在执行下insert方法看下是否会把性别转换成数据库对应的类型
image
image
image
可以看到,我们设置的性别‘女’也被映射成了2了,至此,TypeHandler使用结束了,可以定制很多个性化的操作,比如mysql中的json类型可以转换成java中的对象,新增的时候把对象转换成json存储,用法挺多的。