MyBatis关联查询、多条件查询

1、一对一查询

任务需求;

根据班级的信息查询出教师的相关信息

1、数据库表的设计

班级表:

教师表:

2、实体类的设计

班级表:

public class Classes {

9     //定义实体类的属性,与class表中的字段对应

10     private int id;            //id===>c_id

11     private String name;    //name===>c_name

13     /**

14      * class表中有一个teacher_id字段,所以在Classes类中定义一个teacher属性,

15      * 用于维护teacher和class之间的一对一关系,通过这个teacher属性就可以知道这个班级是由哪个老师负责的

16      */

17     private Teacher teacher;

教师表:

public class Teacher {
9     //定义实体类的属性,与teacher表中的字段对应
10     private int id;            //id===>t_id
11     private String name;    //name===>t_name

3、定义mapper接口

package com.ipcopyright.dao.read;

public interface TeacherDaoR {

// 级联查询班级信息带教师信息

public Classes fintClassJoinTeacher(int id);

//嵌套查询

public Classes findclassjointeacher2(int id);

}

4、定义mappe.xml接口

方式一:嵌套结果——联表查询

    sql查询语句:SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1;
  • 使用嵌套结果来处理重复的联合结果的子集
  • 封装联表查询的数据(去除重复的数据)
   

<!-- 嵌套结果 -->

<!-- 联表查询,封装结果子集 -->

<select id="fintClassJoinTeacher" resultMap="baseresultMap" parameterType="int">

select * from class c ,teacher t where c.teacher_id = t.t_id and c.c_id = #{id}

</select>

<!-- 结果集封装 -->

<!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->

<resultMap type="com.ipcopyright.domain.Classes"  id="baseresultMap">

<id property="id" column="c_id"/>

<result property="name" column="c_name"/>

<association property="teacher" javaType="com.ipcopyright.domain.Teacher">

<id property="id" column="t_id"/>

<result property="name" column="t_name"/>

</association>

</resultMap>

resultMap:是将结果信息进行映射,保证查询的数据和PO类的数据所对应

association:表示进行一对一关联查询映射

property:表示关联查询的结果存储在classes类下面的teacher对象中

javaType:表示关联查询的映射结果类型

方式二:嵌套查询——执行两次查询

sql语句:

        SELECT * FROM class WHERE c_id=1;
          SELECT * FROM teacher WHERE t_id=1   //1 是上一个查询得到的teacher_id的值
  • 通过执行另外一个SQL映射语句来返回预期的发杂类型

<!-- 嵌套查询 -->

<select id="findclassjointeacher2" parameterType="int" resultMap="find2">

SELECT * FROM class WHERE c_id = #{id};

</select>

<!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->

<resultMap type="com.ipcopyright.domain.Classes" id="find2">

<id property="id" column="c_id"/>

<result property="name" column="c_name"/>

<association property="teacher" column="teacher_id" select="getTeacher"/>

</resultMap>

<select id="getTeacher" resultType="com.ipcopyright.domain.Teacher" parameterType="int">

SELECT t_id id,t_name name FROM teacher  WHERE t_id = #{id};

</select>

resultMap:是将结果信息进行映射,保证查询的数据和PO类的数据所对应

association:表示进行一对一关联查询映射

property : 查询的结果放入到pojo类中的哪一个属性当中

column : 向下一个查询压入的参数

select: 将查询到的column中的id压入到select为getTeacher的参数当中

注意:

select="getTeacher" <select id="getTeacher"的参数中可以随便给任意名称,只要是输入参数与压入进去的值类型相同就行。

不管输入的参数名是什么,mybatis最终会执行为

效果:select t_id id , t_name name from teacher where t_id = resultSet.getInt(teacher_id)

5、Mybatsis一对一关联查询总结

Mybatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:

