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,interests) values (#{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>

最新文章

  1. String.Format用法
  2. mathlab之floor,ceil,round,int以及fix函数
  3. 【P1825】表达式整除
  4. 0022 Java学习笔记-面向对象-继承、多态、组合
  5. 将gridFS中的图片文件写入硬盘
  6. android中图片的三级缓存cache策略(内存/文件/网络)
  7. 【WPF】Winform调用WPF窗体注意事项
  8. 【leetcode】Intersection of Two Linked Lists(easy)
  9. 【HDOJ】1158 Employment Planning
  10. [poj 1039]Pipes[线段相交求交点]
  11. aliyun 主机Nginx 上配置Drupal 伪静态
  12. IIS7部署MVC站点后,打开无法正常跳转到首页
  13. Javascript—②函数
  14. Android SDK教程
  15. spring学习之spring 插件 for eclipse
  16. 微信小程序语音识别开发过程记录 微信小程序silk转mp3 silk转wav 以及ffmpeg使用
  17. HP DL380服务器RAID信息丢失数据恢复方法和数据恢复过程分享
  18. MyEclipse10+Jdk1.7+OSGI+MySql实现数据库的增删改查
  19. postgresql定位分析消耗CPU高的SQL语句
  20. Typechecking With PropTypes

热门文章

  1. php实现点击文字提交表单并传递数据至下一个页面
  2. SharePoint2013 列表栏设置
  3. PCA算法和python实现
  4. SOFA 源码分析 — 预热权重
  5. Beta 冲刺day 6
  6. Java MD5加密与RSA加密
  7. Python_回调函数
  8. Urllib库的使用
  9. PAT1003:Emergency
  10. 开启irqbalance提升服务器性能