栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mybatis返回单个实体或者返回List的实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mybatis返回单个实体或者返回List的实现

Mybatis 的强大之处之一体现在映射语句上,让我们可以使用简单的配置,就可以实现对参数和返回结果的映射。

实体

package com.test.User

public class User{
private String userId;
private String userName;
private String userPassword;
private Date createTime;
...
setter getter....
}

DAO

public interface UserMapper{
	User getUserById(String userId); //返回单个实体
	List getUserByName(String userName); //返回List
	Map getUserInfoById(String userId);
	List> getUserInfoByName(String userName);
}

数据库

create table user{
USER_ID varchar(40),
USER_NAME varchar(200),
USER_PASSWORD varchar(100),
CREATE_TIME datetime,
....
}

1.返回某个实体

mybatis映射文件


		select * from user where id = #{userId}
	
  • id :identification:语句的标识,在同一个mapper映射文件下id需要唯一
  • parameterType: 参数类型,可以不写。因为 MyBatis 可以推断出传入语句的具体参数
  • resultType: 全限定类名或者是类型别名.

当使用resultType来映射结果时,需要 数据库表的列名或列别名 和 类的属性名相同,这样才能进行字段的匹配(USER_ID 和userId 就不能匹配)。但是如果在Mybatis配置文件中设置了


  

此时,表列名的下划线标记方式可以映射到驼峰标记的形式。(USER_ID -> userId)。mybatis进行映射时会将实体类属性和数据库列名(别名)都转化为大写来比较,所以USER_ID 和 UserId,userID等都可以匹配。

TooManyResultsException

返回单个实体时,调用方法 getUserById,但是如果是因为数据错误导致实际查询结果存在多个时,则会抛出异常。

User getUserById(String userId); //返回单个实体

当实际返回值有多个时则抛出异常。

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

除非可以确定最多只能查询到一条结果,否则的话不建议这么写.可以尝试返回集合的方式。

2.返回List


		select * from user where id=#{userId}
	

如果想要返回单个Map集合,只需要设置resultType="map"就可以了,此时返回的实例类型是HashMap。
Map的key就是数据表的列名或者列别名, value 就是查询的数据库中的结果。如果需要返回linkedHashMap,需要使用全限定类名resultType="java.util.linkedHashMap"。

注意: 返回列对应的结果为 null,则不显示该 key - value 键值对(只针对该行数据对应的Map)


		sql_caluse
	

resultType设置为map,跟上面一样resultType设置为List集合中元素的类型。

关于mybatis传递多个参数,可以参考mybatis3-传递多参数

注意:

偶然发现Mybatis 会自动对重名的列做去重。

比如我有一组数据,使用Map接受

SELECT l1.*,l2.*,l3.* FROM ITEM_CAT l1 LEFT JOIN ITEM_CAT l2 ON l1.Id=L2.PARENT_ID LEFT JOIN ITEM_CAT l3
  ON l2.Id=L3.PARENT_ID WHERe L1.PARENT_ID='0';

实际返回结果,会发现 name1,name2 都没有映射到Map中

[
	{"parent_id":0,"name":"图书","id":1},
	{"parent_id":0,"name":"图书","id":1},
	{"parent_id":0,"name":"图书","id":1},
	{"parent_id":0,"name":"图书","id":1}
	......
]

稍微修改一下字段名称。

 SELECt l1.*,l2.*,l3.*,'test' as name1 FROM ITEM_CAT l1 LEFT JOIN ITEM_CAT l2 ON l1.Id=L2.PARENT_ID LEFT JOIN ITEM_CAT l3
  ON l2.Id=L3.PARENT_ID WHERe L1.PARENT_ID='0';
[
	{"parent_id":0,"name":"图书","id":1,"name1":"test"},
	{"parent_id":0,"name":"图书","id":1,"name1":"test"},
	{"parent_id":0,"name":"图书","id":1,"name1":"test"},
	{"parent_id":0,"name":"图书","id":1,"name1":"test"}
	......
]

可以看到 新增的自定义列名 “name1”,可以正常显示。这是因为使用sql 查询出的同名的列名自动追加数字做区分,而实际保存在 元数据信息中的列名还是原来的。就如同Excel 的单元格一样,不管单元格内容以什么样式显示都不会修改实际值。

小结:

  • 返回集合与返回单个实体对象在映射文件的写法是一致的,不同的地方在于Mapper的返回类型不同。
  • 如果不确定返回值是否是唯一的,尽量使用 集合的返回方式。然乎使用get(0)的方式获取实体。
  • 如果返回实体,一般情况会使用 resultMap来映射返回结果。这样更清晰,直观,而且还可以使用typeHandler对数据类型做进一步处理

返回结果 Mapper xml
实体 T getT() returnType=“T”
集合 List getTList() returnType=“T”

到此这篇关于Mybatis返回单个实体或者返回List的实现的文章就介绍到这了,更多相关Mybatis返回实体或者返回List内容请搜索考高分网以前的文章或继续浏览下面的相关文章希望大家以后多多支持考高分网!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/133265.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号