引言

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

1、typeHandles的基础知识

TypeHandler 在 MyBatis 中是一个用于处理 Java 类型和数据库类型之间映射转换的接口。简而言之,它负责:

  1. Java到数据库的映射:在执行 SQL 语句时,TypeHandler 将 Java 类型转换为数据库可以理解的类型。

  2. 数据库到Java的映射:在读取数据库结果时,TypeHandler 将数据库类型转换回 Java 类型。

2、场景复现

首先建立了一个t_user表存储用户信息,这个表中有一栏favorites是记录个人爱好的,爱好包括篮球、足球、排球:



在Java的User对象对应的是一个String类型的List,而在数据库中是用分号分隔的字符表示,比如:"basketball;football;volleyball",

所以我们需要创建一个继承了BaseTypeHandler的类(BaseTypeHandler实现了TypeHandler接口,使用BaseTypeHandler更简单),

@MappedTypes定义需要被拦截的java类型 @MappedJdbcTypes配置jdbc类型,这里的JdbcType必须org.apache.ibatis.type.JdbcType中的枚举类型,

然后还需要实现BaseTypeHandler抽象类中一系列的get set方法,具体实现的代码如下:

@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class)
public class ListVarcharTypeHandler extends BaseTypeHandler<List<String>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<String> list, JdbcType jdbcType) throws SQLException {
System.out.println("setNonNullParameter ...... "); //a,b,c,d
//处理数据 将List转换为特定格式的字符串
StringBuffer sb = new StringBuffer();
String msg = null;
if(list != null){
for(String p : list){
sb.append(p).append(";");
}
msg = sb.toString();
msg = msg.substring(0,msg.length()-1);
}
ps.setString(i,msg);
} /**
* 获取非空的结果集
* @param rs
* @param columnName
* @return
* @throws SQLException
*/
@Override
public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
System.out.println(111);
System.out.println( Arrays.asList(rs.getString(columnName).split(";")));
return Arrays.asList(rs.getString(columnName).split(";"));
} @Override
public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
System.out.println(222);
return Arrays.asList(rs.getString(columnIndex).split(";"));
} @Override
public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
System.out.println(333);
return Arrays.asList(cs.getString(columnIndex).split(";"));
}
}

创建完类后,我们还需要配置xml文件,一个是映射文件,一个mybatis配置文件:

