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,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入门系列三之类型转换器的更多相关文章
- Struts入门学习(三)---自定义类型转换器
类型转换器是将浏览器传递的参数进行转换为了与服务器端的参数匹配,先举个例子如果我们想往服务器传递日期类型的参数时我们要怎么让浏览器传过去的让服务器明白 我们新建一个类 ConverterTest.ja ...
- mybatis入门系列二之输入与输出参数
mybatis入门系列二之详解输入与输出参数 基础知识 mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType 1. 返回 ...
- C# 互操作性入门系列(三):平台调用中的数据封送处理
好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...
- [转]C# 互操作性入门系列(三):平台调用中的数据封送处理
参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...
- MyBatis学习系列三——结合Spring
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring MyBatis在项目中应用一般都要结合Spring,这一章主要把MyBat ...
- 【转载】 mybatis入门系列四之动态SQL
mybatis 详解(五)------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when, ...
- mybatis入门系列一之创建mybatis程序
Mybatis基础系列一 创建第一个mybatis程序 需要配置项 1. 在conf.xml的需要配置配置两个标签数据库连接和mapper,xml文件加载信息 <-- 进行数据库环境参数的配置 ...
- ActiveMQ入门系列三:发布/订阅模式
在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...
- mybatis入门基础(三)----SqlMapConfig.xml全局配置文件解析
一:SqlMapConfig.xml配置文件的内容和配置顺序如下 properties(属性) settings(全局配置参数) typeAiases(类型别名) typeHandlers(类型处理器 ...
随机推荐
- WebRTC MCU( Multipoint Conferencing Unit)服务器调研
接触过的有licode.kurento. licode的缺陷:文档支持有限,licode的app client库只有js的 kurento的优势:文档齐全,Demo俱备,封装API比较齐全.它的主要特 ...
- HTTP协议简单记录
http协议的格式 1. 首行 2. 头 3. 空行 4. 体 http请求头 #Referer 请求来自哪里,如果是在http://www.baidu.com上点击链接发出的请求,那么Referer ...
- Android Zxing 转换竖屏扫描且提高识别率
最近的一个Android需要用到扫码功能,用的是Zxing开源库.Zxing的集成就不说了,但是Zxing默认的是横屏扫码,在实际生产中并不适用,需要改为竖屏扫描. 转竖屏步骤: 1>. And ...
- 计算机协议、标准以及OSI模型的简单介绍
由概念启发学习,引导学习.本篇文章中包含了一些最基本的概念和底层知识.虽然零碎,但是这是基础. 一.协议和标准 协议指的是一组控制数据通信的规则.协议有三要素:语法(syntax),语义(semant ...
- 重写equals时,遵守的规定
0 正确的equals方法 public class MyClass { // 主要属性1 private int primaryAttr1; // 主要属性2 private int prima ...
- SSM-SpringMVC-12:SpringMVC中BeanNameViewResolver这种视图解析器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 视图解析器,这个很熟悉啊,之间就用过,就是可以简写/和.jsp的InternalResourceViewRes ...
- SSM-Spring-03:Spring中AOP的初窥和入门小案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- AOP:面向切面编程 AOP的主要作用:是为了程序员更好的关注"业务",专心"做 ...
- PHP访问数据库配置通用方法
提取一种对数据库配置的通用方式 目的是通过通用类访问配置文件的方式,提供对数据库连接的动态获取和设置,使开发时和生产应用时都能够提供灵活的.简化的.解耦的操作方式.比如在配置文件中配置好两套数据库访问 ...
- RecyclerView android
RecyclerView是用来替代ListView.GridView的一个牛掰的控件.用起来更灵活,还能实现线性布局(横向.纵向).网格布局.瀑布流等美观的UI. 在使用RecyclerView时候, ...
- 从JVM内存管理的角度谈谈JAVA类的静态方法和静态属性
在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的 ...