【Mybatis】SpringBoot 自定义TypeHandler 完整步骤
1 注解的使用
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType;
import org.springframework.stereotype.Repository;import java.util.List;@Repository
public interface DefXXMapper {@Select(" SELECT id, tag, top_xx ,create_time as createTime, update_time as updateTime FROM `talentX` where`status` = 1 order by id DESC limit #{offset},#{limit} ")@Results(value = {@Result(column = "top_xx", property = "topXx", jdbcType = JdbcType.VARCHAR, javaType = TopNoteXWrapper.class),})List<TalentX> queryBatchTalents(@Param("offset") Integer offset, @Param("limit") Integer pageSize);@Insert(" insert into `talentX` ( tag ,top_xx , status) VALUES" +" ( #{tag},#{topXx,javaType=com.openpilot.TopNoteXWrapper,jdbcType=VARCHAR} ,#{status}) ")@Options(useGeneratedKeys = true,keyProperty = "id" ,keyColumn = "id")int insertOne( Talent talentX);}
2 自定义泛型类型TypeHandler
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** <b>Description:用以mysql中json格式的字段,进行转换的自定义转换器,转换为实体类的T类型 属性</b>*/
@MappedTypes(value = {JSONObject.class,TopNoteXWrapper.class})
@MappedJdbcTypes(value = {JdbcType.VARCHAR}, includeNullJdbcType = true)
@Slf4j
public class GenericTypeHandler<T extends Object> extends BaseTypeHandler<T> {private Class<T> clazz;private ObjectMapper objectMapper = new ObjectMapper();public GenericTypeHandler(Class<T> clazz) {if (clazz == null) {throw new IllegalArgumentException("Type argument cannot be null");}this.clazz = clazz;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {try {ps.setString(i, objectMapper.writeValueAsString(parameter));}catch (Throwable e){log.error("com.openpilot.GenericTypeHandler.setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) 异常 JSON兜底",e);ps.setString(i, JSON.toJSONString(parameter));}}/*** 根据列名,获取可以为空的结果*/@Overridepublic T getNullableResult(ResultSet rs, String columnName) throws SQLException {String sqlJson = rs.getString(columnName);if(StringUtils.isNotBlank(sqlJson)){try {return objectMapper.readValue(sqlJson, clazz);}catch (Throwable e){log.error("com.openpilot.GenericTypeHandler.getNullableResult(ResultSet rs, String columnName) 异常 JSON兜底",e);return JSONObject.parseObject(sqlJson, clazz);}}return null;}/*** 根据列索引,获取可以为空的结果*/@Overridepublic T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String sqlJson = rs.getString(columnIndex);if(StringUtils.isNotBlank(sqlJson)){try {return objectMapper.readValue(sqlJson, clazz);}catch (Throwable e){log.error("com.openpilot.GenericTypeHandler.getNullableResult(ResultSet rs, int columnIndex) 异常 JSON兜底",e);return JSONObject.parseObject(sqlJson, clazz);}}return null;}@Overridepublic T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String sqlJson = cs.getString(columnIndex);if(StringUtils.isNotBlank(sqlJson)){try {return objectMapper.readValue(sqlJson, clazz);}catch (Throwable e){log.error("com.openpilot.GenericTypeHandler.getNullableResult(CallableStatement cs, int columnIndex) 异常 JSON兜底",e);return JSONObject.parseObject(sqlJson, clazz);}}return null;}
}
3 mybatis-config.xml 增加配置 或者使用coding方式
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><setting name="cacheEnabled" value="false"/><setting name="multipleResultSetsEnabled" value="true"/><setting name="useGeneratedKeys" value="true"/><!--<setting name="autoMappingBehavior" value="PARTIAL"/>--><!--<setting name="autoMappingUnknownColumnBehavior" value="NONE"/>--><!--<setting name="defaultExecutorType" value="SIMPLE"/>--><!--<setting name="defaultStatementTimeout" value="25"/>--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><typeHandlers><typeHandler handler="com.openpilot.GenericTypeHandler"/></typeHandlers></configuration>
//类型转换映射注册@PostConstruct@Autowiredprivate void specialTypeHandlerRegistry(SqlSessionFactory sqlSessionFactory) {TypeHandlerRegistry typeHandlerRegistry = sqlSessionFactory.getConfiguration().getTypeHandlerRegistry();typeHandlerRegistry.register(Gender.class, JdbcType.VARCHAR, EnumTypeHandler.class);}
【Mybatis】SpringBoot 自定义TypeHandler 完整步骤相关推荐
- Mybatis实现自定义TypeHandler
本文主要记录学习mybatis自定义TypeHandler实例. 本实例是java中的List类型的数据存入数据库转为varchar类型 首先是POJO的内容如下 public class Hobby ...
- oracle typehandler,Mybatis实现自定义的类型转换器TypeHandler
此文其实是java操作Oracle类型XMLType总结二:使用Mybatis附带的一篇小结. Mybatis实现自定义的转换器,十分的简单,其主要步骤分为三步,这里以操作XMLType类型为例. 第 ...
- springboot+mybatis集成自定义缓存ehcache用法笔记
今天小编给大家整理了springboot+mybatis集成自定义缓存ehcache用法笔记,希望对大家能有所办帮助! 一.ehcache介绍 EhCache 是一个纯Java的进程内缓存管理框架,属 ...
- MyBatis 自定义 typeHandler
自定义typeHandler 对于自定义typeHandler来说,需要在配置文件中注册typeHandlers 然后需要实现TypeHandler接口, 一个例子 首先编写调度的处理类 packag ...
- springboot项目mybatis日志自定义设置无法生效
springboot项目mybatis日志自定义设置无法生效,就是无法设置日志级别,无法对java.sql.PreparedStatement.java.sql.Connection等进行设置. 翻了 ...
- 学习Spring Boot:(十二)Mybatis 中自定义枚举转换器
前言 在 Spring Boot 中使用 Mybatis 中遇到了字段为枚举类型,数据库存储的是枚举的值,发现它不能自动装载. 解决 内置枚举转换器 MyBatis内置了两个枚举转换器分别是:org. ...
- java整合mybatis,springboot集成mybatis
# springboot集成mybatis springboot基础mybatis还是很简单的,比之前springmvc集成mybatis要少很多配置,只要大家按照步骤一步一步来,几分钟就 能实现.具 ...
- SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)
SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一) 1. 前言 最近在写毕设过程中,重新梳理了一遍SSM框架,特此记录一下. 附上源码:https://gitee ...
- 大数据基础系列 1:Windows 安装 VMware Workstation 虚拟机完整步骤及需要注意的问题
文章目录 前言 一.下载正版虚拟机不同版本 1.1.通过官网进行下载 VM 虚拟机 1.1.1.选择所需版本下载 1.1.2.VM 15.1.0 Pro for Windows 下载 1.2.免注册账 ...
最新文章
- data es集群master_Kubernetes Helm3 部署 ElasticSearch amp; Kibana 7 集群
- Packt.Java.9.High.Performance.2017.11
- UA STAT687 线性模型II 最小二乘理论2 约束最小二乘估计
- 查看.Net程序的框架版本的方法
- mysql冷备增量备份,MySQL备份与恢复之真实环境使用冷备(2)
- Hibernate HQL基础 投影查询
- java swt 菜鸟教程_编程基础学习JS的入门教程
- C库宏-offsetof()
- LeetCode 252. Meeting Rooms (会议室)$
- etcd 启动分析_Etcd 架构与实现解析
- salt grains详解
- adprw指令通讯案例_S7200和威纶通触摸屏MODBUS RTU协议通讯
- js定时刷新页面数据
- 行测题数字推理技巧总结(简单精辟)
- Install Mysql MMM On Redhat6.3
- 泰文utf-8转unicode编码实现
- 算术,逻辑左移右移(转)
- 基于python-opencv给图像添加水印
- VS2017+openCV3.4.6+openCV3.4.6 contrib扩展模块安装
- ubuntu18.04安装详解