• mybatis入门系列三之类型转换器


    mybatis入门系列三之类型转换器

     

    类型转换器介绍

    mybatis作为一个ORM框架,要求java中的对象与数据库中的表记录应该对应
    因此java类名-数据库表名,java类属性名-数据库表字段名,java类属性类型-数据库字段类型
    前面两个都容易设置,但是第三点要求经常会出现java类型和数据库的存储类型不一样, 例如java类型是String,数据库中存储的是char、varchar、text

    对于一般常见的类型对应,mybatis已经内部包含了类型转换器,使String类型的java属性可以直接插入到数据库中,也可以直接从数据库中取出直接赋值给对象的属性
     

    mybatis内置可以自动转换的数据类型有

     

    自定义类型转换器

    但是也会经常出现数据库字段类型与java类属性类型不能自动转换的情况,这时候就需要我们自己定义一个类型转换器

    例如下面的需求:

    student类中有一个属性是interests,字段类型是String[],
    但是保存在数据库中的字段属性是varchar,传过来的每一个String用,分隔

     

    解决方法

    步骤一:自定义一个类型转换器

     

     1//继承BaseTypeHandler<T>类(也可以实现TypeHandler 接口,其实我们要继承的这个类也就是实现了TypeHandler接口)  
    2//<T>是一个泛型,我们将其修改为我们相对应的java属性类型,这里就是String[] 
    3
    4public class StringArrayTypeHandler extends BaseTypeHandler<String[]> {
    5
    6    @Override
    7    public void setNonNullParameter(PreparedStatement preparedStatement, int i, String[] strings, JdbcType jdbcType) throws SQLException 
    8    {
    9        StringBuffer result = new StringBuffer();
    10        for (String value:strings
    11             ) {
    12            result.append(value).append(",");
    13        }
    14        result.deleteCharAt(result.length()-1);
    15        preparedStatement.setString(i,result.toString());
    16    }
    17
    18    @Override
    19    public String[] getNullableResult(ResultSet resultSet, String s) throws SQLException {
    20        return getStringArray(resultSet.getString(s));
    21    }
    22
    23    @Override
    24    public String[] getNullableResult(ResultSet resultSet, int i) throws SQLException {
    25        return getStringArray(resultSet.getString(i));
    26    }
    27
    28    @Override
    29    public String[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
    30        return getStringArray(callableStatement.getString(i));
    31    }
    32
    33    private String[] getStringArray(String columnValue) {
    34        if(columnValue == null){
    35            return null;
    36        }
    37        return columnValue.split(",");
    38    }
    39}

     

    步骤二:注册上面编写的类型转换器

    在conf.xml文件里增加以下配置

    1<typeHandlers>
    2        <typeHandler handler="huanglf.mybatis.util.StringArrayTypeHandler" javaType="[Ljava.lang.String;" jdbcType="VARCHAR"/>
    3</typeHandlers>

     

    步骤三:编写SQL语句,注意这里需要用resultMap

    1<resultMap id="studentMapping" type="Student">
    2    <id  property="stuId" column="stuno"></id>
    3    <result property="interests" column="interests" javaType="[Ljava.lang.String;" jdbcType="VARCHAR"></result>
    4</resultMap>

    然后我们就可以进行相应的插入、查询等操作

    插入

     1//mapper.xml文件
    2<insert id="addStudentWithInterests" parameterType="Student">
    3    insert into  student (stuno,interestsvalues (#{stuId}, #{interests});
    4</insert>
    5
    6//test文件
    7public static void addStudentWithInterests(StudentMapper studentMapper){
    8        Student student = new Student();
    9        student.setStuId(5);
    10        String[] interests = {"swim","read"};
    11        student.setInterests(interests);
    12        studentMapper.addStudentWithInterests(student);
    13        System.out.println("插入成功");
    14    }

     

    查询

    1<select id="queryStudentInterests" resultMap="studentMapping">
    2    select stuno, interests from student where stuno = 1
    3</select>

     

  • 相关阅读:
    Linux 常用命令
    公钥,私钥和数字签名
    MySQL中的datetime与timestamp比较
    SQL开发技巧
    socket心跳包机制
    vue 路由回退,实现刷新原页面数据
    HTTP1.0、HTTP1.1 和 HTTP2.0 的区别
    Xshell常用命令
    学习Dart flutter --1
    学习JavaScript数据结构与算法(第2版)--01
  • 原文地址:https://www.cnblogs.com/huanglf714/p/10778592.html
Copyright © 2020-2023  润新知