Mybatis学习——一对多关联表查询

1.实体类

 1 public class Student {
 2     private int id;
 3     private String name;
 4 }
 5 public class Classes {
 6     private int id;
 7     private String name;
 8     private Teacher teacher;
 9     private List<Student> students;
10 }

2.映射文件

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="com.zhengbin.entity.classMapper">
 4     <!-- 方式一: 嵌套结果: 使用嵌套结果映射来处理重复的联合结果的子集
 5         SELECT * FROM class c, teacher t,student s WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND c.c_id=1
 6     -->
 7     <select id="getClass3" parameterType="int" resultMap="ClassResultMap3">
 8         select * from class c, teacher t, student s where c.teacher_id=t.t_id and c.C_id=s.class_id and c.c_id=#{id}
 9     </select>
10     <resultMap type="Classes" id="ClassResultMap3">
11         <id property="id" column="c_id" />
12         <result property="name" column="c_name" />
13         <association property="teacher" javaType="Teacher">
14             <id property="id" column="t_id"/>
15             <result property="name" column="t_name"/>
16         </association>
17         <!-- ofType 指定 students 集合中的对象类型 -->
18         <collection property="list" ofType="Student">
19             <id property="id" column="s_id" />
20             <result property="name" column="s_name" />
21         </collection>
22     </resultMap>
23
24     <!-- 方式二:嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型
25         SELECT * FROM class WHERE c_id=1;
26         SELECT * FROM teacher WHERE t_id=1
27         //1 是上一个查询得到的 teacher_id 的值 SELECT*FROMstudentWHEREclass_id=1
28         //1是第一个查询得到的c_id字段的值
29     -->
30     <select id="getClass4" parameterType="int" resultMap="ClassResultMap4">
31         select * from class where c_id=#{id}
32     </select>
33     <resultMap type="Classes" id="ClassResultMap4">
34         <id property="id" column="c_id" />
35         <result property="name" column="c_name" />
36         <association property="teacher" column="teacher_id" javaType="Teacher" select="getTeacher2"></association>
37         <collection property="list" ofType="Student" column="c_id" select="getStudent"></collection>
38     </resultMap>
39     <select id="getTeacher2" parameterType="int" resultType="Teacher">
40         SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id}
41     </select>
42     <select id="getStudent" parameterType="int" resultType="Student">
43         SELECT s_id id, s_name name FROM student WHERE class_id=#{id}
44     </select>
45 </mapper>

classMapper.xml

3.测试类

 1 package com.zhengbin.test;
 2
 3 import java.util.List;
 4
 5 import org.apache.ibatis.session.SqlSession;
 6 import org.apache.ibatis.session.SqlSessionFactory;
 7
 8 import com.zhengbin.entity.Classes;
 9 import com.zhengbin.entity.Student;
10 import com.zhengbin.util.MyBatisUtils;
11
12 public class Test5 {
13     @org.junit.Test
14     public void getClasses(){
15         SqlSessionFactory sessionFactory = MyBatisUtils.getFactory();
16         // 参数为TRUE,相当于session.commit();
17         SqlSession session = sessionFactory.openSession(true);
18         // 读取映射文件
19         String statement = "com.zhengbin.entity.classMapper" + ".getClass3";
20         /*
21          * 查看本班所有学生的信息,与任课老师的信息
22          * 一个班级对多个学生,一个班级对一个老师
23          * 即 一对多 与 一对一
24          */
25         Classes c = session.selectOne(statement,1);
26         List<Student>list = c.getList();
27         System.out.println(list);
28         System.out.println(c);
29         session.close();
30     }
31
32     @org.junit.Test
33     public void getClasses1(){
34         SqlSessionFactory sessionFactory = MyBatisUtils.getFactory();
35         // 参数为TRUE,相当于session.commit();
36         SqlSession session = sessionFactory.openSession(true);
37         // 读取映射文件
38         String statement = "com.zhengbin.entity.classMapper" + ".getClass4";
39         Classes c = session.selectOne(statement,1);
40         List<Student> list = c.getList();
41         System.out.println(list);
42         System.out.println(c);
43         session.close();
44     }
45 }

Test.java

时间: 2024-08-08 01:09:17

Mybatis学习——一对多关联表查询的相关文章

MyBatis学习总结——实现关联表查询(转)

原文链接:孤傲苍狼 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TABLE class( 6 c_id INT PRIMARY KEY AUT

mybatis深入理解(八)-----关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VA

MyBatis一对多关联表查询 映射文件

<!--一对多--> <!--根据广告组编号获取广告项列表一--> <select id="getAdInfoByAdSysNo" resultType="ec.model.advertising.AdInfo" parameterType="int"> SELECT * FROM T_AD_ADINFO WHERE adSysNo = #{sysNo,jdbcType=INTEGER} </select

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

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

mybatis学习笔记(11)-多对多查询 mybatis学习笔记11-多对多查询 示例 多对多查询总结 resultMap总结 本文实现多对多查询,查询用户及用户购买商品信息. 示例 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:orders.orderdetail.items sql SELECT orders.*, user.username, user.sex, user.address, orderdetail.id orderdeta

MyBatis-----4.实现关联表查询

前面几节都是单表查询,但是实际中一定会用到多表关联查询,本节将介绍关联表查询的实现 1.一对一关联 1.1创建数据表和添加数据 CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VARCHAR(20), teacher_id INT ); ALTER TABL

django(3) 一对多跨表查询、多对多

1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b,  通过查询host表获取的querySet中的b来查询business表. 以下两种方式都是操作host表: a.以对象的形式跨表查询,查询business表的数据:row.b.caption,row.b.id b.以字典和元组的形式跨表查询,查询business表的数据,跨表查询的时候要用双下划线  'b__id

MyBatis学习总结(五)——实现关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VA