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

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