快速开始 Mybatis TypeHandler
theme: orange
MyBatis TypeHandler是MyBatis框架中的举足轻重的组件之一,用于处理Java对象和数据库中的数据类型之间的转换。
MyBatis TypeHandler 介绍
MyBatis TypeHandler是MyBatis框架中的一个重要组件,用于处理Java对象和数据库中的数据类型之间的转换。在MyBatis中,每个Java类型都需要对应一个TypeHandler,用于将Java类型转换为JDBC类型,或将JDBC类型转换为Java类型。
TypeHandler可以用于以下场景:
- 数据库中的数据类型与Java类型不匹配,需要进行类型转换。
- 数据库中的数据类型与Java类型匹配,但需要进行特殊处理,例如将List转换为String,或将Object转换为JSON字符串。
- 数据库中的数据类型与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的更多相关文章
- 快速上手Mybatis项目
快速上手Mybatis项目 思路流程:搭建环境-->导入Mybatis--->编写代码--->测试 1.搭建实验数据库 CREATE DATABASE `mybatis`; USE ...
- mybatis typehandler
建立TypeHandler 我们知道java有java的数据类型,数据库有数据库的数据类型,那么我们在往数据库中插入数据的时候是如何把java类型当做数据库类型插入数据库,在从数据库读取数据的时候又是 ...
- mybatis typeHandler类型转换器
typeHandler类型转换器 在JDBC中,需要在PreparedStatement对象中设置那些已经预编译过的SQL语句的参数.执行SQL后,会通过ResultSet对象获取得到数据库的数据,而 ...
- [刘阳Java]_快速搭建MyBatis环境_第2讲
1.MyBatis的环境配置 导入MyBatis包, mybatis-3.2.8.jar 导入MySQL驱动包, mysql-connector-java-5.1.24-bin.jar 创建表的实体类 ...
- 快速学习mybatis框架
一.介绍Mybatis(主要从以下两点进行介绍) 1.MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动 ...
- 快速入门Mybatis
框架概述 什么是框架 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题.使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能.大大提高开发效率 三层架构 UI(表现层 ...
- 五分钟快速上手MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射. 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作. 可以通过简单的 XML 或注解来配置和映射,Ja ...
- 浅析MyBatis(一):由一个快速案例剖析MyBatis的整体架构与运行流程
MyBatis 是轻量级的 Java 持久层中间件,完全基于 JDBC 实现持久化的数据访问,支持以 xml 和注解的形式进行配置,能灵活.简单地进行 SQL 映射,也提供了比 JDBC 更丰富的结果 ...
- mybatis基础,mybatis配置文件核心组件typeHandler元素
无论是从预处理语句中设置一个值,还是从结果集里取出一个值,都会用类型处理器将获取的值以合适的方式转换成 Java 类型 可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型 实现 o ...
- MyBatis 框架之快速入门程序
一.使用 IDEA 快速创建 Maven 项目 关于如何快速创建 Maven 项目,这个可以参考下面这篇文章: Maven 项目管理工具基础入门系列(一) 二.快速配置 MyBatis 依赖 jar ...
随机推荐
- oracle19.3打补丁
补丁 36582781 - 数据库发布更新 19.24.0.0.240716 本文档在发布时准确无误.有关数据库版本更新 19.24.0.0.240716 的任何更改和其他信息,请参阅 My Orac ...
- IDEA debug时候直接报ClassNotFoundException,代码正常,也可以正常运行
原因,是因为在某些类误点了断点,需要取消
- Ollama模型迁移
技术背景 在前面的一些文章中,我们介绍过使用Ollama在Linux平台加载DeepSeek蒸馏模型,使用Ollama在Windows平台部署DeepSeek本地模型.除了使用Ollama与模型文件交 ...
- Linux挂载U盘,SD卡
Linux挂载U盘,SD(TF)卡 1.插入U盘,执行如下指令后能看到设备则说明连接成功 sudo fdisk -l #查看外接设备名称,一般为/dev/sd...,这里假设为/dev/sdc1 2. ...
- Shell - shell中的运算符
基本语法 使用案例 基本语法 $((运算式)) $[ 运算式 ] 使用案例 # 第一种写法 a=10 b=20 c=`expr ${a} + ${b}` echo "$c" # 第 ...
- 2024NOIP邮寄
渺渺兮身外无物,无喜无悲无怖,不过是大梦一场,各自沉浮. 前言 原计划这篇游记兼总结是在考完后一天之内写出来(12.1 前),但是一方面是因为家里的笔记本插上 U 盘写不了东西,一方面是这次 NOIP ...
- 青岛oj集训1
2025/3/4 内容:有向无环图(DAG) 优点:DAG有很多良好性质 拓扑排序 用处:可以根据拓扑序进行dp 这次计算所用的所有边的权值都是有计算过的 一张DAG图肯定有拓扑序(bfs序,dfs序 ...
- ubuntu 刷新 hosts 命令
systemd-resolved 服务 sudo systemctl restart systemd-resolved 这个命令将重启 systemd-resolved 服务,该服务负责 DNS 解析 ...
- 最新活动 ISS 国际空间站 MAI-75 SSTV活动计划于2020年8月4日至5日
MAI-75 SSTV活动计划于2020年8月4日和5日举行 8月3日至9日这一周的最后宇航员时间表最近公布了,它显示了定于8月4日和5日进行的MAI-75活动.这是在Space X Demo-2脱 ...
- 探秘Transformer系列之(16)--- 资源占用
探秘Transformer系列之(16)--- 资源占用 目录 探秘Transformer系列之(16)--- 资源占用 文章总表 0x00 概述 0x01 背景知识 1.1 数据类型 1.2 进制& ...