...
<!-- 使用将集合转化为对应的数据类型的注解 -->
<typeHandlers>
<typeHandler handler="com.doing.typehandle.ListVarcharTypeHandler" />
</typeHandlers>
...
...
<!-- 对指定的结果进行类型转换 -->
<resultMap id="userMap" type="com.doing.pojo.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<result property="gender" column="gender"/>
<result property="favorites" column="favorites" typeHandler="com.doing.typehandle.ListVarcharTypeHandler"/>
</resultMap> <!-- 添加用户信息 -->
<insert id="addUser" parameterType="com.doing.pojo.User" >
insert into t_user (id,username,address,gender,favorites)values(#{id},#{username},#{address},#{gender},#{favorites,typeHandler=com.doing.typehandle.ListVarcharTypeHandler})
</insert> <!-- 查询所有用户信息 -->
<select id="queryAll" resultMap="userMap">
select * from t_user
</select> <!-- 根据用户编号查询用户信息 -->
<select id="queryById" parameterType="java.lang.Integer"
resultMap="userMap">
select * from t_user where id = #{id};
</select>
...

在配置完成之后,点击运行:

3、总结

TypeHandler是一个用于处理 Java 类型和数据库类型之间映射转换的接口,BaseTypeHandler是实现了TypeHandler接口的抽象类,

使用BaseTypeHandler能够处理数据库数据结构和bean对象数据类型之间的转换。

Mybatis之TypeHandler使用教程的更多相关文章

  1. [转]Mybatis之TypeHandler使用教程

    Mybatis之TypeHandler使用教程 https://blog.csdn.net/jokemqc/article/details/81326109 深入浅出Mybatis系列(五)---Ty ...

  2. Spring+SpringMvc+Mybatis框架集成搭建教程

    一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...

  3. Mybatis使用TypeHandler实现数据的加解密转换

    参考: MyBatis之TypeHandler: https://www.cnblogs.com/yulinfeng/p/5991170.html   前段时间收到这么个需求:为安全起见,要求在数据库 ...

  4. mybatis 枚举typeHandler

    枚举typeHandler 在绝大多数情况下,typeHandler因为枚举而使用,MyBatis已经定义了两个类作为枚举类型的支持,这两个类分别是: •EnumOrdinalTypeHandler. ...

  5. MyBatis中的OGNL教程

    MyBatis中的OGNL教程 有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了OGNL却不知道在MyBatis中如何使用,本文就是讲如何在MyBatis中使用OGNL. 如果我们搜索 ...

  6. 使用Mybatis的TypeHandler加解密数据

    使用Mybatis的TypeHandler加解密数据 一.背景 二.解决方案 三.需求 四.实现思路 1.编写一个实体类,凡是此实体类的数据都表示需要加解密的 2.编写一个加解密的`TypeHandl ...

  7. mybatis完美的实战教程

    文件夹(? )[-] (读者注:事实上这个应该叫做非常基础的入门一下下,假设你看过Hibernate了那这个就非常的简单) 文章来源:http://blog.csdn.net/techbirds_ba ...

  8. MyBatis之TypeHandler

    在大学写web应用的时候经常会遇到这么个问题,当我要插入一条数据,某个数据是Date类型,数据库中却是VARCHAR类型,这个时候可能会傻乎乎的先把这个数据自己手动转换成String类型再插入到数据库 ...

  9. 关于mybatis中typeHandler的两个案例

    在做开发时,我们经常会遇到这样一些问题,比如我有一个Java中的Date数据类型,我想将之存到数据库的时候存成一个1970年至今的毫秒数,怎么实现?再比如我有一个User类,User类中有一个属性叫做 ...

  10. mybatis的typeHandler

    typeHandler作用: 1.传参时将javaType类型转换成jdbcType 2.结果集中ResultSet中取值时,jdbcType转换为javaType; 系统自定义的typeHandle ...

随机推荐

  1. 10 Myths About Introverts

    By Carl King [ Translations: Spanish| German | Dutch | Italian | Portuguese ] I wrote this list in l ...

  2. 再学Blazor——概述

    简介 Blazor 是一种 .NET 前端 Web 框架,同时支持服务器端呈现和客户端交互性. 使用 C# 语言创建丰富的交互式 UI 共享前后端应用逻辑 可以生成混合桌面和移动应用 受益于 .NET ...

  3. CF433B

    题目简化和分析: 为了更加快速的求出答案,好像没前缀和快速. 为了大家更好的理解线段树,我们使用了线段树. 如果您并不了解线段树,可以转战模板. 因为我们知道线段树可以快速求区间和,于是我们建两棵树. ...

  4. 13. 用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP中的压缩gzip,deflate,brotli算法

    用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP中的压缩gzip,deflate,brotli算法 项目 ++wmproxy++ gite: https://gitee.com/ ...

  5. [glibc] 带着问题看源码 —— exit 如何调用 atexit 处理器

    前言 之前在写 apue 系列的时候,曾经对系统接口的很多行为产生过好奇,当时就想研究下对应的源码,但是苦于 linux 源码过于庞杂,千头万绪不知从何开启,就一直拖了下来. 最近在查一个问题时无意间 ...

  6. SpringBoot自动配置原理解析

    1: 什么是SpringBoot自动配置 首先介绍一下什么是SpringBoot,SpringBoost是基于Spring框架开发出来的功能更强大的Java程序开发框架,其最主要的特点是:能使程序开发 ...

  7. Unity - UIWidgets 1. 从Hello world开始

    安装参照github的README.UIWidgets相当于Flutter的一个Unity实现(后面表示UIWidgets和UGUI区别时直接称"Flutter"),是把承载的所有 ...

  8. c#装饰器模式详解

    基础介绍:   动态地给一个对象添加一些额外的职责.适用于需要扩展一个类的功能,或给一个类添加多个变化的情况.   装饰器,顾名思义就是在原有基础上添加一些功能.   大家都只知道如果想单纯的给原有类 ...

  9. 暴力+分治+贪心+DP:最大子序列和

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 ...

  10. 提升开发技能:10个高级的JavaScript技巧

    前言 在这个快速发展的数字时代,JavaScript作为一种广泛应用的编程语言,其重要性愈发凸显.为了在竞争激烈的开发领域中保持竞争力,不断提升自己的技能是至关重要的.本文小编将您介绍10个高级的Ja ...