我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mybatis-plus 使用 typeHandler 将 String 拼接字符串转换为 List 列表

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mybatis-plus 使用 typeHandler 将 String 拼接字符串转换为 List 列表

一、需求描述

首先说明需求,有三张表:
学生
学生表、角色表、以及一张关联的中间表。
角色
学生可以有多个角色,但是这多个角色我是作为多条记录存储在另外一张表中的,现在想将这多条记录查询出来,注入到Student对象中的一个List属性中去。

即最后的Student对象结果应该长这样:

[    {        "id": 1,        "name": "硕子鸽",        "roles": [            "物理课代表",            "数学课代表"        ]    }]

总之就是要将 1,2,3 或者 1 2 3 转换为 Java 中的 List = [1,2,3]。

我可以在Service层中做两次查询然后分别注入,但是为了优雅一点,我想只使用持久层框架就解决这个问题。

二、实现方案

这边了解到Mybatis框架中提供了一个类型转换器,我可以实现该接口来完成自定义类型转换。这个抽象类为BaseTypeHandler

首先我需要写个SQL将想要的数据查询出来,然后再考虑类型转换。

查询的语句为:

SELECT stu.*,       (SELECT group_concat(r.role_name) AS roles        FROM stud_role sr                 left join role r on sr.role_id = r.role_id        WHERE sr.stu_id = stu.id) AS rolesFROM student stu;

这段SQL的查询结果如下,含义是把该学生信息、以及该学生所属的角色拼接成字符串作为一个字段查出来。

其中group_concatMysql中的函数,在Oracle中请使用wmsys.wm_concat以达到同样的效果。
查询结果
然后就是类型转换了。

实现BaseTypeHandler抽象类:

package com.shuo.mpth.handler;import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.MappedJdbcTypes;import org.apache.ibatis.type.MappedTypes;import org.springframework.util.StringUtils;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Arrays;import java.util.List;@MappedJdbcTypes(JdbcType.VARCHAR)@MappedTypes({List.class})public class ListTypeHandler extends BaseTypeHandler<List<String>> {    private static final String DELIM = ",";    @Override    public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<String> strings, JdbcType jdbcType) throws SQLException {        String value = StringUtils.collectionToDelimitedString(strings, DELIM);        preparedStatement.setString(i, value);    }    @Override    public List<String> getNullableResult(ResultSet resultSet, String s) throws SQLException {        String value = resultSet.getString(s);        return Arrays.asList(StringUtils.tokenizeToStringArray(value, DELIM));    }    @Override    public List<String> getNullableResult(ResultSet resultSet, int i) throws SQLException {        String value = resultSet.getString(i);        return Arrays.asList(StringUtils.tokenizeToStringArray(value, DELIM));    }    @Override    public List<String> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {        String value = callableStatement.getString(i);        return Arrays.asList(StringUtils.tokenizeToStringArray(value, DELIM));    }}
  • @MappedJdbcTypes:表示SQL语句中查出来的类型;
  • @MappedTypes:表示要转成 Java 对象的类型;
  • DELIM:表示字符串的分隔符,如果你是用空格分开的就赋值为空格。

这知识第一步,下面我们需要在指定的地方使用它,这里我直接使用 @TableField 注解指定待转换字段。

@Datapublic class Student {        private Integer id;        private String name;        @TableField(typeHandler = ListTypeHandler.class)    private List<String> roles;}
  • typeHandler:指定类型转换器;

如果没有使用 mybatis-plus ,使用的是 mybatis 的 xml 配置,则在 property 标签里增加typeHandler属性是一样的效果。

最后我们还需要在 yml 配置文件中增加一段配置:

mybatis-plus:  mapper-locations: classpath*:mapper/*.xml  type-aliases-package: com.shuo.mpth.**.entity  configuration:    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  type-handlers-package: com.shuo.mpth.handler
  • type-handlers-package:指定handler的包名。

随即启动项目,请求接口,发现已经完成类型的转换:
请求接口

来源地址:https://blog.csdn.net/weixin_43941364/article/details/128649923

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mybatis-plus 使用 typeHandler 将 String 拼接字符串转换为 List 列表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用golang中的strconv.QuoteToASCII函数将字符串转换为ASCII码表示

使用golang中的strconv.QuoteToASCII函数将字符串转换为ASCII码表示在使用Golang进行编程的过程中,我们经常会遇到需要将字符串转换为ASCII码表示的情况。ASCII码是一种常见的字符编码标准,可以将字符映射为
使用golang中的strconv.QuoteToASCII函数将字符串转换为ASCII码表示
2023-11-18

使用正则表达式将字符串的首字母由小写转换为大写

本篇文章给大家分享《使用正则表达式将字符串的首字母由小写转换为大写》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更
使用正则表达式将字符串的首字母由小写转换为大写
2024-04-04

编程热搜

目录