引言

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. md5sum 文件一致性校验

    1. 背景 在网络传输.设备之间转存.复制大文件等时,可能会出现传输前后数据不一致的情况.这种情况在网络这种相对更不稳定的环境中,容易出现.那么校验文件的完整性,也是势在必行的. md5sum命令用于 ...

  2. 【图像处理】如何使用matplotlib 库显示灰度图像为自定义颜色

    项目场景 我这里有一张名为airplane.jpg的灰度图像灰度图像 使用 matplotlib 库读取并显示: import matplotlib.pyplot as plt root=" ...

  3. 2023_10_09_MYSQL_DAY_01_笔记

    2023_10_09_MYSQL_DAY_01 #运算符的优先级 SELECT ename, job, sal FROM emp WHERE ( job='SALESMAN' OR job='PRES ...

  4. P8741 [蓝桥杯 2021 省 B] 填空问题 题解

    P8741 [蓝桥杯 2021 省 B] 填空问题 题解 题目传送门 欢迎大家指出错误并联系这个蒟蒻 更新日志 2023-05-09 23:19 文章完成 2023-05-09 23:20 通过审核 ...

  5. NOI Linux 食用指北

    写这篇 blog 的原因是某个小朋友要考 CSP 了还不会用 linux,怎么回事呢. 单击图片即可放大. 前置- linux 虚拟机的安装 在官网 / 其他地方下载 VMware. 在 noi 官网 ...

  6. Python 批量合并图片到word文档

    这段代码是一个用Python编写的功能,它将指定文件夹中的所有图片插入到Word文档中并保存.以下是代码的主要步骤和功能: 导入必要的库 Python中的docx库用于操作Word文档,glob库用于 ...

  7. Isito 入门(八):金丝雀发布

    本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 6,金丝雀发布 金丝雀发布 按照流量比例划分 按照 Header 划分 6,金丝雀发布 项目总是处于不断变化之中 ...

  8. 题解 CF637B

    题目大意: 维护个栈,去重保留最上层 题目分析: 啥也不是,数组模拟 \(\text{stack} + \text{unordered\_map}\) 直接秒掉. 复杂度 \(O(n)\) 代码实现: ...

  9. 记一次线上问题引发的对 Mysql 锁机制分析

    背景 最近双十一开门红期间组内出现了一次因 Mysql 死锁导致的线上问题,当时从监控可以看到数据库活跃连接数飙升,导致应用层数据库连接池被打满,后续所有请求都因获取不到连接而失败 整体业务代码精简逻 ...

  10. APISIX proxy-cache 插件用法

    APISIX 的 proxy-cache 插件可以对上游的查询进行缓存,这样就不需要上游的应用服务自己实现缓存了,或者也能少实现一部分缓存,通用的交给插件来做. 下面的操作都是基于 APISIX 3. ...