Mybatis select 查询返回值为List集合+源码

对mysql做查询的时候返回值经常是个List<object>,在mapper.xml对应的statement中有时候是resultType有时候却是resultMap。傻傻分不清楚所以总是去找以前的代码看看是怎么写的,等花时间整理的这块的时候才发现用哪个其实很简单,几分钟就能理清楚。博客中提到的查询场景在源码的测试中都有对应

假设我现在要查询文章,Article类有三个属性:文章的id,文章所属的用户id,文章内容。

public class Article {
  private String id;
  private String userId;
  private String body;

  public Article(String userId, String body) {
    this.id = UUID.randomUUID().toString();
    this.userId = userId;
    this.body = body;
  }
}

场景一:我要查询一个用户所有文章的Id,很明显查询的结果是个List<String>,别忘了string也是个Object。此时用resultType,先这么记着下面再做解释,对应的statement如下所示:

<select id="findArticles" resultType="java.lang.String">
  select id
  	from articles A
  where A.user_id = #{userId}
</select>

场景二:我要查询一个用户的所有文章,不着急根据读写分离的原则我们先定义一个专门用来接收读取的文章的类ArticleData,它的属性跟Article一模一样。

public class ArticleData {
  private String id;
  private String userId;
  private String body;
}

这个查询结果也很明显肯定是个List<ArticleData>,但好多人困惑的是“老虎”、“老鼠”到底用哪个。先用resultMap试试,对应的statement如下所示,给要查的字段取个别名如A.id的别名是articleId,最后在resultMap中将字段名和ArticleData的属性一一映射起来,这样查询就完成了。具体的Mybatis查询语法这里就不解释了。

<sql id="articleData">
  select
    A.id articleId,
    A.user_id articleUserId,
    A.body articleBody
</sql>

<select id="findByUserId" resultMap="articleData">
  <include refid="articleData"/>
  from articles A
  where A.user_id = #{userId}
</select>

<resultMap id="articleData" type="com.yang.mybatis.application.data.ArticleData">
  <id property="id" column="articleId"/>
  <result property="userId" column="articleUserId"/>
  <result property="body" column="articleBody"/>
</resultMap>

那能否用resultType呢?答案是可以的。只是有一个要求:被查询的字段的名字必须和接收对象的属性名一样。看个呆萌就就明白什么意思了。statuement得这么写:

<select id="findByUserId" resultType="com.yang.mybatis.application.data.ArticleData">
  select
    A.id id,
    A.user_id userId,
    A.body body
  from articles A
  where A.user_id = #{userId}
</select>

三个待查字段取的别名跟ArticleData中属性的名字一样,否则这种方式就会报错。再回头看下场景一的查询,是因为String能匹配任意字符串。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值