  • property:对象属性的名称
  • javaType:对象属性的类型
  • column:所对应的外间字段名称
  • select:使用另一个查询封装的结果

2、一对多查询

一对多查询:只能使用resultMap来完成结果映射:

以[主信息]为主对象,[从信息]映射为集合或者对象,然后封装到主对象当中

任务需求 ; 根据班级id查询对应的班级信息(包括学生,老师信息)

1、数据库表的设计

班级表:

教师表:

学生表:

2、实体类的设计

班级表:

public class Classes {

9     //定义实体类的属性,与class表中的字段对应

10     private int id;            //id===>c_id

11     private String name;    //name===>c_name

12     private Teacher teacher; //表中的teacher_id来进行一对一的维护

13     private List<Student> students;// 使用一个List<Student>集合属性表示班级拥有的学生

教师表:

public class Teacher {
9     //定义实体类的属性,与teacher表中的字段对应
10     private int id;            //id===>t_id
11     private String name;    //name===>t_name

学生表

public class Student {

//定义属性

private  int  id;

private String name;

3、定义mapper接口

public interface TeacherDaoR {

// 一对一查询班级,教师信息(嵌套结果)

public Classes fintClassJoinTeacher(int id);

// 一对一查询班级,教师信息(嵌套查询)

public Classes findclassjointeacher2(int id);

//一对多查询出班级、学生、教师信息

public Classes findclassjoints(int id);

//一对多查询出班级、学生、教师信息

public Classes findclassjoints2(int id);

}

4、定义mapper.xml

方式一:嵌套结果——联表查询

根据班级ID查询对应的班级信息,包括学生信息,教师信息

sql语句:

        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
  • 使用嵌套结果映射来处理重复的联合结果的子集

<resultMap type="com.ipcopyright.domain.Classes" id="resultClasses">

<id property="id" column="c_id"/>

<result property="name" column="c_name"/>

<!--一对一查询出教师信息-->

<association property="teacher" javaType="com.ipcopyright.domain.Teacher">

<id property="id" column="t_id"/>

<result property="name" column="t_name"/>

</association>

<!-- 一对多查询出学生信息 -->

<collection property="students"  ofType="com.ipcopyright.domain.Student">

<id property="id" column="s_id"/>

<result property="name" column="s_name"/>

</collection>

</resultMap>

Collection标签:定义了一对多关联的结果映射。

property:关联查询的结果集存储在POJO类的哪个属性。

ofType:指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。

方式二:嵌套查询——执行多次查询

sql语句:

        SELECT * FROM class WHERE c_id=1;
          SELECT * FROM teacher WHERE t_id=1   //1 是上一个查询得到的teacher_id的值
          SELECT * FROM student WHERE class_id=1  //1是第一个查询得到的c_id字段的值

首先:

查询到班级的信息,通过班级的教师id查询到教师的信息,通过班级的id查询到学生的信息

<!-- 通过执行另外一个映射语句返回预期的复杂类型 -->

<select id="findclassjoints2" parameterType="int" resultMap="Classresult4">

select * from class where c_id = #{id};

</select>

<resultMap type="com.ipcopyright.domain.Classes" id="Classresult4">

<id property="id" column="c_id"/>

<result property="name" column="c_name"/>

<!-- 一对一查询教师信息 -->

<association property="teacher" column="teacher_id" select="getTeacher1" />

<!-- 一对多查询学生的信息 -->

<collection property="students" column="c_id" select="getstudent1" />

</resultMap>

<!-- 查询教师的信息 -->

<select id="getTeacher1" resultType="com.ipcopyright.domain.Teacher" parameterType="int">

select t_id as id,t_name as name from teacher where t_id = #{id};

</select>

<!-- 查询学生的信息 -->

<select id="getstudent1" resultType="com.ipcopyright.domain.Student" parameterType="int">

select s_id as id,s_name as name from student where class_id = #{id};

</select>

resultMap:是将结果信息进行映射,保证查询的数据和PO类的数据所对应

<一对一>

         association:表示进行一对一关联查询映射

       property:关联查询的结果集存储在POJO类的哪个属性。

         column : 向下一个查询压入的参数

         select: 将查询到的column中的id压入到select为getTeacher的参数当中

<一对多>

       Collection标签:定义了一对多关联的结果映射。

       property:关联查询的结果集存储在POJO类的哪个属性。

       column:传入的id

         select: 将查询到的column中的id压入到select为getTeacher的参数当中

注意:

另外查询中不管输入的参数名是什么,mybatis最终会将column中的值传入进去,类型保证一致即可

效果:select t_id id , t_name name from teacher where t_id = resultSet.getInt(teacher_id)

3、关联查询总结resultType和resultMap

1、resultType

介绍:

                   如果没有查询结果的特殊要求,将查询结果都映射成一个pojo的简单类型属性,建议使用resultType。

         作用:

                   将查询结果按照sql列名pojo属性名一致性映射到pojo中。

适用:

一对一查询中,无特殊要求,定义专门的POJO类作为输出类型,其中定义了sql查询结果集的所有字段(企业使用普遍)

         场合:

                   常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可

2、resultMap

         介绍:

如果查询结果有特殊要求,对映射结果需要进行高级映射,简易使用resultMap

作用:

通过resultMap对查询结果进行与pojo类属性的映射设置

