/mybatis-json-typehandler

mybatis-json-typehandler

Primary LanguageKotlinMIT LicenseMIT

Mybatis-Json-TypeHandler Build Status Codecov GitHub licenseDepShield Badge


目的

开发过程中经常会遇到一对多的关系,大部分情况下这种关系都存在一张表中,通过id等关系进行关联。 但是在某些特殊情况下,单独为这种情况生成一个表并不是非常必须,而且也不会对这种关系进行查询。 此时可以考虑将数据存在一对多的一这个表中,把多的数据存成JSON结构。 但是MyBatis并没有对这种情况提供原生支持。此项目提供了一种自动序列化与反序列化的功能。 调用时仅需要在mapper中配置好即可使用。

依赖

项目依赖于MyBatis、Jackson。基于Kotlin语言。java8+

用法

  1. 引入依赖

    • maven
    <dependency>
      <groupId>io.wkz.kotlin</groupId>
      <artifactId>mybatis-json-typehandler</artifactId>
      <version>1.0.1</version>
    </dependency>
    • gradle
       compile 'io.wkz.kotlin:mybatis-json-typehandler:1.0.1'
  2. 实体类

    与正常的实体类没有任何区别

        public class Data {
            private int id;
            //数据库中序列化为JSON Object
            private JsonObject targetObject;
            // 数据库中序列化为JSON Array
            private List<JsonObject> targetList;
           //数据库中序列化为JSON Array
            private JsonObject[] tartetArray;
        }
        public class JsonObject {
            private String xxx;
            private int yyy;
        }
        data class Data(val id: Int = 0, val targetObject: JsonObject? = null, val targetList:List<JsonObject>? =null, val targetArray:Array<JsonObject>? = null)
        data class JsonObject(val xxx:String, val yyy:Int)
  3. mapper

    重点修改在#{}以及resultMap的result中。 明确定义javaType以及typeHandler即可,如下所示

     <?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="io.wkz.kotlin.mybatis.dao.ListJsonDao">
           <resultMap id="Data" type="Data">
               <result column="targetObject" property="targetObject" javaType="JsonObject"
                       jdbcType="VARCHAR" typeHandler="io.wkz.kotlin.mybatis.JsonObjectTypeHandler"/>
               <result column="targetList" property="targetList" javaType="JsonObject"
                       jdbcType="VARCHAR" typeHandler="io.wkz.kotlin.mybatis.JsonListTypeHandler"/>
               <result column="targetArray" property="targetArray" javaType="JsonObject"
                       jdbcType="VARCHAR" typeHandler="io.wkz.kotlin.mybatis.JsonArrayTypeHandler"/>
           </resultMap>
           <insert id="add" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
               insert into tbl_name (targetObject,targetList) value
                   (#{targetObject,javaType=JsonObject,jdbcType=VARCHAR,typeHandler=io.wkz.kotlin.mybatis.JsonObjectTypeHandler},
                   #{targetList,javaType=JsonObject,jdbcType=VARCHAR,typeHandler=io.wkz.kotlin.mybatis.JsonListTypeHandler},
                   #{targetArray,javaType=JsonObject,jdbcType=VARCHAR,typeHandler=io.wkz.kotlin.mybatis.JsonArrayTypeHandler},
                )
           </insert>
           <select id="get" resultMap="Data">
               select *
               from tbl_name
               where id = #{id}
           </select>
        </mapper>