mybatis之TypeHandler

mybatis篇

TypeHandler在mybatis中是一个比较重要的功能,其作用是帮我们把数据库中的类型映射成java中的类型,比如Varchar -> String。mybatis已经内置了大量的TypeHandler

image

然而有时候这些内置的TypeHandler都不满足我们的业务需求时,就需要自定义自己的TypeHandler了。自定义TypeHandler有如下几个步骤:

  1. 编写类继承至BaseTypeHandler<T> 其中T为需要转换成的java类型

  2. 重写父类的抽象方法

  3. 注册TypeHandler

  4. 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&amp;autoReconnect=true&amp;allowMutiQueries=true&amp;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存储,用法挺多的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。