使用mybatis框架,DAO层中一些特殊的返回值,例如:list,set,map集合,在查询出数据之后,如何按照指定的返回值封装。
以下是一些常用的封装方式
1.结果集封装成List集合
DAO
//获取所有的User对象,并将查询出来的User对象封装到List集合中
public LinkedList<User> getUserList();
UserMapper.xml
<!-- public LinkedList<User> getUserList();
返回的是List集合,resultType指定数据封装的对象
resultType="com.mybatis.bean.User"
-->
<select id="getUserList" resultType="com.mybatis.bean.User">
select * from User
</select>
2.结果集封装成Map集合
DAO
/**
* 把sql返回的每一条数据封装成User,并将所有的User对象封装成Map集合
* key对应的是Integer类型的主键
* @return Map
*/
@MapKey("id") //告诉Mybatis查询出来的结果集封装到Map集合中,使用结果集中的id值作为key
public Map<Integer,User> getMap();
UserMapper.xml
<!-- public Map<Integer,User> getMap();
resultType : 指定查询出的数据封装成User 对象
@MapKey("id") : 每条数据的id字段作为key
-->
<select id="getMap" resultType="com.mybatis.bean.User">
select * from User
</select>
3.结果集封装成 List<Map<String,Object>>
List<Map<String ,String >>的类型,这个类型可以存放多个map,且map中可以放多个键值对;
封装规则:查询出来的每一条数据都会被封装成一个map集合,每一条数据的列 被封装成键值对 (列名为key)
DAO
// 查询用户的所有菜单
public List<Map<String,Object>> findUserMenus(Integer userId);
Mapper.xml
<!-- 查询登陆用户可见的所有菜单 (每一条数据都封装成一个map集合) -->
<select id="findUserMenus" resultType="map">
select
m.id,
m.name,
m.url,
m.parentId
from sys_user_roles ur
join sys_role_menus rm
join sys_menus m
on ur.role_id = rm.role_id and rm.menu_id = m.id
and ur.user_id = #{id}
where type = 1
</select>
Demo演示:
说明:
对 List<Map<String,Object>> 集合解析:用两个for循环,第一个for循环获取list集合中的map,第二个解析map中的数据,根据m.entrySet()就可以得到查询出来的字段,然后根据 getKey getValue 获取对应的对象
@Test
public void menus() {
SysUserService bean = ac.getBean("userService",SysUserService.class);
//查询id为3的用户所有菜单
List<Map<String,Object>> list = bean.findUserMenus(3);
//遍历所有数据
for(Map<String,Object> m :list) {
for( Entry<String,Object> en: m.entrySet()) {
System.out.println("key="+en.getKey()+"...value="+en.getValue());
}
System.out.println("--end--"+"\r\n"); //每遍历一个map标记一次
}
}
console 输出
key=name...value=产品管理
key=id...value=3
key=url...value=请求路径
--end--
key=name...value=项目信息
key=id...value=11
key=url...value=project/listUI.do
key=parentId...value=3
--end--
key=name...value=团信息
key=id...value=12
key=url...value=team/listUI.do
key=parentId...value=3
--end--
key=name...value=产品信息
key=id...value=13
key=url...value=product/listUI.do
key=parentId...value=3
--end--
key=name...value=产品分类
key=id...value=140
key=url...value=type/listUI.do
key=parentId...value=3
--end--
如上:查询用户3的所有菜单,共5条数据,每一条都被封装成map集合 (每列作为集合的 键值对)。