概述:关联查询主要在<resultMap>元素中,用<association>配置一对一、用<collection> 配置一对多

一、一对一查询

      1.使用扩展类实现一对一查询

<select id="queryById" parameter="int" resultType="User">
select * from user where userid=#{userid}
</select>

      2.使用resulutMap实现一对一查询(association)

              举例说明:将用户信息和用户权限放到不同的实体类中,每一个用户对应着相应的权限,如果要根据用户id查询他对应的属性,则需要在用户信息加入一个权限的属性,再通过SQL映          射文件中的resultMap属性,将查询的结果映射到用户类中的所有属性,包括权限信息

<select id="queryById" parameter="int" resultMap="User_privilige_map">
select * 
from user
inner join privilige on user.privilige=privilige.privilige
where userid=#{userid}
</select> <resultMap type="org.zy.pojo.user" id="User_privilige_map">
<id property="userid" column="userid"/>
<result property="userName" column="userName"/>
<result property="userAge" column="userAge"/>
...
<association property="privilige" javaType="privilige">
<id property="priviligeid" column="priviligeid"/>
<result property="priviligeidName"column="priviligeidName"/>
...
</association>
</resultMap>

二、一对多查询

        本章利用班级和学生之间的一对多举例:

(1)首先在班级类中添加学生属性     privaie  List<Student> student;

(2)在学生类中增加表示班级的外键

(3)查询语句

<select id="queryById" parameter="int" resultMap="ClassAndStudent">
select * from Student s where inner join Class c on s.classid=c.classid where
s.id=#{userid}
</select> <resultMap type="studentClass" id="ClassAndStudent">
<id property="classid" column="classid"/>
<result property="className" column="className"/>
... //省略其他属性
<collection property="students" ofType="student">
<id peoperty="stuNo" column="stuNo"/>
<result property="stuName" column="stuName" />
...//省略其他属性
</collection>
</resultMap> 参数说明:普通的类型通过id,result 映射,List属性的students 通过<collection>映射,并通过ofType指定List元素中的类型,即List类型的属性,需要通过<resultMap>中的<collection>
元素来映射到数据表中的各个列

三、多对一查询

       一个班级和多个学生之间的关系是一对多,反过来看,多个学生和班级之间的关系是多对一,本质是一样的,参照上面的内容即可

四、多对多查询

       多对多的本质上就是两个或多个一对多

五、延迟加载

             说明:在使用一对多查询时,很多时候只需要前面的信息,不需要后面的关联信息,即首次查询的是主要的班级信息,关联的学生信息在需要的时候再加载,

         以减少不必要的数据库开销从而提升程序的效率,这就称为延迟加载

              1.一对多延迟加载使用步骤

                     (1)打开Mybatis配置文件的延迟加载的开关

                        

<configuration>
<properties resource="db.properties">
<settings>
<--将延迟加载设置为ture ,可省略,默认为true-->
<setting name="LazyLoadingEnabled" value="true"/>
<--将立即加载设置为false -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
</configuration>

(2)SQL映射文件

<select id="queryStudentLazyLoad" parameter="int" resultMap="ClassAndStudent">
select * from class

</select> <resultMap type="studentClass" id="ClassAndStudent">
<id property="classid" column="classid"/>
<result property="className" column="className"/>
... //省略其他属性
<collection property="students" ofType="student"
<--通过命名空间+id指定延迟加载执行sql语句-->
select="org.zy.mapper.StudentMapper.queryStudentByClassId" column="classid"/>
</collection>
</resultMap>
StudentMapper.xml配置文件

    <mapper namespace="org.zy.mapper.StudentMapper">
//根据班级号码查询学生的信息
<select id="queryStudentByClassId" parmeterType="int" resultType="student">
select * from student where classid=#{classid}
</select>

(3)说明:即通过主查询查询班级信息,然后通过一对多元素映射关联student表,并通过select语句属性指定延迟加载的sql语句

                select * from student where classid=#{classid}
(4)修改Mybatis配置文件
<mappers>
     <mapper resource="org/zy/mapper/studentMapper.xml"/>
                <mapper resource="org/zy/mapper/studentMapper.xml"/>
         <mappers>

