zoukankan      html  css  js  c++  java
  • MyBatis关联查询、多条件查询

    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集合中

                                                  

  • 相关阅读:
    Mysql 5.7解压版安装
    Java Web 整合案例
    maven 创建Java web项目
    LintCode 数字三角形
    Hibernate 泛型Dao实现
    LintCode 将二叉查找树转换成双链表
    LintCode 删除链表中倒数第n个节点
    LintCode 二级制中有多少个1
    LintCode翻转二叉树
    SpringMVC 运行流程
  • 原文地址:https://www.cnblogs.com/zhang-boke/p/7243272.html
Copyright © 2011-2022 走看看