iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >mybatis-plus怎么配置自定义数据类型TypeHandle
  • 336
分享到

mybatis-plus怎么配置自定义数据类型TypeHandle

2023-06-26 04:06:48 336人浏览 安东尼
摘要

本文小编为大家详细介绍“mybatis-plus怎么配置自定义数据类型TypeHandle”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis-plus怎么配置自定义数据类型TypeHandle”文章能帮助大家解决疑惑,下面跟着小

本文小编为大家详细介绍“mybatis-plus怎么配置自定义数据类型TypeHandle”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis-plus怎么配置自定义数据类型TypeHandle”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

如何配置自定义数据类型TypeHandle

1.背景

mybatis-plus在mybatis的基础的上,做了全面增强功能,极大的提高了我们的开发效率。有时候我们使用的实体字段类型,与数据库创建的字段类型无法对应上,这时候就需要配之自定义的类型处理类,来处理代码和数据库之间的数据流转。

2.举例

我们有个实体类TestEntity,使用注解@TableName表示对应数据库表名为test

@Data@TableName(value = "test")public class TestEntity{  private static final long serialVersionUID = 8565214506859404278L;  private String id;  private String type;  private Document content;}

DAO层对象

@Mapperpublic interface TestDao extends BaseMapper<TestEntity> {}

XML文件

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "Http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.aisino.dao.TestDao">    <resultMap type="com.aisino.entity.TestEntity" id="testMap">        <result property="id" column="id"/>        <result property="type" column="name"/>        <result property="content" column="content"/>    </resultMap></mapper>

其中Document使用的是org.w3c.dom.Document对象,数据库存储的字段类型为bytea,我这里使用的是postgresql,显然数据类型无法匹配,这里需要编写类型处理类进行数据类型转换。

3.TypeHandle配置

编写TypeHandle,首先需要明确我们代码中和数据库中各自的数据类型,编写处理类DocumentTypeHandler继承BaseTypeHandler,并重写4个方法:

(1)setNonNullParameter表示从代码中的数据类型转换成数据库数据类型,即Document转为BLOB类型。这里的基本思路就是将Document转为String再转为字节流,最后利用setBinaryStream方法转为数据库对象。

(2)getNullableResult,getNullableResult,getNullableResult表示从数据库类型中获取数据并转换为代码中的数据类型,即BLOB转为Document类型。这里的基本思路就是上一步的逆过程。

  • @MappedTypes中填写的是我们代码中的数据类型

  • @MappedJdbcTypes中填写的是数据库中的数据类型