MyBatis框架之关联查询的更多相关文章

  1. mybatis一对多关联查询+pagehelper->分页错误

    mybatis一对多关联查询+pagehelper->分页错误. 现象: 网上其他人遇到的类似问题:https://segmentfault.com/q/1010000009692585 解决: ...

  2. 三、mybatis多表关联查询和分布查询

    前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...

  3. MyBatis:一对一关联查询

    MyBatis从入门到放弃三:一对一关联查询 前言 简单来说在mybatis.xml中实现关联查询实在是有些麻烦,正是因为起框架本质是实现orm的半自动化. 那么mybatis实现一对一的关联查询则是 ...

  4. 7.mybatis一对多关联查询

    和第5节一对一查询类似,但是不同的是,一对一使用的是association,而一对多使用collection. 实例: 1个班级Class,对应1个老师Teacher,对应多个学生Student 1. ...

  5. 5.mybatis一对一表关联查询

    方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据)  SELECT * FROM class c,teacher t WHERE c.tid = t.t ...

  6. JAVA入门[9]-mybatis多表关联查询

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...

  7. mybatis多表关联查询之resultMap单个对象

    resultMap的n+1方式实现多表查询(多对一) 实体类 创建班级类(Clazz)和学生类(Student),并在Student中添加一个Clazz类型的属性,用于表示学生的班级信息. mappe ...

  8. mybatis一对多关联查询——(九)

    1.需求: 查询所有订单信息及订单下的订单明细信息. 订单信息与订单明细为一对多关系. 2.      sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关 ...

  9. mybatis多对多关联查询

    多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...

随机推荐

  1. Python自学day-4

    一.字符串转为字典(eval):也可以用于转列表.集合等 s1 = "['name','leo']" s_list = eval(s1) #字符串转换为列表 print(s_lis ...

  2. Spark学习之路(十三)—— Spark Streaming 与流处理

    一.流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中.应用程序根据需要查询数据或计算数据.这就是传统的静态数据处理架构.Hadoop采用HDFS进行数据 ...

  3. Azkaban学习之路(一)—— Azkaban 简介

    一.Azkaban 介绍 1.1 背景 一个完整的大数据分析系统,必然由很多任务单元(如数据收集.数据清洗.数据存储.数据分析等)组成,所有的任务单元及其之间的依赖关系组成了复杂的工作流.复杂的工作流 ...

  4. Kali Linux Web渗透测试手册(第二版) - 1.0 - 渗透测试环境搭建

    一.配置KALI Linux和渗透测试环境 在这一章,我们将覆盖以下内容: 在Windows和Linux上安装VirtualBox 创建一个Kali Linux虚拟机 更新和升级Kali Linux ...

  5. 【hibernate-validator+SpringMVC】后台参数校验框架

    hibernate-validator+SpringMVC 简介:简单说,就是对Entity进行校验. 1.导包,没有很严谨的对应关系,所以我用了比较新的版本,支持更多的注解. <depende ...

  6. appcan中evaluateScript、evaluatePopoverScript的使用

    1. 如果要在某个主窗体中执行JS,使用 appcan.window.evaluateScript(name,scriptContent) eg: appcan.window.evaluateScri ...

  7. Mysql事务隔离级别和锁机制

    一.Spring支持四种事务隔离级别: 1.ISOLATION_READ_UNCOMMITTED(读未提交):这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据. 2.ISOLAT ...

  8. PATB 1032 挖掘机技术哪家强(20)

    #include <cstdio> #include <vector> using namespace std; const int N = 100001; vector &l ...

  9. PATB 1041 考试座位号(15)

    #include <cstdio> #include <iostream> using namespace std; struct student{ char str[15]; ...

  10. 100天搞定机器学习|Day1数据预处理

    数据预处理是机器学习中最基础也最麻烦的一部分内容 在我们把精力扑倒各种算法的推导之前,最应该做的就是把数据预处理先搞定 在之后的每个算法实现和案例练手过程中,这一步都必不可少 同学们也不要嫌麻烦,动起 ...