概述
对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
能匹配任意字符串。
最后
以上就是眼睛大小蚂蚁为你收集整理的Mybatis select 查询返回值为List集合+源码的全部内容,希望文章能够帮你解决Mybatis select 查询返回值为List集合+源码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复