首页 > 其他分享 >多对一和一对多的查询的ResultMap应用

多对一和一对多的查询的ResultMap应用

时间:2024-05-11 14:41:42浏览次数:13  
标签:name ResultMap 查询 teacher private student tid 一对 id

  1. 环境准备

    • 数据库创建:一个teacher表,字段有id(主键),name,一个student表,字段为id(主键),name,tid(外键)
    • 建表语句:
    CREATE TABLE `teacher` (
      `id` INT(10) NOT NULL,
      `name` VARCHAR(30) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    INSERT INTO teacher(`id`, `name`) VALUES (1, '王老师');
    
    CREATE TABLE `student` (
      `id` INT(10) NOT NULL,
      `name` VARCHAR(30) DEFAULT NULL,
      `tid` INT(10) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `fktid` (`tid`),
      CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    INSERT INTO `student` (`id`, `name`, `tid`) VALUES (1, '小明', '1'); 
    INSERT INTO `student` (`id`, `name`, `tid`) VALUES (2, '小红', '1'); 
    INSERT INTO `student` (`id`, `name`, `tid`) VALUES (3, '小张', '1'); 
    INSERT INTO `student` (`id`, `name`, `tid`) VALUES (4, '小李', '1'); 
    INSERT INTO `student` (`id`, `name`, `tid`) VALUES (5, '小王', '1');
    
    • 与表对应的实体类准备:
    //Teacher类
    public class Teacher {  
    	private Integer id;  
    	private String name;  
    	//...构造器、get、set方法等
    }
    //Student类
    public class Student {  
    	private Integer id;  
    	private String name;  
    	private Teacher teacher;  
    	//...构造器、get、set方法等
    }
    
    • 创建对应的mapper接口和mapper.xml文件,并在核心文件中配置mapper映射
  2. 进行查询(学生相对于老师是多对一的关系)

    • 按照查询嵌套处理:
    //接口StudentMapper的处理
    public interface StudentMapper {
    
        //查询所有的学生信息,以及对应的老师的信息
        public List<Student> getStudent();
    }
    
    • StudentMapper.xml文件中写sql
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.test.dao.StudentMapper">
    
        <!--
        思路:类似子查询
            1.查询所有的学生信息
            2.根据查询出来的学生的tid,寻找对应的老师
        -->
        
        <select id="getStudent" resultMap="StudentTeacher">
            select * from student;
        </select>
    
        <resultMap id="StudentTeacher" type="Student">
            <result property="id" column="id"/>
            <result property="name" column="name"/>
            <!--复杂的属性,需要单独处理,对象:association,集合:collection-->
            <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
        </resultMap>
    
        <select id="getTeacher" resultType="Teacher">
            select * from teacher where id = #{id};
        </select>
    </mapper>
    
    • 按照结果嵌套处理:连表查询的思路
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.test.dao.StudentMapper">
    
        <!--按照结果嵌套处理-->
        <select id="getStudent" resultMap="StudentTeacher">
            select s.id sid,s.name sname,t.id tid,t.name tname
            from student s,teacher t
            where  s.tid = t.id;
        </select>
    
        <resultMap id="StudentTeacher" type="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <association property="teacher" javaType="Teacher">
                <result property="name" column="tname"/>
                <result property="id" column="tid"/>
            </association>
        </resultMap>
    </mapper>
    
  3. 老师相对于学生是一对多的关系

    • 实体类的编写
    @Data
    public class Student {
        private int id;
        private String name;
        private int tid;
    }
    @Data
    public class Teacher {
        private int id;
        private String name;
        private List<Student> students;
    }
    
    • 编写mapper.xml中的sql语句
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.test.dao.TeacherMapper">
     
        <!--按结果嵌套查询-->
        <select id="getTeacher" resultMap="TeacherStudent">
            select s.id sid, s.name sname, t.id tid, t.name tname
            from student s,
                 teacher t
            where s.tid = t.id
              and t.id = #{tid}
        </select>
        <resultMap id="TeacherStudent" type="Teacher">
            <result property="id" column="tid"/>
            <result property="name" column="tname"/>
            <!--ofType="" 用于获取集合中泛型的信息-->
            <collection property="students" ofType="Student">
                <result property="id" column="sid"/>
                <result property="name" column="sname"/>
                <result property="tid" column="tid"/>
            </collection>
        </resultMap>
    
        <!--嵌套表查询(子查询)-->
        <select id="getTeacher1" resultMap="TeacherStudent1">
            select * from teacher where id=#{tid}
        </select>
        <resultMap id="TeacherStudent1" type="Teacher">
            <result property="id" column="id"/>
            <collection property="student" javaType="ArrayList" ofType="Student" select="getStudetByID" column="id"/>
        </resultMap>
        <select id="getStudetByID" resultType="Student">
            select * from student where tid=#{tid}
        </select>
    </mapper>
    

标签:name,ResultMap,查询,teacher,private,student,tid,一对,id
From: https://www.cnblogs.com/hytip/p/18186474

相关文章

  • 一对一直播系统开发,页面布局设计有很多可选项
    居中布局水平居中1、text-align:center<style>.container{text-align:center;}.children{display:inline-block;background:blue;}</style><body><divclass="container"><divclass="......
  • 一对一直播软件开发,瀑布流式布局更受欢迎
    一对一直播软件开发,瀑布流式布局更受欢迎代码实现HTML:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="vie......
  • 【MySQL】求和查询,目标值int,但空数据时返回null的问题(Java)
    问题分析intselectDeviceMonthRepairCount(StringdeviceType,Stringmonth);<selectid="selectDeviceMonthRepairCount"resultType="int">SELECTSUM(repair_count)FROMwarranty_recordsWHEREdevice_type=......
  • mybatisplus 中查询的实体对应的表名是动态的解决方案
    开发中遇到需要查询一些表里的数据,这些数据按照一定的规则存放在不同的数据库表里,例如表名是table_name+月份 table_name_2024_05,table_name_2024_04这样,这些表的结构都相同。网上找了一些动态修改实体对应数据库表名的方法,操作相对复杂而且跟mybatisplus的版本有关。自己......
  • ResultMap结果集映射
    为什么需要用到ResultMap?它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中,设置灵活,应用广泛。应用在数据库字段信息与对象属性不一致或者需要做复杂的联合查询以便自由控制映射结果。简单的映射(建立SQL查询结果字段与实体属性的映射关系)publicclass......
  • 使用.NET查询日出日落时间
    在WPF中,通过资源文件实现主题切换是个常见的功能,有不少文章介绍了如何实现手动切换主题。那如何实现自动切换主题呢?通常有两种机制:一是跟随系统明暗主题切换,二是像手机操作系统那样根据日出日落时间自动切换。本文将以终为始,采用倒推法一步步介绍如何使用.NET免费获取日出日落时......
  • 写sql时传入map与模糊查询
    用map进行传参更加灵活,可以随意封装举例://接口中的方法UserselectByMap(Map<String,Object>map);mapper.xml中的sql语句的编写<!--通过map进行条件查询--><selectid="selectByMap"resultType="com.test.pojo.User">select*fromUserwhereid=#{id}and......
  • 用一个查询从销售订单直通供应商账单-NetSuite
    朗读全文Yourbrowserdoesnotsupporttheaudioelement.有什么用用一个查询从销售订单直通供应商账单NetSuite:从SO销售订单,到PO采购订单,到Bill供应商账单下面文章的分享仅作为演示在SuiteQLQueryToo中的展示,现实情况下的应用可以非常灵活(由于范围广泛无法此文章中......
  • Mysql 查询后进行插入
    Mysql查询后进行插入,具体要求如下:1、有2张表,sys_role_user和sys_role_user_123,两张表结构相同,表字段有role_id、user_id2、role_id和user_id是唯一索引3、把sys_role_user中没有的数据从sys_role_user_123中复制到sys_role_user表中 INSERTINTOsys_role_user(role_i......
  • C#动态查询:巧用Expression组合多条件表达式
     概述:在C#中,通过`Expression`类、`AndAlso`和`OrElse`方法可组合两个`Expression<Func<T,bool>>`,实现多条件动态查询。通过创建表达式树,可轻松构建复杂的查询条件。在C#中,可以使用AndAlso和OrElse方法组合两个Expression<Func<T,bool>>类型的表达式。以下是详细解释和实例......