@MappedTypes(Document.class)@MappedJdbcTypes(JdbcType.BLOB)public class DocumentTypeHandler extends BaseTypeHandler {    @Override    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws sqlException {        String docStr = docToString((org.w3c.dom.Document) parameter);        InputStream in = new ByteArrayInputStream(docStr.getBytes());        ps.setBinaryStream(i, in);    }    @Override    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {        byte[] bytes = rs.getBytes(columnName);        return !rs.wasNull() && bytes != null ? stringToDoc(new String(bytes)) : null;    }    @Override    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {        byte[] bytes = rs.getBytes(columnIndex);        return !rs.wasNull() && bytes != null ? stringToDoc(new String(bytes)) : null;    }    @Override    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {        byte[] bytes = cs.getBytes(columnIndex);        return !cs.wasNull() && bytes != null ? stringToDoc(new String(bytes)) : null;    }    public static String docToString(Document doc) {        // XML转字符串        String xmlStr = "";        try {            TransfORMerFactory tf = TransformerFactory.newInstance();            Transformer t = tf.newTransformer();            t.setOutputProperty("encoding", "UTF-8");            ByteArrayOutputStream bos = new ByteArrayOutputStream();            t.transform(new DOMSource(doc), new StreamResult(bos));            xmlStr = bos.toString();        } catch (TransformerConfigurationException e) {            // TODO            e.printStackTrace();        } catch (TransformerException e) {            // TODO            e.printStackTrace();        }        return xmlStr;    }    public static Document stringToDoc(String xmlStr) {        //字符串转XML        Document doc = null;        try {            xmlStr = new String(xmlStr.getBytes(), "UTF-8");            StringReader sr = new StringReader(xmlStr);            InputSource is = new InputSource(sr);            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();            DocumentBuilder builder;            builder = factory.newDocumentBuilder();            doc = builder.parse(is);        } catch (ParserConfigurationException e) {            // TODO            e.printStackTrace();        } catch (SAXException e) {            // TODO            e.printStackTrace();        } catch (IOException e) {            // TODO            e.printStackTrace();        }        return doc;    }}

回到实体类配置,以下是修改后的实体类

(1)在注解@TableName中增加autoResultMap = true表示使用xml中的映射配置

(2)增加注解配置@TableField(typeHandler = DocumentTypeHandler.class)表示content字段使用数据类型处理类DocumentTypeHandler.class 

@Data@TableName(value = "test",autoResultMap = true)public class TestEntity{  private static final long serialVersionUID = 8565214506859404278L;  private String id;  private String type;  @TableField(typeHandler = DocumentTypeHandler.class)  private Document content;}

以下是修改后的xml配置

(1)content字段配置jdbcType=“OTHER”,配置数据处理类typeHandler=“com.aisino.jdbc.ibatis.DocumentTypeHandler”

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.aisino.dao.TestDao">    <resultMap type="com.aisino.entity.TestEntity" id="testMap">        <result property="id" column="id"/>        <result property="type" column="name"/>        <result property="content" column="content" jdbcType="OTHER" typeHandler="com.aisino.jdbc.ibatis.DocumentTypeHandler"/>    </resultMap></mapper>

注意事项

(1)编写TypeHandle类时候,继承BaseTypeHandler<Document>试过不行,原因暂未深究。

(2)实体类的注解@TableField(typeHandler = DocumentTypeHandler.class)与xml配置的处理类路径typeHandler="com.aisino.jdbc.ibatis.DocumentTypeHandler"缺一不可,因为看过网上说只配置注解即可,我试了不行,原因暂未深究。 

自定义TypeHandler的使用笔记

可通过自定义的TypeHandler实现某个属性在插入数据库以及查询时的自动转换,本例中是要将Map类型的属性转化成CLOB,然后存入数据库。由于是复杂的Map,mp自带的JSON转换器会丢失部分信息。

类型转换器还可以通过注解配置java类型和jdbc类型

  • @MappedTypes:注解配置 java 类型

  • @MappedJdbcTypes:注解配置 jdbc 类型

定义:

@Slf4j@MappedTypes({Object.class})@MappedJdbcTypes(JdbcType.VARCHAR)public class WeightListTypeHandler  extends AbstractjsonTypeHandler<Object> {    private static Gson gson = new Gson();    private final Class<?> type;    public WeightListTypeHandler(Class<?> type) {        if (log.isTraceEnabled()) {            log.trace("WeightListTypeHandler(" + type + ")");        }        Assert.notNull(type, "Type argument cannot be null");        this.type = type;    }    @Override    protected Object parse(String json) {        Type type1 = new TypeToken<Map<String, List<WeightItem>>>(){}.getType();        return gson.fromJson(json, type1);    }    @Override    protected String toJson(Object obj) {        return gson.toJson(obj);    }    public static void setGson(Gson gson) {        Assert.notNull(gson, "Gson should not be null");        WeightListTypeHandler.gson = gson;    }}

使用:

注意@TableName 注解 autoResultMap 属性

@Data@NoArgsConstructor@TableName(value = "mix_target",autoResultMap = true)public class MixTarget extends Model<MixTarget> {    @TableId(value = "id", type = IdType.AUTO)    private Long id;        @TableField("description")    private String description;        @TableField("name")    private String name;        @TableField("property_name")    private String propertyName;        @TableField("source_type")    private String sourceType;        @TableField(value = "weight_list",typeHandler = WeightListTypeHandler.class,jdbcType = JdbcType.CLOB)    private Map<String, List<WeightItem>> weightList;        @TableField("status")    private Integer status;        @TableField("enable")    private Integer enable;    @TableField("create_time")    private LocalDateTime createTime;}

读到这里,这篇“mybatis-plus怎么配置自定义数据类型TypeHandle”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: mybatis-plus怎么配置自定义数据类型TypeHandle

本文链接: https://www.lsjlt.com/news/306929.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mybatis-plus怎么配置自定义数据类型TypeHandle
    本文小编为大家详细介绍“mybatis-plus怎么配置自定义数据类型TypeHandle”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis-plus怎么配置自定义数据类型TypeHandle”文章能帮助大家解决疑惑,下面跟着小...
    99+
    2023-06-26
  • mybatis-plus如何配置自定义数据类型TypeHandle
    目录如何配置自定义数据类型TypeHandle1.背景2.举例3.TypeHandle配置自定义TypeHandler的使用笔记类型转换器还可以通过注解配置java类型和jdbc类型...
    99+
    2024-04-02
  • Mybatis-Plus怎么自定义集合类型的类型处理器
    这篇文章主要讲解了“Mybatis-Plus怎么自定义集合类型的类型处理器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Mybatis-Plus怎么自定义集合类型的类型处理器”吧!1.配合x...
    99+
    2023-06-26
  • Mybatis-Plus自定义集合类型的类型处理器详解
    目录1.配合xml文件2.手动注册两种方法,第一种很麻烦,对mp自带的插入操作有限制,后来改为更简洁的第二种方法 1.配合xml文件 TypeHandler @Slf4j @Map...
    99+
    2024-04-02
  • sql怎么创建自定义数据类型
    在 SQL 中,创建自定义数据类型可以使用 `CREATE TYPE` 语句。以下是一个示例:```sqlCREATE TYPE e...
    99+
    2023-09-25
    sql
  • TypeScript如何自定义数据类型
    这篇文章主要介绍“TypeScript如何自定义数据类型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“TypeScript如何自定义数据类型”文章能帮助大家解决问题。TypeScript 类型系统和...
    99+
    2023-07-04
  • 怎么在python中利用namedtuple自定义数据类型
    怎么在python中利用namedtuple自定义数据类型?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python可以做什么Python是一种编程语言,内置了许多有效的工...
    99+
    2023-06-14
  • VB.NET中怎么自定义类型
    VB.NET中怎么自定义类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。VB.NET自定义类型在VB.NET中称为“structure”(结构),包含有一个或多个不同种类的数...
    99+
    2023-06-17
  • C++自定义数据类型方法详情
    目录1、typedef声明2、枚举类型enum1、typedef声明 typedef用于给已有的类型一个新的名字,这个新的名字可以是自己定义的, 其语法为: typedef 现有类型...
    99+
    2024-04-02
  • Mybatis Plus怎么配置双数据库驱动连接数据库
    本文小编为大家详细介绍“Mybatis Plus怎么配置双数据库驱动连接数据库”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis Plus怎么配置双数据库驱动连接数据库”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-28
  • mybatis自定义参数类型转换器数据库字段加密脱敏
    目录1 问题背景2 解决方案2.1 使用数据库加密算法2.2 使用mybatis的自定义参数类型转换器3 一般web项目使用3.1 创建自定义Java类型3.2 自定义类的转换处理器...
    99+
    2024-04-02
  • TypeScript类型系统自定义数据类型教程示例
    目录TypeScript 类型系统和自定义数据类型什么是类型系统函数类型类型别名可选参数默认参数函数重载接口类型可选属性只读属性接口扩展多重接口声明接口的索引签名用接口描述函数类类型...
    99+
    2022-11-16
    TypeScript自定义数据类型 TypeScript类型系统
  • C#中怎么自定义类型转换函数
    C#中怎么自定义类型转换函数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。/// <summary>  /// 将字符型...
    99+
    2023-06-18
  • 易语言如何自定义数据类型数组
    在易语言中,可以通过使用结构体来自定义数据类型数组。首先,需要创建一个结构体,定义数组的元素类型和个数。例如,如果想要创建一个包含整...
    99+
    2023-08-17
    易语言
  • 【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
    背景 做了一个和navicat一样的工具,web版工具,然后数据库链接信息都是存在一个主数据库表的里,所以这里涉及到了动态切换数据源,以及一些事务等。今天说下多数据源切换时,事务失效。 目录  一、常见的事务失效 @Transac...
    99+
    2023-09-08
    mybatis 数据库 mysql
  • springmvc怎么自定义类型转换器
    要自定义类型转换器,首先需要创建一个实现了Converter接口的转换器类,然后在Spring MVC的配置文件中注册这个转换器。 ...
    99+
    2024-04-02
  • Python 中怎么自定义基本类型
    本篇文章为大家展示了Python 中怎么自定义基本类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我们也知道,在 Python 里面,一切都是对象,而对象一般有方法。所以,大家会看到下面这种写法:...
    99+
    2023-06-16
  • java中怎么定义json格式数据类型
    在Java中,可以使用第三方库如Jackson、Gson等来操作JSON格式数据类型。使用Jackson库,可以先创建一个Java类...
    99+
    2023-09-27
    java json
  • Go语言中GORM存取数组/自定义类型数据
    目录GORM存取数组类型数据一、GORM的自定义类型1. Scanner/Valuer接口2. 数组变量3. 测试二、实际生产​总结GORM存取数组类型数据 在GORM不支持数组类型...
    99+
    2023-01-17
    Gorm 数组字段处理 gorm 数组 gorm 自定义类型
  • Golang怎么自定义类型和方法集
    这篇文章主要介绍“Golang怎么自定义类型和方法集”,在日常操作中,相信很多人在Golang怎么自定义类型和方法集问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang怎么自定义类型和方法集”的疑惑有所...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作