mybatis几种常用查询

一、将查询到的多条结果集封装到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算法部分会进行讲解。

转载于:https://my.oschina.net/zhaomin/blog/1591170

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值