Mybatis TypeHandler 将数据库里的JSONAarry字符串转为java对象List
1.pom.xml依赖<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.56</version&...
·
1.pom.xml依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
2.java对象
public class SessionVo {
...
private List<TagInfoVo> tags;
public List<TagInfoVo> getTags() {
return tags;
}
public void setTags(List<TagInfoVo> tags) {
this.tags = tags;
}
...
}
3.ListTypeHandler
/**
* 处理jsonArray字符串为pojoList
*
*
* @author zj
* @date 2020/1/8
*/
//支持的java对象
@MappedTypes(value = {TagInfoVo.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class ListTypeHandler<T extends Object> implements TypeHandler<List<T>> {
private List<T> getListByJsonArrayString(String content) {
if (StringUtils.isEmpty(content)) {
return new ArrayList<>();
}
return JSON.parseObject(content, new TypeReference<ArrayList<T>>() {
});
}
/**
* 用于定义在Mybatis设置参数时该如何把Java类型的参数转换为对应的数据库类型
*
* <PRE>
* PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
* SET SALARY = ? WHERE ID = ?");
* pstmt.setBigDecimal(1, 153833.00)
* pstmt.setInt(2, 110592)
* </PRE>
*
* @param preparedStatement An object that represents a precompiled SQL statement
* @param i 当前参数的位置
* @param t 当前参数的Java对象
* @param jdbcType 当前参数的数据库类型
* @throws SQLException
*/
@Override
public void setParameter(PreparedStatement preparedStatement, int i, List<T> t, JdbcType jdbcType) throws SQLException {
if (CollectionUtils.isEmpty(t)) {
preparedStatement.setString(i, null);
} else {
preparedStatement.setString(i, JSON.toJSONString(t));
}
}
@Override
public List<T> getResult(ResultSet resultSet, String s) throws SQLException {
return getListByJsonArrayString(resultSet.getString(s));
}
@Override
public List<T> getResult(ResultSet resultSet, int i) throws SQLException {
return getListByJsonArrayString(resultSet.getString(i));
}
@Override
public List<T> getResult(CallableStatement callableStatement, int i) throws SQLException {
return getListByJsonArrayString(callableStatement.getString(i));
}
}
4.配置(以下二选一即可)
4.1、局部生效配置
SessionVo的其它属性,使用默认的就好了
<resultMap id="sessionMap" type="com.centerm.usermanager.vo.SessionVo">
<result column="tags" property="tags" typeHandler="com.centerm.usermanager.handler.mybatis.ListTypeHandler"/>
</resultMap>
<!--获取列表-->
<select id="list" parameterType="com.centerm.usermanager.vo.SessionVo"
resultMap="sessionMap">
SELECT
...
<if test="columns!=null and columns !='' and columns.contains('tags')">
,(SELECT concat( '[', group_concat( json_object ( 'tagId', e.tagId, 'tagName', f.tagName ) ), ']' )
FROM session_tag e
LEFT JOIN tag_info f ON e.tagId = f.tagId
WHERE e.sessionId = a.sessionId
) tags
</if>
...
</select>
4.2.全局配置在appiication.yml配置拦截器的包名
mybatis:
type-handlers-package: com.centerm.usermanager.handler.mybatis
之后,mybatis会扫描,注册这个拦截器,遇到这种类型时,会自动转换,不用在mapper映射再单独配置。
5.返回结果
[ { "sessionId": "3f7af68bbc3b4910b291816f14fcadc2", "tags": [ { "tagId": 52, "tagName": "333" }, { "tagId": 50, "tagName": "333" }, { "tagId": 54, "tagName": "1" } ] }
更多推荐
已为社区贡献1条内容
所有评论(0)