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:strings11             ) {12            result.append(value).append(",");13        }14        result.deleteCharAt(result.length()-1);15        preparedStatement.setString(i,result.toString());16    }1718    @Override19    public String[] getNullableResult(ResultSet resultSet, String s) throws SQLException {20        return getStringArray(resultSet.getString(s));21    }2223    @Override24    public String[] getNullableResult(ResultSet resultSet, int i) throws SQLException {25        return getStringArray(resultSet.getString(i));26    }2728    @Override29    public String[] getNullableResult(CallableStatement callableStatement, int i) throws SQLException {30        return getStringArray(callableStatement.getString(i));31    }3233    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 = 13</select>

原文地址:https://www.cnblogs.com/huanglf714/p/10778592.html

时间: 2024-10-24 21:48:41

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

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

传送门 C#互操作系列文章: C#互操作性入门系列(一):C#中互操作性介绍 C#互操作性入门系列(二):使用平台调用调用Win32 函数 C#互操作性入门系列(三):平台调用中的数据封送处理 C#互操作性入门系列(四):在C# 中调用COM组件 本专题概要 数据封送介绍 封送Win32数据类型 封送字符串的处理 封送结构体的处理 封送类的处理 小结 一.数据封送介绍 看到这个专题时,大家的第一个疑问肯定是--什么是数据封送呢?(这系列专题中采用假设朋友的提问方式来解说概念,就是希望大家带着问题

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

好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------------------------------------------------------------------- C#互操作系列文章: C#互操作性入门系列(一):C#中互操作性介绍 C#互操作性入门系列(二):使用平台调用调用Win32 函数 C#互操作性入门系列(三):平台调用中的数据封

Xen入门系列三【Xen 管理工具 xm】

xm命令是管理Xen的最基本的工具,可以通过xm --help 来获得帮助. 1. 列出所有正在运行的虚拟操作系统 # xm list PS[1]:可缩写为 xm li2. 启动虚拟机 # 通过配置文件启动虚拟机 # xm create <ConfigFile> # 通过虚拟机名称启动虚拟机,虚拟机必需已存在 xm list 中 # xm start <DomainName> 参数说明: ConfigFile:虚拟机配置文件 DomainName: 虚拟机名称 PS[2]:很多教程

RxJava入门系列三,响应式编程

RxJava入门系列三,响应式编程 在RxJava入门系列一,我向你介绍了RxJava的基础架构.RxJava入门系列二,我向你展示了RxJava提供的多种牛逼操作符.但是你可能仍然没能劝服自己使用RxJava,这一篇博客里我将向你展示RxJava提供的其他优势,没准了解了这些优势,你就真的想去使用RxJava了. 异常处理 直到目前为止,我都没有去介绍onComplete()和onError()方法.这两个方法是用来停止Observable继续发出事件并告知观察者为什么停止(是正常的停止还是因

C语言快速入门系列(三)

C语言快速入门系列(三) 结构化的程序设计 -----------------------------------转载请注明出处:coder-pig 本节引言: 在前面的学习中,我们对C语言的基本语法进行了了解,可以暂时理解成我们学了单词; 现在要做得就是学语法,也就是算法;就是构成一个一个基本的程序! 在这一节中我们要学习的是C语言中的输入输出,以及程序的三种结构(顺序,选择,循环结构) 本节学习路线图: 正文: 1.字符输入/输出函数 2.格式输入/输出函数 跟前面的单个字符的输入输出不同,

Mybatis入门(三)——实例(一)

Mybatis入门(三) 数据库 public class Student { private String sno; public String getSno() { return sno; } public void setSno(String sno) { this.sno = sno; } public String getsName() { return sName; } public void setsName(String sName) { this.sName = sName;

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

在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点模式并用代码实例进行说明,今天就介绍下发布/订阅模式. 一.理论基础 发布/订阅模式的工作示意图: 消息生产者将消息(发布)到topic中,可以同时有多个消息消费者(订阅)消费该消息. 和点对点方式不同,发布到topic的消息会被所有订阅者消费. 当生产者发布消息,不管是否有消费者,都不会保存消息. 一定要先

04.MyBatis别名的设置和类型转换器

别名的设置:(别名不区分大小写): 设置单个别名: <configuration> <properties resource="db.properties" /> <typeAliases> <!-- 设置单个别名 --> <typeAlias type="com.offcn.entity.Person" alias="person"/> <typeAlias type="

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

阅读目录 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 二:properties属性 三:settings全局参数配置 四:typeAiases(别名)--重点掌握 五:typeHandlers(类型处理器) 六:mappers(映射配置) 回到顶部 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 properties(属性) settings(全局配置参数) typeAiases(类型别名) typeHandlers(类型处理器) objectFactor