引言

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. vim vimtutor

    =============================================================================== =      歡     迎     閱 ...

  2. PostgreSQL快速导入千万条数据

    目录 一.测试环境 二.修改源数据为COPY可用的格式 三.DDL 四.COPY 五.结论 为了与MySQL做个对比,做一个PG的数据导入测试,使用COPY方式,测试环境保持一致,具体如下所述. 一. ...

  3. ts 终于搞懂TS中的泛型啦! | typescript 入门指南 04

    大家好,我是王天~ 这篇文章是 ts入门指南系列中第四篇,主要讲解ts中的泛型应用,泛型在ts中是比较重要的概念,我花挺长时间才搞明白的,希望能帮助到大家 ~ ** ts 入门指南系列 ** Ts和J ...

  4. [ABC218F] Blocked Roads 题解

    Blocked Roads 题目大意 给定一张 \(n\) 个点,\(m\) 条边的无向图,每条边的边权均为 \(1\).对于每一个 \(i\in [1,m]\) 求出从点 \(1\) 到 \(n\) ...

  5. 鬼谷子的钱袋(lgP2320)

    主要思路:二进制拆分. 先将 \(m\) 进行二进制拆分. 注意金币总数有限,也就是说拆分后可能会多出来一组.多出来的这组如果不是 \(2^n\) 就不需要考虑了,因为不会和前面的重复. 接下来考虑重 ...

  6. 拿到开发板需要做的事情 -- 配置Python环境

    1.查看系统时间 date -R 2.修改系统时间 windows上时间项目时间正常,Ubuntu16.04上时间错误 - 贾斯丁哔哔 - 博客园 (cnblogs.com) 3.安装pip3 sud ...

  7. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-24-处理单选和多选按钮-上篇

    1.简介 在工作和生活中,经常会遇到我们需要进行选择的情况,比如勾选我们选择性别,男女两个性别总是不能同时选中的,再比如我们在选择兴趣爱好时,我们可以选择多个自己感兴趣的话题,比如:篮球.足球.电竞等 ...

  8. 推理(Inference)与预测(Prediction)

    在机器学习的背景下,很多人似乎混淆了这两个术语.这篇文章将试图澄清我们所说的这两个词是什么意思,每一个词在哪里有用,以及它们是如何应用的.在这里,我将举几个例子来直观地理解两者之间的区别. 推理和预测 ...

  9. mediakit 源码 轻微微 学习总结

    mediakit 源码 轻微微 学习总结 概要 项目地址:https://github.com/ZLMediaKit/ZLMediaKit 此项目我们把他做为一个流媒体服务器,我们会有srt和rtsp ...

  10. Java开发者的Python快速进修指南:异常捕获

    在之前的学习中,我们已经讲解了函数和控制流等基本概念.然而,在接触实际业务时,你会发现异常捕获也是必不可少的一部分,因为在Java编程中,异常处理是不可或缺的.Python的异常捕获与Java的异常捕 ...