概述:关联查询主要在<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. 机器学习经典算法之K-Means

    一.简介 K-Means 是一种非监督学习,解决的是聚类问题.K 代表的是 K 类,Means 代表的是中心,你可以理解这个算法的本质是确定 K 类的中心点,当你找到了这些中心点,也就完成了聚类. / ...

  2. 你需要知道的c# Timer 的垃圾回收机制。

    通常我们需要定时执行一段任务的时候,我们就需要定时器,这时我们就可以使用c# System.Threading空间中的 Timer定时器;他是个异步定时器,时间到时每次都是在线程池中分配一个线程去执行 ...

  3. PATA 1011 World Cup Betting (20)

    1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Wit ...

  4. 32| 无实例无真相:基于LoadRunner实现企业级服务器端性能测试的实践(上)

  5. 16 | 脑洞大开:GUI测试还能这么玩(Page Code Gen + Data Gen + Headless)?

  6. HDU 5773:The All-purpose Zero(贪心+LIS)

    http://acm.hdu.edu.cn/showproblem.php?pid=5773 The All-purpose Zero Problem Description   ?? gets an ...

  7. Python旅途——函数的递归和栈的使用

    Python--函数之递归.栈的使用 今天主要和大家分享函数的递归,同时引入一个新的概念--栈 1.递归 1.定义 函数的递归指的就是函数自己调用自己,什么是函数自己调用自己呢?我们来看一个栗子: 这 ...

  8. 浅入深出Vue:第一个页面

    今天正式开始入门篇,也就是实战了~ 首先我们是要做一个博客网站,UI 框架采用江湖传闻中的 ElementUI,今天我们就来利用它确定我们博客网站的基本布局吧. 准备工作 新建一个vue项目(可以参考 ...

  9. Git使用小技巧之挑拣合并

    先想想一个情况,现在我们有一个功能急需要发布到线上,但是这个功能相关的代码所在的测试分(test)支有很多不应该发布的代码,那么这个时候我们就需要将与这个代码相关的提交选择性的合并到master上并发 ...

  10. ASP.NET Core系列(一): .NET Core简介及安装开发环境

    大家都知道Java是跨平台的,.NET因为不具有跨平台的特性,被越来越多的开发者诟病,之前有各种间接的跨平台的方案,比如mono.但是由于各种兼容问题,最终 .NET Core出现了,它可以让程序在W ...