Mybatis TypeHandler 将数据库里的JSONAarry字符串转为java对象List

您所在的位置:网站首页 数据库字符串转数组 Mybatis TypeHandler 将数据库里的JSONAarry字符串转为java对象List

Mybatis TypeHandler 将数据库里的JSONAarry字符串转为java对象List

2024-04-02 23:49| 来源: 网络整理| 查看: 265

1.pom.xml依赖

com.alibaba fastjson 1.2.56 org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2

2.java对象

public class SessionVo { ... private List tags; public List getTags() { return tags; } public void setTags(List 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 implements TypeHandler { private List getListByJsonArrayString(String content) { if (StringUtils.isEmpty(content)) { return new ArrayList(); } return JSON.parseObject(content, new TypeReference() { }); } /** * 用于定义在Mybatis设置参数时该如何把Java类型的参数转换为对应的数据库类型 * * * PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES * SET SALARY = ? WHERE ID = ?"); * pstmt.setBigDecimal(1, 153833.00) * pstmt.setInt(2, 110592) * * * @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, JdbcType jdbcType) throws SQLException { if (CollectionUtils.isEmpty(t)) { preparedStatement.setString(i, null); } else { preparedStatement.setString(i, JSON.toJSONString(t)); } } @Override public List getResult(ResultSet resultSet, String s) throws SQLException { return getListByJsonArrayString(resultSet.getString(s)); } @Override public List getResult(ResultSet resultSet, int i) throws SQLException { return getListByJsonArrayString(resultSet.getString(i)); } @Override public List getResult(CallableStatement callableStatement, int i) throws SQLException { return getListByJsonArrayString(callableStatement.getString(i)); } }

4.配置(以下二选一即可)

4.1、局部生效配置

SessionVo的其它属性,使用默认的就好了

SELECT ... ,(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 ...

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" } ] }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3