In case I have a mysql join query result set, it is in json format, like this:
JavaScript
x
[
{
"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"
}
]
and the mybatis mapper
JavaScript
<?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>
I can’t access this mysql instance directly, I can only export query result in json format through some “proxy platform”, is there anyway convert the json to org.example.mybatis.dto.User
through the existing mybatis mapper easily?
PS: I tried to use mybatis Interceptor
to intercept ResultSetHandler.handleResultSets
, but it seems that I must mock Statement
and ResultSet
Advertisement
Answer
JOOQ can convert txt/json/csv to ResultSet
JavaScript
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)])]