欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Mybatis的TypeHandler实现字段的类型映射转换

程序员文章站 2022-04-23 15:55:58
...

1. mybatis的TypeHandler类型转换

它的作用就是将java类型(javaType)转化为jdbc类型(jdbcType),或者将jdbc类型(jdbcType)转化为java类型(javaType)。

2. 通过一个例子来了解TypeHandler的实现机制

将java字符数组String[]转化成数据库varchar类型。如:String[] interests = {“movie”, “music”}转为”movie,music",同时也能实现从varchar转化为String[] 数组。

  1. 自定义类型转换器
//定义JavaType的数据类型,描述了哪些java类型可被拦截
@MappedTypes({String[].class})
//定义JdbcType类型,这里的类型不可自己随意定义,必须要是枚举类org.apache.ibatis.type.JdbcType所枚举的数据类型。
@MappedJdbcTypes({JdbcType.VARCHAR})
public class StringArrayTypeHandler extends BaseTypeHandler<String[]>{
    /**
     * 把Java类型参数转换为对应的数据库类型
     * @param ps 当前的PreparedStatement对象
     * @param i 当前参数位置
     * @param parameter 当前参数的Java对象
     * @param jdbcType 当前参数的数据库类型
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType) throws SQLException {
        // 由于BaseTypeHandler中已经把parameter为null的情况做了处理,所以这里我们就不用在判断parameter是否为空,直接用就可以了
        StringBuffer result = new StringBuffer();
        for (String value : parameter) {
            result.append(value).append(",");
        }
        result.deleteCharAt(result.length() - 1);
        ps.setString(i, result.toString());
    }

    /**
     * 获取数据结果集时把数据库类型转换为对应的Java类型
     * @param rs 当前的结果集
     * @param columnName 当前的字段名称
     * @return  转换后的Java对象
     * @throws SQLException
     */
    @Override
    public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return this.getStringArray(rs.getString(columnName));
    }

    /**
     * 通过字段位置获取字段数据时把数据库类型转换为对应的Java类型
     * @param rs 当前的结果集
     * @param columnIndex 当前字段的位置
     * @return 转换后的Java对象
     * @throws SQLException
     */
    @Override
    public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return this.getStringArray(rs.getString(columnIndex));
    }

    /**
     * 调用存储过程后把数据库类型的数据转换为对应的Java类型
     * @param cs  当前的CallableStatement执行后的CallableStatement
     * @param columnIndex  当前输出参数的位置
     * @return
     * @throws SQLException
     */
    @Override
    public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return this.getStringArray(cs.getString(columnIndex));
    }

    /**
     * 讲”movie,music"转化为数组对象
     * @param columnValue
     * @return
     */
    private String[] getStringArray(String columnValue) {
        if (columnValue == null)
            return null;
        return columnValue.split(",");
    }
}
  1. 配置文件里配置自定义的TypeHandler
<typeHandlers>
    <!--<typeHandler handler="com.yongssu.mybatis.demo1.StringArrayTypeHandler" javaType="[Ljava.lang.String;" jdbcType="VARCHAR"/>-->
    <typeHandler handler="com.yongssu.mybatis.demo1.StringArrayTypeHandler"/>
</typeHandlers>

如果在自定义类型转化器时通过注解标注了对应的javaType以及jdbcType,则在配置文件中不需要再次声明;如果没有,则需要在配置文件中说明avaType和jdbcType。

  1. 声明包含String[]数组的学生类
public class Student {
    private int student_id;
    private String student_name;
    private int student_age;
    private String student_phone;
    private String[] interests;
    public Student() {
        super();
    }
    public int getStudent_id() {
        return student_id;
    }
    public void setStudent_id(int student_id) {
        this.student_id = student_id;
    }
    public String getStudent_name() {
        return student_name;
    }
    public void setStudent_name(String student_name) {
        this.student_name = student_name;
    }
    public int getStudent_age() {
        return student_age;
    }
    public void setStudent_age(int student_age) {
        this.student_age = student_age;
    }
    public String getStudent_phone() {
        return student_phone;
    }
    public void setStudent_phone(String student_phone) {
        this.student_phone = student_phone;
    }
    public String[] getInterests() {
        return interests;
    }
    public void setInterests(String[] interests) {
        this.interests = interests;
    }
    @Override
    public String toString() {
        return "Student{" +
                "student_id=" + student_id +
                ", student_name='" + student_name + '\'' +
                ", student_age=" + student_age +
                ", student_phone='" + student_phone + '\'' +
                ", interests=" + Arrays.toString(interests) +
                '}';
    }
}
  1. 总结
    通过上面的例子,可以发现要实现自定义TypeHandler,只需要继承BaseTypeHandler,然后实现相应的转换规则就可以了。
    原文链接:https://www.jianshu.com/p/6172c7f6e27e
相关标签: Mybatis TypeHandler