一起学习Mybatis----配置 类型处理器typeHandlers

版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/weixin_43549578/article/details/84876198

      MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

    Mybatis系统自带的类型处理器:

    

   需要注意一下:

         数值类型的精度,数据库int、 double、 decimal这些类型和java的精度、长度都是不一样的。
        时间精度,取数据到日用 Date OnlyTypeHandler即可,用到精度为秒的用 SqlTimestampTypeHandler等。 

自定义数组类型处理器:

ArrayTypeHandler

public class ArrayTypeHandler  extends BaseTypeHandler<Object> {
    private Class type;

    private static final String TYPE_NAME_VARCHAR = "varchar";
    private static final String TYPE_NAME_INTEGER = "integer";
    private static final String TYPE_NAME_BOOLEAN = "boolean";
    private static final String TYPE_NAME_NUMERIC = "numeric";

    public ArrayTypeHandler(Class type){
        if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
        this.type = type;
    }



    private Object[] getArray(Array array) {

        if (array == null) {
            return null;
        }

        try {
            return (Object[]) array.getArray();
        } catch (Exception e) {
        }

        return null;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {

        String typeName = null;
        if (parameter instanceof Integer[]) {
            typeName = TYPE_NAME_INTEGER;
        } else if (parameter instanceof String[]) {
            typeName = TYPE_NAME_VARCHAR;
        } else if (parameter instanceof Boolean[]) {
            typeName = TYPE_NAME_BOOLEAN;
        } else if (parameter instanceof Double[]) {
            typeName = TYPE_NAME_NUMERIC;
        }

        if (typeName == null) {
            throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
        }

        // 这3行是关键的代码,创建Array,然后ps.setArray(i, array)就可以了
        Connection conn = ps.getConnection();
        Array array = conn.createArrayOf(typeName,(Object[])parameter);
        ps.setArray(i, array);
    }

    @Override
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return getArray(rs.getArray(columnName));
    }

    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return getArray(rs.getArray(columnIndex));
    }

    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return getArray(cs.getArray(columnIndex));
    }
}

Json类型处理器:

JSONTypeHandler:

public class JSONTypeHandler extends BaseTypeHandler<Object> {

    private Class clazz;

    public JSONTypeHandler(Class clazz) {
        if (null == clazz) {
            throw new IllegalArgumentException("Type argument can not be null!");
        }
        this.clazz = clazz;
    }

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i, JSONUtil.stringfy(parameter));
    }

    @Override
    public Object getNullableResult(ResultSet resultSet, String columnName) throws SQLException {

        return JSONUtil.parse(resultSet.getString(columnName), clazz);
    }

    @Override
    public Object getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {

        return JSONUtil.parse(resultSet.getString(columnIndex), clazz);
    }

    @Override
    public Object getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {

        return JSONUtil.parse(callableStatement.getString(columnIndex), clazz);
    }
}

配置:

<typeHandlers>
		<typeHandler handler="com.xx.mybatis.typehandler.ArrayTypeHandler"
					 javaType="java.lang.Integer" jdbcType="ARRAY" />
		<typeHandler handler="com.xx.mybatis.typehandler.ArrayTypeHandler"
					 javaType="[Ljava.lang.String;" jdbcType="ARRAY" />
		<typeHandler handler="com.xx.mybatis.typehandler.json.JSONTypeHandler"
					 javaType="java.util.List" jdbcType="OTHER" />
	</typeHandlers>

mapper.xml中的使用方式:

 <resultMap id="BaseResultMap" type="com.xx.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="creator_id" property="creatorId" jdbcType="VARCHAR" />
    <result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
    <result column="updater_id" property="updaterId" jdbcType="VARCHAR" />
    <result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
    <result column="district_area" property="districtArea" jdbcType="OTHER" typeHandler="com.xx.mybatis.typehandler.json.JSONTypeHandler"/>
    <result column="is_del" property="isDel" jdbcType="SMALLINT" />
  </resultMap>

枚举类型处理器:

     注意 EnumTypeHandler 在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,它会处理任意继承了 Enum 的类。

    Mybatis内部提供了两种类型处理器

          org.apache.ibatis.type.EnumTypeHandler   使用枚举名称处理java枚举类型,其对应的是一个字符串

         org.apache.ibatis.type.EnumOrdinalTypeHandler  默认的  

   EnumTypeHandler是使用枚举字符串名称作为参数传递的, EnumOrdinalTypeHandler是使用整数下标作为参数传递的

   性别枚举的使用:

public enum Sex {

    MALE(1,"男"),
    FEMALE(2,"女");

    private int id;

    private String name;

    Sex(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static  Sex getSex(int id){
        if(id==1){
            return MALE;
        }else if(id==2) {
            return FEMALE;
        }
        return null;

    }

}

配置:

<typeHandler handler=" org.apache.ibatis.type.EnumOrdinalTypeHandler"
					 javaType="com.toutiao.agent.Sex" />

<result column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>

猜你喜欢

转载自blog.csdn.net/weixin_43549578/article/details/84876198