theme: orange

MyBatis TypeHandler是MyBatis框架中的举足轻重的组件之一,用于处理Java对象和数据库中的数据类型之间的转换。

MyBatis TypeHandler 介绍

MyBatis TypeHandler是MyBatis框架中的一个重要组件,用于处理Java对象和数据库中的数据类型之间的转换。在MyBatis中,每个Java类型都需要对应一个TypeHandler,用于将Java类型转换为JDBC类型,或将JDBC类型转换为Java类型。

TypeHandler可以用于以下场景:

  1. 数据库中的数据类型与Java类型不匹配,需要进行类型转换。
  2. 数据库中的数据类型与Java类型匹配,但需要进行特殊处理,例如将List转换为String,或将Object转换为JSON字符串。
  3. 数据库中的数据类型与Java类型匹配,但需要进行自定义转换,例如将Java的枚举类型转换为数据库中的字符串类型。 使用TypeHandler可以简化代码,提高开发效率,同时也可以避免一些常见的错误,例如空指针异常、类型转换异常等。

在MyBatis中,可以通过实现TypeHandler接口来自定义TypeHandler,也可以使用MyBatis提供的一些默认的TypeHandler,例如StringTypeHandler、IntegerTypeHandler等。

List转换为String

```java

import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collections; import java.util.List; import java.util.stream.Collectors;

@MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class) @Slf4j public class ListToStringTypeHandler implements TypeHandler

> {

@Override
public void setParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null || parameter.isEmpty()) {
ps.setString(i, "");
} else {
String value = parameter.stream().collect(Collectors.joining(","));
ps.setString(i, value);
}
} @Override
public List<String> getResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
return convertToList(value);
} @Override
public List<String> getResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
return convertToList(value);
} @Override
public List<String> getResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
return convertToList(value);
} private List<String> convertToList(String value) {
if (value == null || value.isEmpty()) {
return Collections.emptyList();
} else {
return List.of(value.split(","));
}
}

} ```

代码中,实现了TypeHandler接口,并重写了setParameter、getResult等方法。其中,setParameter方法将List转换为String类型,并设置到PreparedStatement中;getResult方法从ResultSet或CallableStatement中获取String类型的值,并将其转换为List类型。

需要注意的是,如果List为空或为null,需要将其转换为空字符串或空List,避免出现空指针异常或其他问题。在本示例代码中,使用了Java 8中的Stream API和Collections类来实现List和String之间的转换,可以根据需要进行修改。

另外,还需要加入注解@MappedJdbcTypes(JdbcType.VARCHAR) @MappedTypes(List.class),这样,在MyBatis执行SQL语句时,就会自动调用TypeHandler来处理List和String之间的转换。

Object 转换成 Json

```java import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler; import java.io.IOException; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;

public class ObjectToJsonTypeHandler implements TypeHandler

private static final ObjectMapper objectMapper = new ObjectMapper();

@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setString(i, null);
} else {
try {
String value = objectMapper.writeValueAsString(parameter);
ps.setString(i, value);
} catch (JsonProcessingException e) {
throw new SQLException("Failed to convert object to JSON", e);
}
}
} @Override
public Object getResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
return convertToObject(value);
} @Override
public Object getResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
return convertToObject(value);
} @Override
public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
return convertToObject(value);
} private Object convertToObject(String value) throws SQLException {
if (value == null) {
return null;
} else {
try {
return objectMapper.readValue(value, Object.class);
} catch (IOException e) {
throw new SQLException("Failed to convert JSON to object", e);
}
}
}

} ```

代码中,实现了TypeHandler接口,并重写了setParameter、getResult等方法。其中,setParameter方法将Object转换为JSON字符串,并设置到PreparedStatement中;getResult方法从ResultSet或CallableStatement中获取JSON字符串,并将其转换为Object类型。

需要注意的是,如果Object为null,需要将其转换为null字符串,避免出现空指针异常或其他问题。在本示例代码中,使用了Jackson库来实现Object和JSON字符串之间的转换,可以根据需要进行修改。

使用

java @TableField(value = "keywords", typeHandler = ListStringTypeHandler.class) private List<String> keywords;

使用的方式就是在实体类中想要进行类型转换的字段加上注解@TableField,这是不管是设置值还是获取值的时候就会自动进行类型转换。

