• 在MyBatis中自定义JsonTypeHandler


    在MyBatis中使用自定义的JsonTypeHandler

    在处理数据库中的JSON字段时,我们经常需要将JSON字符串映射到Java对象,或者将Java对象序列化为JSON字符串以存储在数据库中。MyBatis作为一个流行的Java持久层框架,允许我们通过自定义类型处理器(TypeHandler)来实现这种映射。

    在本篇博客中,我们将介绍如何创建一个基于Jackson库的自定义JsonTypeHandler,并将其集成到MyBatis中。

    步骤 1: 添加依赖

    首先,确保你的项目中已经包含了Jackson库和MyBatis的依赖。如果你使用Maven,可以在pom.xml文件中添加以下依赖:

    
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-databindartifactId>
        <version>2.13.0version> 
    dependency>
    
    
    <dependency>
        <groupId>org.mybatisgroupId>
        <artifactId>mybatisartifactId>
        <version>3.5.9version> 
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    步骤 2: 创建自定义JsonTypeHandler

    接下来,创建一个实现了MyBatis TypeHandler接口的自定义类型处理器。我们将使用Jackson的ObjectMapper来进行JSON的序列化和反序列化。

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    
    import java.io.IOException;
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
    
        private static final ObjectMapper objectMapper = new ObjectMapper();
        private final Class<T> type;
    
        public JsonTypeHandler(Class<T> type) {
            if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
            this.type = type;
        }
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)
                throws SQLException {
            try {
                ps.setString(i, objectMapper.writeValueAsString(parameter));
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
        }
    
        @Override
        public T getNullableResult(ResultSet rs, String columnName)
                throws SQLException {
            String json = rs.getString(columnName);
            return json == null ? null : parseJson(json);
        }
    
        @Override
        public T getNullableResult(ResultSet rs, int columnIndex)
                throws SQLException {
            String json = rs.getString(columnIndex);
            return json == null ? null : parseJson(json);
        }
    
        @Override
        public T getNullableResult(CallableStatement cs, int columnIndex)
                throws SQLException {
            String json = cs.getString(columnIndex);
            return json == null ? null : parseJson(json);
        }
    
        private T parseJson(String json) {
            try {
                return objectMapper.readValue(json, type);
            } catch (IOException e) {
                throw new RuntimeException("Error parsing JSON", e);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    步骤 3: 在MyBatis配置中注册自定义类型处理器

    要在MyBatis中使用自定义类型处理器,你需要在MyBatis配置文件中注册它。这可以通过在mybatis-config.xml文件中添加类型处理器,或者在映射器(mapper)的XML文件中直接使用类型处理器来完成。

    方法 1: 在mybatis-config.xml中注册
    <configuration>
        
        <typeHandlers>
            <typeHandler handler="com.example.JsonTypeHandler" javaType="com.example.YourJavaType"/>
        typeHandlers>
        
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意:上面的配置有一个问题,因为JsonTypeHandler是一个泛型类,直接在mybatis-config.xml中注册可能无法正确指定泛型类型。因此,你可能需要为每个要处理的Java类型创建一个具体的非泛型子类。

    方法 2: 在映射器(mapper)的XML文件中使用

    更常见的方法是在具体的映射器XML文件中直接使用类型处理器,并通过resultMapsql标签中的typeHandler属性来指定。

    <mapper namespace="com.example.YourMapper">
        <resultMap id="yourResultMap" type="com.example.YourType">
            <result column="json_column" property="yourProperty" javaType="com.example.YourJavaType"
                    jdbcType="VARCHAR" typeHandler="com.example.specific.YourSpecificJsonTypeHandler"/>
        resultMap>
        
        
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里,com.example.specific.YourSpecificJsonTypeHandler应该是JsonTypeHandler的一个非泛型子类,它指定了要处理的Java类型。

    步骤 4: 创建非泛型的特定类型处理器(可选)

    由于直接在XML中配置泛型类型处理器可能会遇到问题,你可能需要为每个要处理的特定类型创建一个非泛型的子类。例如:

    public class YourSpecificJsonTypeHandler extends JsonTypeHandler<YourJavaType> {
        public YourSpecificJsonTypeHandler() {
            super(YourJavaType.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后,你可以在MyBatis的映射器XML文件中使用这个特定的类型处理器。

    结论

    通过创建自定义的JsonTypeHandler并将其集成到MyBatis中,你可以方便地在Java对象和JSON字符串之间进行映射,从而在处理包含JSON字段的数据库时更加灵活和高效。记得根据你的具体需求调整类型处理器的实现和配置。

  • 相关阅读:
    智源AI日报(2022-08-26):当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
    基于Java web的校园滴滴代驾管理系统 毕业设计-附源码260839
    SQL Server整体架构(2)——数据库
    Android随笔-ClassLoader
    【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    ffmpeg基础三:H264,从MP4文件获取(av_bsf_get_by_name(“h264_mp4toannexb“))和从TS流获取保存H264
    逻辑思维能力选择题30道
    第十三届蓝桥杯总结
    bootstrap学习(一)
    Spring整合第三方框架-MyBatis整合Spring实现
  • 原文地址:https://blog.csdn.net/li371518473/article/details/136434156