7. MyBatis一对多查询

一: 准备工作

1. 建立数据

CREATE TABLE boss(
	b_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
	b_name VARCHAR(255)
);
CREATE TABLE manager(
	m_id INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
	m_name VARCHAR(255)
);
INSERT INTO boss(b_name) VALUES(‘Tom‘);
INSERT INTO manager(m_name) VALUES(‘Mgr1‘);
INSERT INTO manager(m_name) VALUES(‘Mgr2‘);
INSERT INTO manager(m_name) VALUES(‘Mgr3‘);

2. 建立对应的实体类

package com.mybatis.entities;
public class Manager {

	private Integer id;
	private String name;
	// 提供对应的 getter/setter 方法
	// 提供 toString 方法
}
================================
package com.mybatis.entities;

import java.util.List;

public class Boss {

	private Integer id;
	private String name;
	private List<Manager> mgrs;
	// 提供相应的 getter/setter 方法
	// 提供 toString 方法
}

3. 建立对应的sql映射文件

这里只查询 Boss 然后接着把Boss下的所有管理者都查出来, 所以就只建立Boss的映射文件.

二: 测试

1. 在 BossMapper.xml 写 SQL语句, 以及对应的配置

<?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.entities.BossMapper">

	<!-- 
		查询方式有两种, 分别是:
		1. 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集封装联表查询的数据(去除重复的数据)
		2. 嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型
	 -->
	 
	 <!-- 测试 嵌套结果 -->
	 <!-- 由于返回值中有一个对象, 所以只用别名来映射不可用, 这里就使用一个自定义一个返回值类型来映射 -->
	 <select id="getBoss1" parameterType="int" resultMap="getBoss1Map">
	 	SELECT * FROM boss b, manager m WHERE b.b_id=m.b_id AND b.b_id=#{b_id}
	 </select>
	 <!-- 
	 	id: 必须与上面的 resultMap="getStundet1Map" 对应起来
	 	type: 指定返回值类型, 可以理解为 select标签的resultType
	  -->
	 <resultMap type="Boss" id="getBoss1Map">
	 	<id column="b_id" property="id"/>
	 	<result column="b_name" property="name"/>
	 	<!-- ofType指定students集合中的对象类型 -->
	 	<collection property="mgrs" ofType="Manager">
	 		<id column="m_id" property="id"/>
	 		<result column="m_name" property="name"/>
	 	</collection>
	 </resultMap>
	 
	 <!-- 测试 嵌套查询 -->
	 <!-- 由于返回值中有一个对象, 所以只用别名来映射不可用, 这里就使用一个自定义一个返回值类型来映射 -->
	 <select id="getBoss2" parameterType="int" resultMap="getBoss2Map">
	 	SELECT b_id, b_name FROM boss WHERE b_id=#{b_id}
	 </select>
	 <!-- 这里使用别名来映射实体类中的属性 -->
	 <select id="getManager" parameterType="int" resultType="Teacher">
	 	SELECT m_id id, m_name name FROM manager WHERE b_id=#{b_id}
	 </select>
	 <resultMap type="Boss" id="getBoss2Map">
	 	<id column="b_id" property="id"/>
	 	<result column="b_name" property="name"/>
	 	<collection property="mgrs" column="b_id" ofType="Manager" select="getManager"></collection>
	 </resultMap>
	 

</mapper>

2. 代码测试

package com.mybatis.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.mybatis.entities.Boss;
import com.mybatis.util.MyBatisUtil;

public class TestBoss {

	@Test
	public void testGetBoss1(){

		SqlSession session = MyBatisUtil.getSqlSession();

		String statement = "com.mybatis.entities.BossMapper.getBoss1";
		Boss boss = session.selectOne(statement, 1);
		System.out.println(boss);

	}

	@Test
	public void testGetBoss2(){

		SqlSession session = MyBatisUtil.getSqlSession();

		String statement = "com.mybatis.entities.BossMapper.getBoss2";
		Boss boss = session.selectOne(statement, 1);
		System.out.println(boss);

	}

}

完成测试!

本篇博文源代码点击 http://pan.baidu.com/s/1i3LPOP3 下载!

时间: 2024-08-07 16:59:31

7. MyBatis一对多查询的相关文章

Mybatis一对多查询

<resultMap type="com.neuedu.bean.tbl_dept" id="findDepartByIdMap"> <id column="did" property="id"/> <result column="dept_name" property="deptName"/><!--使用collection标签 propert

mybatis学习笔记(11)-一对多查询

mybatis学习笔记(11)-一对多查询 mybatis学习笔记11-一对多查询 示例 小结 本文实现一对多查询,查询订单及订单明细的信息 示例 sql 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders.*, user.username, user.sex, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.item

mybatis 一对多和多对一关联查询

首先  数据库量表之间字段关系(没有主外键) studentmajor表的id字段对应student表里major字段 两个实体类 package com.model; import java.util.Date; public class Student { private Integer sno; private String sname; private String ssex; private Integer sclass; private StudentMajor studentmaj

Mybatis最入门---ResultMaps实例篇(一对多查询)

[一步是咫尺,一步即天涯] 接上文,我们来演示在实际开发中,如何配置和使用resultMap实现一对多查询. 准备工作: a.操作系统 :win7 x64 b.基本软件:MySQL,Mybatis,Spring,SQLyog,Tomcat,web基础 特别的,作为演示程序,还请各位看官不要纠结数据库的细节内容 ----------------------------------------------------------------------------------------------

mybatis一对多关联查询+pagehelper-&gt;分页错误(toSolve)

mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: todo 疑惑: 之前有人提过类似的issue(https://github.com/pagehelper/Mybatis-PageHelper/issues/149)为什么被关闭了 原文地址:https://www.cnblogs.com/goingforward/p/8492448.html

mybatis0205 一对多查询 复杂

查询所有用户信息,关联查询订单及订单明细信息及商品信息,订单明细信息中关联查询商品信息 1.1sql 主查询表:用户信息 关联查询:订单.订单明细,商品信息 SELECT orders.*, user.username, user.sex , orderdetail.id orderdetail_id, orderdetail.items_num, orderdetail.items_id, items.name items_name, items.detail items_detail FRO

mybatis0204 一对多查询

查询所有订单信息及订单下的订单明细信息. sql语句 主查询表:订单表 关联查询表:订单明细 SELECT orders.*, user.username, user.sex , orderdetail.id orderdetail_id, orderdetail.items_num, orderdetail.items_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orders.id = orderde

mybatis 一对多和多对一

在学习MyBatis3的过程中,文档上面一直在强调一个id的东西!在做这个实验的时候,也因为没有理解清楚id含义而导致一对多的"多"中也只有一条数据.id和result的唯一不同是id表示的结果将是当比较对象实例时用到的标识属性.这帮助来改进整体表现,特别是缓存和嵌入结果映射.所以不同数据的id应该唯一区别,不然导致数据结果集只有一条数据. 一.表 二.实体 1.person [java] view plain copy package com.kerwin.mybatis.pojo;

Mybatis关联表查询_5

使用Mybatis实现关联查询,分为一对一和一对多两种情况,最后并对ResultMap进行一个简要说明. 创建表和数据 创建教师表,班级表,学生表, 假设一个老师只负责教一个班,那么老师和班级之间的关系是一对一的关系. 假设一个班级有多个学生,那么班级和学生之间的关系是一对多的关系. CREATE TABLE teacher( t_id number(5) PRIMARY KEY, t_name VARCHAR2(20) ); CREATE TABLE class( c_id number(5)