快速开始 Mybatis TypeHandler的更多相关文章

  1. 快速上手Mybatis项目

    快速上手Mybatis项目 思路流程:搭建环境-->导入Mybatis--->编写代码--->测试 1.搭建实验数据库 CREATE DATABASE `mybatis`; USE ...

  2. mybatis typehandler

    建立TypeHandler 我们知道java有java的数据类型,数据库有数据库的数据类型,那么我们在往数据库中插入数据的时候是如何把java类型当做数据库类型插入数据库,在从数据库读取数据的时候又是 ...

  3. mybatis typeHandler类型转换器

    typeHandler类型转换器 在JDBC中,需要在PreparedStatement对象中设置那些已经预编译过的SQL语句的参数.执行SQL后,会通过ResultSet对象获取得到数据库的数据,而 ...

  4. [刘阳Java]_快速搭建MyBatis环境_第2讲

    1.MyBatis的环境配置 导入MyBatis包, mybatis-3.2.8.jar 导入MySQL驱动包, mysql-connector-java-5.1.24-bin.jar 创建表的实体类 ...

  5. 快速学习mybatis框架

    一.介绍Mybatis(主要从以下两点进行介绍) 1.MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动 ...

  6. 快速入门Mybatis

    框架概述 什么是框架 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题.使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能.大大提高开发效率 三层架构 UI(表现层 ...

  7. 五分钟快速上手MyBatis

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. 可以通过简单的 XML 或注解来配置和映射,Ja ...

  8. 浅析MyBatis(一):由一个快速案例剖析MyBatis的整体架构与运行流程

    MyBatis 是轻量级的 Java 持久层中间件,完全基于 JDBC 实现持久化的数据访问,支持以 xml 和注解的形式进行配置,能灵活.简单地进行 SQL 映射,也提供了比 JDBC 更丰富的结果 ...

  9. mybatis基础,mybatis配置文件核心组件typeHandler元素

    无论是从预处理语句中设置一个值,还是从结果集里取出一个值,都会用类型处理器将获取的值以合适的方式转换成 Java 类型 可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型 实现 o ...

  10. MyBatis 框架之快速入门程序

    一.使用 IDEA 快速创建 Maven 项目 关于如何快速创建 Maven 项目,这个可以参考下面这篇文章: Maven 项目管理工具基础入门系列(一) 二.快速配置 MyBatis 依赖 jar ...

随机推荐

  1. C# Dev GridView当前行

    DEV获取GridControl当前行 //直接通过gridView获取当前行 dr=this.gridView1.GetDataRow(this.gridView1.FocusedRowHandle ...

  2. 点赞!TeleDB入选2024大数据星河案例!

    12月18日,由中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织的2024大数据"星河"案例入围名单正式发布,天翼云科技有限公司携手中 ...

  3. 用 Facebook Hydra 参数配置框架来简化程序配置

    用 Facebook Hydra 参数配置框架来简化程序配置 目录 用 Facebook Hydra 参数配置框架来简化程序配置 0x00 摘要 0x01 问题描述 0x02 概述 0x03 使用 3 ...

  4. Kyuubi支持Iceberg配置

    一.简述 Kyuubi调用Spark来查询iceberg表,修改Spark配置信息即可. 二.服务配置 1.上传jar包到Kyuubi server节点 可以选择emr spark组件后,按照配置组( ...

  5. C# 全角字符和半角字符相互转换

    参考链接:https://blog.csdn.net/willingtolove/article/details/106923879 1. 全角转半角 /// <summary> /// ...

  6. 奥特曼框架autMan对接微信(千寻、西瓜)框架的详细教程

    教程只写常用的两:西瓜.千寻,都运行在windows平台上. 1.千寻对接 文章底部下载千寻微信框架 解压至win电脑 电脑安装微信3.6.0.18并关闭自动更新 运行千寻微信框架 5.千寻框架设置 ...

  7. C++调用动态链接库DLL的隐式链接和显式链接基本方法小结

    C++程序在运行时调用动态链接库,实现逻辑扩展,有两种基本链接方式:隐式链接和显式链接.下面就设立最基本情形实现上述链接. 创建DLL动态链接库 编辑头文件 mydll_3.h: #pragma on ...

  8. Windows 提权-SeImpersonatePrivilege 特权

    本文通过 Google 翻译 SeImpersonatePrivilege – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...

  9. Scala List集合 List 有序不唯一,元素可重复

    package com.wyh.day01 import scala.collection.mutable.ListBuffer /** * List 有序不唯一,元素可重复 */ object Sc ...

  10. 帝国CMS下iframe标签无法引入视频,ueditor编辑器中html标签无法显示问题,设置ueditor默认行高为1.75

    问题描述: 1.帝国cms后台添加优酷视频,使用到iframe,富文本编辑器中使用iframe引入视频后检查发现html代码未出现iframe字样,排查后发现为ueditor限制过滤了部分html代码 ...