         适用

一对多查询中,存在特殊要求,通过使用association和collection完成一对一和一对多高级映射

association:将关联查询信息映射到一个pojo对象中

collection:将关联查询信息映射到一个list集合中。

方便关联查询信息,将关联信息映射到对象的pojo属性中,或者list集合中

MyBatis关联查询、多条件查询的更多相关文章

  1. [转]NHibernate之旅(4):探索查询之条件查询(Criteria Query)

    本节内容 NHibernate中的查询方法 条件查询(Criteria Query) 1.创建ICriteria实例 2.结果集限制 3.结果集排序 4.一些说明 根据示例查询(Query By Ex ...

  2. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  3. Mybatis框架模糊查询+多条件查询

    一.ISmbmsUserDao层 //根据姓名模糊查询 public List<Smbms> getUser(); //多条件查询 public List<Smbms> get ...

  4. tp5关联模型进行条件查询

    public function wordOne(){ return $this->hasOne('TeachWord','id','w_id')->field('id,pid,title' ...

  5. MyBatis框架中的条件查询!关键字exists用法的详细解析

    exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句 ...

  6. MySQL数据库6 -查询基础,简单查询,条件查询,对查询结果排序

    一.SELECT语句 SELECT COL1,COL2,....COLn FROM TABLE1,TABLE2,....TABLEn [WHERE CONDITIONS] -- 查询条件 [GROUP ...

  7. dhtmlxGrid分页查询,条件查询实例

    使用jquery的ajax get将页面条件请求到后台,取得数据库数据,分页查询,返回前台grid中. 引入所需文件: <script>window.dhx_globalImgPath = ...

  8. MySQL数据库—查询基础,简单查询,条件查询,对查询结果排序

    一.SELECT语句 SELECT COL1,COL2,....COLn FROM TABLE1,TABLE2,....TABLEn [WHERE CONDITIONS] -- 查询条件 [GROUP ...

  9. 软件测试最常用的 SQL 命令 | 掌握基本查询、条件查询、聚合查询

    1.DML核心CRUD增删改查 缩写全称和对应 SQL: * DML 数据操纵语言:Data Manipulation Language * Create 增加:insert * Retrieve 查 ...

  10. MySQL——基础查询与条件查询

    基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 1.查询列表可以是:表中的字段.常量值.表达式.函数 2.查询的结果是一个 ...

随机推荐

  1. android apk 自我保护技术-完整性校验

    关于防止android apk被反编译的技术我们前面已经讲了四种. 加壳技术 运行时修改字节码 伪加密 对抗JD-GUI 如果有不明白的可以查看我的博客的前四篇中关于这四种技术的介绍.接下来我们接着介 ...

  2. struts2+jquery+easyui+datagrid+j…

    一.概述 struts2提供了针对json的插件支持.常规来讲我们将如何将对象数组转成json对象在客户端直接调用呢?尤其和jquery的easyui插件配合使用,这个可能会有很多的问题需要我们解决. ...

  3. linux控制USB的绑定/解绑

    linux控制USB的绑定/解绑 http://www.jianshu.com/p/57293f9be558 今天工作中遇到一个问题, 要用代码实现USB的enable和disable. 谷歌了一番, ...

  4. linux忘记登陆密码的两种破解办法

    对于使用grub引导的linux系统.在开机自检后,出现grub引导界面时,按E键进入编辑模式,如下图所示:   把光标移到带有“kernel”字样的那一行,然后按E键编辑,如图:   在末尾按一个空 ...

  5. 解决错误---undefined reference to `pthread_create‘

    今天试着敲了一下APUE的小例子,遇到了个错误 -----  undefined reference to `pthread_create.(为自己这么晚接触多线程惭愧). 上网上查了一下,借人经验. ...

  6. Guid string 转换

    System.Guid.NewGuid().ToString(); //GUID带-分割// db1b98e9-6f93-41aa-84f8-5eb773e93d67System.Guid.NewGu ...

  7. [51nod] 1267 4个数和为0 暴力+二分

    给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 < ...

  8. Shaderlab blend

    http://www.cnblogs.com/daxiaxiaohao/p/4059310.html 1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们 ...

  9. 一文搞定 Redis 复制(全会的举个手看看)

    阅读本文大概需要 5 分钟. 本文大纲 复制过程 数据间的同步 全量复制 部分复制 心跳 异步复制 总结 一.复制过程 Step 1:从节点执行 slaveof 命令. Step 2:从节点只是保存了 ...

  10. 阿里云ECS测试服务器部署

    前序:为了提供一个干净的测试环境,更好地验证产品问题,也为了防止被开发人员频繁发布代码而打断测试工作,故测试团队搭建了一台阿里云ECS服务器,以下是具体的部署信息: 1. 安装JDK Java版本:J ...