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. 如何解决:Android Studio (version 4.1); Flutter plugin not installed and Dart plugin not installed errors

    出现的现象 android studio 4.1已经安装了flutter和dart插件,但是执行 flutter doctor依然报错. [!] Android Studio (version 4.1 ...

  2. AI编程:cursor使用教程

    这是小卷对AI编程工具学习的第1篇文章,今天以cursor为例,通过给提示词,让不懂编程的小白也能自己用代码实现需求 1.什么是AI编程工具? 可以分为两类: 狭义的AI编程工具 面向程序员的,主要用 ...

  3. Ubuntu Linux部署DeepSeek

    技术背景 DeepSeek是这段时间最热门的话题之一,其蒸馏模型可以实现低成本而高质量的推理,使得我们现在可以在本地小型化的硬件上也用上大模型这一AI利器.本文主要介绍通过Ollama来部署DeepS ...

  4. 效率起飞!天翼云并行文件服务HPFS高效应对AI时代大模型训练存储挑战!

    国内外AI大模型层出不穷,训练数据复杂程度更是呈指数级增加.如今,在万亿级参数时代,单个资源池已无法满足大模型训练场景中动辄PB级的数据存储量,对于企业来说,启用多个资源池构成的分布式存储势在必行. ...

  5. Jenkins插件:Git

    Jenkins插件:Git Jenkins,作为一款备受欢迎的持续集成和持续交付工具,在软件开发领域发挥着举足轻重的作用.它不仅能够与Git无缝集成,还能实现代码的自动化拉取.构建与部署,极大地提升了 ...

  6. 从汇编层解读Golang的闭包实现:逃逸分析与性能影响

    本文精心梳理了一系列面试中具有一定难度的高频Golang问题,其中部分知识点可能你之前未曾深入探究,然而它们却在面试和实际工作中至关重要. 包括:Golang的基础语法.并发模型.内存管理等核心知识点 ...

  7. 别再混淆了!JVM内存模型和Java内存模型的本质区别

    JVM 内存模型(JVM Memory Model)和 Java 内存模型(Java Memory Model, JMM)是 Java 开发中两个非常重要的概念,但这两个概念很容易被搞混,所以本文就来 ...

  8. HttpClient 进行soap请求

    当你在使用C#的HttpClient进行SOAP请求时,确保你的代码类似于以下示例: using System; using System.Net.Http; using System.Text; u ...

  9. jQuery ajax 文件上传 Request Headers 缺少 boundary

    原文地址: https://blog.jijian.link/2020-07-28/jquery-ajax-upload-file/ 一般上传方式 const file = document.getE ...

  10. angular双向数据绑定踩坑记:

    在angular中使用ngModel时出现了一个报错error NG8002: Can't bind to 'ngModel' since it isn't a known property of ' ...