• MyBatis Mapper映射处理CLOB和BLOB类型


    Mybatis的MapperXML映射文件应该处理数据库字段类型为CLOB和BLOB类型的数据呢?首先我们先看下CLOB和BLOB这两种数据类型的介绍。

    介绍

    使用Mybatis时涉及到两种特殊类型的处理,分别是Blob(Binary Large Object)和Clob(Character Large Object)。Blob表示二进制大对象字段,而Clob则表示大字符对象字段。这两种类型需要特殊处理。

    Blob主要用于存储大型二进制数据,例如图像、音频或视频文件等。而Clob则用于存储大量文本数据,比如长篇文章、日志等。在JDBC中,PreparedStatement和ResultSet提供了相应的方法来支持Blob和Clob的操作,使得在数据库中存储和检索这些大型数据变得更加容易。

    本文首发:https://www.panziye.com/java/7876.html

    Mybatis作为一个持久层框架,也对Blob和Clob类型进行了支持。不同版本的Mybatis都提供了对这些类型的存储和读取操作的功能。下面将详细介绍Mybatis中如何操作Clob字段。

    对应关系

    BLOB和CLOB在不一样的数据库中对应的类型也不同:
     MySQL中:clob对应text/longtext,blob对应blob
    Oracle中:clob对应clob,blob对应blob

    Mapper.xml映射

    Mapper文件中查询sql的id为queryByList,report_summary为Oracle数据库中的一个字段,是CLOB类型。myClob为java类,在java类中定义一个String类型的字段reportSummary,用于接收CLOB信息。

    1)Mapper.xml文件加入如下配置可以读取CLOB和BLOB类型的数据

    jdbcType="CLOB" typeHandler="org.apache.ibatis.type.ClobTypeHandler"
    jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BLOBTypeHandler"
    

    2)案例代码

    
    id="queryBaseResultMap" type="com.mxm.model.MyClob" >
        <id column="Id" property="id" jdbcType="INTEGER" />
        "type" property="type" jdbcType="INTEGER" />
        "title" property="title" jdbcType="VARCHAR" />
        "author" property="author" jdbcType="VARCHAR" />
        "report_summary" property="reportSummary" jdbcType="CLOB" typeHandler="org.apache.ibatis.type.ClobTypeHandler">
    
    

    3)如果你的Clob是文本信息,在java实体类中,可以直接使用String字符串去接收处理。

    扩展

    上面使用的是默认的mybatis提供的ClobTypeHandler,当然,你也可以自定义自己的handler进行处理,这样会有更好的灵活性。这里演示blob与String转换。

    场景

    数据库中有一个blob字段,在java中用String接收。使用如下方式读取:

    <select id="find" resultType="com.example.bean.User">
      select id, name, experience, createTime
      from user
    </select>
    

    如果这里的experience字段为blob类型,那么取出来的数据就会乱码。

    解决方法是自定义一个TypeHandler,通过继承BaseTypeHandler类实现。如下。

    BlobToStringTypeHandler

    先看xml应用:

    <resultMap id="UserResultMap" type="com.example.bean.User">
      <id property="id" column="id"></id>
      <result property="name" column="name"></result>
      <result property="experience" column="experience" typeHandler="com.example.handler.BlobToStringTypeHandler"></result>
      <result property="createTime" column="createTime"></result>
    </resultMap>
    
    <select id="find" resultMap="UserResultMap">
      select id, name, experience, createTime
      from user
    </select>
    

    再看BlobToStringTypeHandler代码:

    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    
    import java.sql.*;
    
    public class BlobToStringTypeHandler extends BaseTypeHandler {
      @Override
      public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter);
      }
    
      @Override
      public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Blob blob = rs.getBlob(columnName);
        return new String(blob.getBytes(1, (int)blob.length()));
      }
    
      @Override
      public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Blob blob = rs.getBlob(columnIndex);
        return new String(blob.getBytes(1, (int)blob.length()));
      }
    
      @Override
      public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Blob blob = cs.getBlob(columnIndex);
        return new String(blob.getBytes(1, (int)blob.length()));
      }
    }
    

    以上,通过继承BaseTypeHandler并实现其方法,将sql的blob类型字段与java的String类型互相转换。

    附录

    这里附上Mybatis JdbcType与Oracle、MySql数据类型对应列表

    JdbcTypeOracleMySql
    ARRAY    
    BIGINT   BIGINT
    BINARY    
    BIT   BIT
    BLOB BLOB BLOB
    BOOLEAN    
    CHAR CHAR CHAR
    CLOB CLOB 修改为TEXT
    CURSOR    
    DATE DATE DATE
    DECIMAL DECIMAL DECIMAL
    DOUBLE NUMBER DOUBLE
    FLOAT FLOAT FLOAT
    INTEGER INTEGER INTEGER
    LONGVARBINARY    
    LONGVARCHAR LONG VARCHAR  
    NCHAR NCHAR  
    NCLOB NCLOB  
    NULL    
    NUMERIC NUMERIC/NUMBER NUMERIC/
    NVARCHAR    
    OTHER    
    REAL REAL REAL
    SMALLINT SMALLINT SMALLINT
    STRUCT    
    TIME   TIME
    TIMESTAMP TIMESTAMP TIMESTAMP/DATETIME
    TINYINT   TINYINT
    UNDEFINED    
    VARBINARY    
    VARCHAR VARCHAR VARCHAR

    如果表格中有遗漏,可以直接看官方文档

    总结

    以上就是MyBatis MapperXML如何处理CLOB和BLOB类型数据的全部内容,希望对你Java框架的学习有帮助!

    推荐阅读

    MyBatis Plus如何解决百万级大数据量查询慢问题

  • 相关阅读:
    了解web3,什么是web3
    Tomcat一些漏洞的汇总
    redis基础3——配置文件核心参数实测+RDB持久化、AOF持久化核心参数详解
    汉诺塔问题
    华为云 存在不支持迁移的外键解决方法
    关于#java#的问题:3)连接MySQL数据库,包含增删改查操作,完成浏览储户信息、查询储户信息、添加储户信息、删除储户信息、修改储户信息的操作
    雅思核心词拾遗01----Politics + Culture
    解决from d2l import torch as d2l报pandas,numpy的相关问题
    java计算机毕业设计疫情下发热门诊管理系统MyBatis+系统+LW文档+源码+调试部署
    SpringBoot集成Kafka
  • 原文地址:https://www.cnblogs.com/java-ye/p/17639601.html