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>

mybatis入门系列三之类型转换器的更多相关文章

  1. Struts入门学习(三)---自定义类型转换器

    类型转换器是将浏览器传递的参数进行转换为了与服务器端的参数匹配,先举个例子如果我们想往服务器传递日期类型的参数时我们要怎么让浏览器传过去的让服务器明白 我们新建一个类 ConverterTest.ja ...

  2. mybatis入门系列二之输入与输出参数

    mybatis入门系列二之详解输入与输出参数   基础知识   mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType 1. 返回 ...

  3. C# 互操作性入门系列(三):平台调用中的数据封送处理

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  4. [转]C# 互操作性入门系列(三):平台调用中的数据封送处理

    参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...

  5. MyBatis学习系列三——结合Spring

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...

  6. 【转载】 mybatis入门系列四之动态SQL

    mybatis 详解(五)------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when, ...

  7. mybatis入门系列一之创建mybatis程序

    Mybatis基础系列一 创建第一个mybatis程序 需要配置项 1. 在conf.xml的需要配置配置两个标签数据库连接和mapper,xml文件加载信息 <-- 进行数据库环境参数的配置 ...

  8. ActiveMQ入门系列三:发布/订阅模式

    在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...

  9. mybatis入门基础(三)----SqlMapConfig.xml全局配置文件解析

    一:SqlMapConfig.xml配置文件的内容和配置顺序如下 properties(属性) settings(全局配置参数) typeAiases(类型别名) typeHandlers(类型处理器 ...

随机推荐

  1. WebLogic SSRF

    本文主要记录一下Weblogic SSRF 利用的操作过程. 一.WebLogic SSRF漏洞简介 漏洞编号:CVE-2014-4210 漏洞影响: 版本10.0.2,10.3.6 Oracle W ...

  2. Java虚拟机-类加载

    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行检验.转换解析和初始化,最终形成了可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制.在Java语言里,类型的加载.连接和初始化过 ...

  3. html居中定位

    <!DOCTYPE html PUBLIC "-//W3C//Ddiv XHTML 1.0 divansitional//EN" "http://www.w3.or ...

  4. swagger在nginx下出现无法请求接口的问题

    在Nginx配置绑定域名的时候,增加proxy_set_header即可 示例如下: server { listen ; server_name xxx.dev.internal.XXX.com; l ...

  5. flash builder 4.6与myecilpse 10.7集成

    一.在flash builder 4.0以后就没有单独提供插件版的flash builder了,因此必须先安装完整版的flash builder,再进行插件集成. 二.集成过程比较简单但也有几个要注意 ...

  6. NopCommerce是什么(转自CNSD)

    NopCommerce是什么 nopCommerce--最好的免费购物车!nopCommerce是一个开源的解决方案.它是一个具有综合功能.对于新在线业务来说亦易于使用的解决方案,同时它也是一个功能强 ...

  7. 团队项目第二阶段个人进展——Day7

    一.昨天工作总结 冲刺第七天,动手完成了一个demo来实现数据的上传与下载 二.遇到的问题 代码逻辑没看太懂 三.今日工作规划 对发布页面的数据进行处理,实现能够请求和响应,并学习如何实现图片的上传与 ...

  8. .NET开发微信小程序-生成二维码

    1.生成小程序二维码功能 直接请求相应的链接.传递相应的参数 以生成商铺的付款码为例: var shopsId = e.ShopsId //付款码的参数 var codeModel = new fun ...

  9. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  10. 指针超强汇总(谨记优先级:() > [] > *)

    参考:http://blog.chinaunix.net/uid-20120277-id-5760985.html C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则 ...