一、将查询到的多条结果集封装到map对象里面
1、mapper.xml方法
<select id="selectAllMap" resultType="com.mybatis.entity.User">
select * from user
</select>
2、Mapper接口方法
@MapKey("id")
Map<Integer,User> selectAllMap();
3、测试结果:
注:需要注解@MapKey,标注要User对象的那个属性作为key值。
二、一对一查询
1、我们来假设一个场景,班级与班主任之间的关系,存在一对一关系。表结构如下,
班主任表和班级表
2、建立对应的接口和mapper配置文件
package com.mybatis.Mapper;
import com.mybatis.entity.ClassDto;
/**
* 班主任接口
* @author dgw
*
*/
public interface IMaster {
/**
* 根据班级查询班级信息
* @return
*/
ClassDto findMasterByClassId(Integer classId);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.Mapper.IMaster">
<!-- 返回班级信息 -->
<resultMap type="com.mybatis.entity.ClassDto" id="classDto">
<id column="id" property="id" />
<result column="class_name" property="className"/>
<result column="class_master_id" property="classMasterId"/>
<association property="master" javaType="com.mybatis.entity.Master">
<id column="id1" property="id" />
<result column="name" property="name"/>
</association>
</resultMap>
<!-- 根据班级id查询班主任 -->
<select id="findMasterByClassId" resultMap="classDto">
SELECT
*,
m.id id1 <!-- 此处必须为m.id 取个别名,否则封装不进来 -->
FROM
t_class t
JOIN MASTER m ON t.class_master_id = m.id
WHERE
t.id = #{classId}
</select>
</mapper>
3、ClassDto对象结构
package com.mybatis.entity;
/**
* 一对一返回对象
* @author dgw
*
*/
public class ClassDto {
private Integer id;
private String className;
private Integer classMasterId;
private Master master;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public Integer getClassMasterId() {
return classMasterId;
}
public void setClassMasterId(Integer classMasterId) {
this.classMasterId = classMasterId;
}
public Master getMaster() {
return master;
}
public void setMaster(Master master) {
this.master = master;
}
public ClassDto() {
super();
}
public ClassDto(Integer id, String className, Integer classMasterId, Master master) {
super();
this.id = id;
this.className = className;
this.classMasterId = classMasterId;
this.master = master;
}
@Override
public String toString() {
return "ClassDto [id=" + id + ", className=" + className + ", classMasterId=" + classMasterId + ", master="
+ master + "]";
}
}
4、测试代码
@Test
public void test10() throws JsonProcessingException{
//1,获取SqlSession回话
SqlSession sqlSession =getSqlSession();
try {
//2,获取代理出来的接口实现类对象
IMaster mapper = sqlSession.getMapper(IMaster.class);
System.out.println(mapper);
//3,用接口实现类对象调用接口方法
ClassDto master = mapper.findMasterByClassId(1);
System.out.println(master);
} finally {
//end:关闭SqlSession回话
sqlSession.close();
}
}
5,测试结果图
三、一对多查询
1、一对多或者,多对多关系在系统开发中出现得比较多,但出现多对多的情况我们一般会转为双向一对多,借助中间表来解决问题。如用户角色关系,根据用户id查询出所有角色
2、表结构
(用户表user)
(角色表role)
(用户角色关系表)
3、建立Mapper接口和Mapper.xml文件
package com.mybatis.Mapper;
import com.mybatis.entity.UserDto;
public interface IUserMapper {
UserDto getUserInfoById(Integer id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.Mapper.IUserMapper">
<resultMap type="com.mybatis.entity.UserDto" id="UserInfoMap">
<!-- UserDto采用继承User类时 -->
<!-- <id column="id" property="id" /> -->
<!-- <result column="name" property="name"/> -->
<!-- <result column="age" property="age"/> -->
<!-- <result column="is_delete" property="isDelete"/> -->
<!-- <result column="gender" property="gender"/> -->
<!-- UserDto采用组合User类时 -->
<id column="id" property="user.id" />
<result column="name" property="user.name"/>
<result column="age" property="user.age"/>
<result column="is_delete" property="user.isDelete"/>
<result column="gender" property="user.gender"/>
<collection property="roles" ofType="com.mybatis.entity.Role">
<id column="role_id" property="roleId" />
<result column="role_name" property="roleName"/>
</collection>
</resultMap>
<select id="getUserInfoById" resultMap="UserInfoMap">
SELECT
u.*,
r.*
FROM
USER u
INNER JOIN user_role ur ON u.id = ur.user_id
RIGHT OUTER join role r ON ur.role_id=r.role_id
WHERE
u.id = #{id}
</select>
</mapper>
4、测试类和查询结果
@Test
public void test11() throws JsonProcessingException{
//1,获取SqlSession回话
SqlSession sqlSession =getSqlSession();
try {
//2,获取代理出来的接口实现类对象
IUserMapper mapper = sqlSession.getMapper(IUserMapper.class);
//3,用接口实现类对象调用接口方法
UserDto userInfo = mapper.getUserInfoById(1);
System.out.println(userInfo);
} finally {
//end:关闭SqlSession回话
sqlSession.close();
}
}
UserDto [user=User [id=1, name=白水柔情, age=22, address=null, isDelete=false, gender=WEMEN], roles=[Role [roleId=1, roleName=教师], Role [roleId=2, roleName=班主任], Role [roleId=3, roleName=美女]]]
四、分布查询将结果集封装为一个树对象
1、建立树形菜单表
2、建立树形对象
package com.mybatis.entity;
import java.util.List;
public class MenuTree {
private Integer id;
private String name;
private Integer parentId;
private List<MenuTree> childrens;
public MenuTree() {
super();
}
public MenuTree(Integer id, String name, Integer parentId, List<MenuTree> childrens) {
super();
this.id = id;
this.name = name;
this.parentId = parentId;
this.childrens = childrens;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public List<MenuTree> getChildrens() {
return childrens;
}
public void setChildrens(List<MenuTree> childrens) {
this.childrens = childrens;
}
@Override
public String toString() {
return "MenuTree [id=" + id + ", name=" + name + ", parentId=" + parentId + ", childrens=" + childrens + "]";
}
}
3、建立该表对应的Mapper接口
package com.mybatis.Mapper;
import com.mybatis.entity.MenuTree;
public interface IMenuMapper {
MenuTree getMenuTree();
}
Mapper接口对应的xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.Mapper.IMenuMapper">
<resultMap type="com.mybatis.entity.MenuTree" id="MenuInfoMap">
<id column="id" property="id" />
<result column="menu_name" property="name"/>
<collection property="childrens" ofType="com.mybatis.entity.MenuTree"
select="findMenuById" column="id">
</collection>
</resultMap>
<select id="getMenuTree" resultMap="MenuInfoMap">
SELECT
*
FROM
menu
where
parent_id = 0
</select>
<select id="findMenuById" resultMap="MenuInfoMap">
SELECT
*
FROM
menu
WHERE parent_id=#{id}
</select>
</mapper>
4、测试代码
@Test
public void test12() throws JsonProcessingException{
//1,获取SqlSession回话
SqlSession sqlSession =getSqlSession();
try {
//2,获取代理出来的接口实现类对象
IMenuMapper mapper = sqlSession.getMapper(IMenuMapper.class);
//3,用接口实现类对象调用接口方法
MenuTree menuTree = mapper.getMenuTree();
System.out.println(menuTree);
} finally {
//end:关闭SqlSession回话
sqlSession.close();
}
}
5、测试结果
MenuTree [id=1, name=中国, parentId=0, childrens=[MenuTree [id=2, name=云南, parentId=1, childrens=[MenuTree [id=3, name=昆明, parentId=2, childrens=[MenuTree [id=4, name=官渡, parentId=3, childrens=[]], MenuTree [id=5, name=五华, parentId=3, childrens=[]], MenuTree [id=6, name=盘龙, parentId=3, childrens=[]]]], MenuTree [id=7, name=楚雄, parentId=2, childrens=[]], MenuTree [id=8, name=曲靖, parentId=2, childrens=[]], MenuTree [id=9, name=昭通, parentId=2, childrens=[]]]]]]
总结:此处侧重mybatis分步递归查询树形对象的讲解,针对树形数据的查询,java算法部分会进行讲解。