有没有通过mybatis mapper将json转换成JavaBean的方法?

有没有通过mybatis mapper将json转换成JavaBean的方法?,java,mybatis,Java,Mybatis,如果我有一个mysql连接查询结果集,它是json格式的,如下所示: [ { "user_id": 5294147, "user_name": "rtm", "user_created": "2020-11-11 12:27:41", "user_updated": "2020-11-11 12:

如果我有一个mysql连接查询结果集,它是json格式的,如下所示:

[
    {
        "user_id": 5294147,
        "user_name": "rtm",
        "user_created": "2020-11-11 12:27:41",
        "user_updated": "2020-11-11 12:27:41",
        "tag_id": 10002,
        "tag_user_id": 5294147,
        "tag": "lazy",
        "tag_created": "2020-11-11 12:27:41",
        "tag_updated": "2020-11-11 12:27:41"
    },
    {
        "user_id": 5294147,
        "user_name": "rtm",
        "user_created": "2020-11-11 12:27:41",
        "user_updated": "2020-11-11 12:27:41",
        "tag_id": 10003,
        "tag_user_id": 5294147,
        "tag": "weak",
        "tag_created": "2020-11-11 12:27:41",
        "tag_updated": "2020-11-11 12:27:41"
    }
]
还有mybatis地图绘制器

<?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="org.example.mybatis.mapper.UserMapper">
  <resultMap id="UserTag" type="org.example.mybatis.dto.UserTag">
    <id column="tag_id" jdbcType="INTEGER" property="id"/>
    <result column="tag_user_id" jdbcType="INTEGER" property="userId"/>
    <result column="tag" jdbcType="VARCHAR" property="tag"/>
    <result column="tag_created" jdbcType="TIMESTAMP" property="created"/>
    <result column="tag_updated" jdbcType="TIMESTAMP" property="updated"/>
  </resultMap>

  <resultMap id="User" type="org.example.mybatis.dto.User">
    <id column="user_id" jdbcType="INTEGER" property="id"/>
    <result column="user_name" jdbcType="VARCHAR" property="name"/>
    <result column="user_created" jdbcType="TIMESTAMP" property="created"/>
    <result column="user_updated" jdbcType="TIMESTAMP" property="updated"/>
    <collection property="tagList" column="user_id"
      notNullColumn="tag_user_id"
      javaType="java.util.ArrayList"
      ofType="org.example.mybatis.dto.UserTag"
      resultMap="UserTag"/>
  </resultMap>

  <select id="getUserById" parameterType="hashmap" resultMap="User">
    select
    u.id as user_id,
    u.name as user_name,
    u.created as user_created,
    u.updated as user_updated,
    t.id as tag_id,
    t.user_id as tag_user_id,
    t.tag,
    t.created as tag_created,
    t.updated as tag_updated
    from user u
    left join
    user_tag t
    on
    u.id = t.user_id
    where u.id = #{userId,jdbcType=INTEGER}
  </select>
</mapper>
我不能直接访问这个mysql实例,我只能通过一些代理平台导出json格式的查询结果,是否可以通过现有的mybatis mapper轻松地将json转换为org.example.mybatis.dto.User


PS:我试图使用mybatis拦截器截取ResultSetThandler.HandlerResultSets,但似乎我必须模拟语句和ResultSets,JOOQ可以将txt/json/csv转换为ResultSets

String json = ... // json;
DSLContext dsl = DSL.using(SQLDialect.MYSQL);
Result<?> result= dsl.fetchFromJSON(json);
ResultSet rs = result.intoResultSet();

// mybaits Configuration
Configuration dummyConfiguration = new Configuration();
dummyConfiguration .addMappers("org.example.mybatis.mapper");
MappedStatement ms = dummyConfiguration.getMappedStatement("getUserById");

// just copy mybaits DefaultResultSetHandler and remove some code
FakeResultSetHandler resultHandler = new FakeResultSetHandler(ms, null, RowBounds.DEFAULT);
List<Object> list = resultHandler.handleResultSets(rs);
System.out.println(list);

// output 
// [User(id=5294147, name=rtm, created=Wed Nov 11 12:27:41 CST 2020, updated=Wed Nov 11 12:27:41 CST 2020, tagList=[UserTag(id=10002, userId=5294147, tag=lazy, created=Wed Nov 11 12:27:41 CST 2020, updated=Wed Nov 11 12:27:41 CST 2020), UserTag(id=10003, userId=5294147, tag=weak, created=Wed Nov 11 12:27:41 CST 2020, updated=Wed Nov 11 12:27:41 CST 2020)])]

JOOQ可以将txt/json/csv转换为结果集

String json = ... // json;
DSLContext dsl = DSL.using(SQLDialect.MYSQL);
Result<?> result= dsl.fetchFromJSON(json);
ResultSet rs = result.intoResultSet();

// mybaits Configuration
Configuration dummyConfiguration = new Configuration();
dummyConfiguration .addMappers("org.example.mybatis.mapper");
MappedStatement ms = dummyConfiguration.getMappedStatement("getUserById");

// just copy mybaits DefaultResultSetHandler and remove some code
FakeResultSetHandler resultHandler = new FakeResultSetHandler(ms, null, RowBounds.DEFAULT);
List<Object> list = resultHandler.handleResultSets(rs);
System.out.println(list);

// output 
// [User(id=5294147, name=rtm, created=Wed Nov 11 12:27:41 CST 2020, updated=Wed Nov 11 12:27:41 CST 2020, tagList=[UserTag(id=10002, userId=5294147, tag=lazy, created=Wed Nov 11 12:27:41 CST 2020, updated=Wed Nov 11 12:27:41 CST 2020), UserTag(id=10003, userId=5294147, tag=weak, created=Wed Nov 11 12:27:41 CST 2020, updated=Wed Nov 11 12:27:41 CST 2020)])]

使用该结果映射,MyBatis可能返回org.example.MyBatis.dto.User的实例,而不是JSON字符串。我猜您的“代理平台”以某种方式将结果对象转换为JSON字符串。如果是这种情况,最简单的解决方案是直接调用MyBatis语句,即org.example.MyBatis.mapper.UserMapper.getUserById。如果这不是一个选项,请参阅这些,了解如何将JSON转换为Java对象。@正如您所看到的,由于某些安全原因,我无法使用mybatis直接查询数据库。是的,核心问题确实是将json转换为java对象,但我认为我自己实现列字段和另一个映射是重复的,它们已经由mybatis实现了,对吗?这看起来确实是多余的。但是如果你不能直接调用MyBatis语句,你还能做什么呢?@ave Use JOOQ,我所需要的只是一个ResultSet,JOOQ可以将txt/json/csv转换为ResultSet对象,然后我复制mybaits DefaultResultSetHandler并删除一些嵌套的查询代码,它对结果映射的效果非常好,MyBatis可能会返回org.example.MyBatis.dto.User的实例,不是JSON字符串。我猜您的“代理平台”以某种方式将结果对象转换为JSON字符串。如果是这种情况,最简单的解决方案是直接调用MyBatis语句,即org.example.MyBatis.mapper.UserMapper.getUserById。如果这不是一个选项,请参阅这些,了解如何将JSON转换为Java对象。@正如您所看到的,由于某些安全原因,我无法使用mybatis直接查询数据库。是的,核心问题确实是将json转换为java对象,但我认为我自己实现列字段和另一个映射是重复的,它们已经由mybatis实现了,对吗?这看起来确实是多余的。但是如果你不能直接调用MyBatis语句,你还能做什么呢?@ave Use JOOQ,我所需要的只是一个ResultSet,JOOQ可以将txt/json/csv转换为ResultSet对象,然后我复制mybaits DefaultResultSetHandler并删除一些嵌套的查询代码,效果非常好