6 复杂查询

多对一处理

环境搭建

创建数据库

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');

导入Lombok

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

新建实体类

学生类:

package com.qin.pojo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
    private Teacher teacher;
}

老师类:

package com.qin.pojo;

import lombok.Data;

@Data
public class Teacher {
    private int id;
    private String name;
}

建立Mapper接口

package com.qin.dao;

import com.qin.pojo.Student;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface StudentMapper {
    public List<Student> getStudentList();
}

在mybatis-config.xml中绑定mapper接口或文件

<mappers>
    <package name="com.qin.dao"/>
</mappers>

按照查询嵌套处理

复杂的对象需要单独处理
如果是对象使用:association
如果是集合使用:collection

<!--
    思路:
        1. 查询所有的学生信息
        2. 根据查询出来的学生的tid,寻找对应的老师!  子查询
-->
<?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.qin.dao.StudentMapper">
    <select id="getStudentList" resultMap="MyStudent">
        select * from student
    </select>
    <resultMap id="MyStudent" type="student">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <!--
            association property="属性名" colum="数据库字段名" javaType="对象类型" select="子查询名"
        -->
        <association property="tid" column="tid" javaType="teacher" select="getTeacherById"/>
    </resultMap>
    <select id="getTeacherById" resultType="teacher">
        select * from teacher where id = #{id}
    </select>
</mapper>
  • 第一个select查询到了student表的id,name,tid
  • 结果集映射到Student实体类id->id name->name
  • 实体类的tid是一个Teacher类 查询到的tid是一个int类型的字段
  • 可以根据这个int类型的字段查到teacher表
  • 并根据查到的teacher对Teacher类的属性一一对应

按照结果嵌套处理

<select id="getStudentList2" resultMap="MyStudent2">
    select s.id as sid,s.name as sname,t.id as tid,t.name as tname
    from mybatis.student s
    join mybatis.teacher t
    on s.tid = t.id
</select>
<resultMap id="MyStudent2" type="student">
    <id property="id" column="sid"/>
    <result property="name" column="sname"/>
    <association property="tid" javaType="teacher">
        <id property="id" column="tid"/>
        <result property="name" column="tname"/>
    </association>
</resultMap>
  • 将查到的所有结果进行命名
  • 结果集里将属性和字段一一对应
  • tid属性是一个teacher类,进行再对应

一对多处理

修改实体类的属性

package com.qin.pojo;

import lombok.Data;

import java.util.List;

@Data
public class Teacher {
    private int id;
    private String name;
    private List<Student> students;
}
package com.qin.pojo;

import lombok.Data;

@Data
public class Student {
    private int id;
    private String name;
    private int tid;
}

按照结果嵌套处理

package com.qin.dao;


import com.qin.pojo.Teacher;

import java.util.List;

public interface TeacherMapper {
    public List<Teacher> getTeacherList();
}
<?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.qin.dao.TeacherMapper">
    <select id="getTeacherList" resultMap="getTeacher1">
        select t.id as tid,t.name as tname,s.id as sid,s.name as sname
        from mybatis.teacher t
        join mybatis.student s
        on t.id = s.tid
    </select>
    <resultMap id="getTeacher1" type="teacher">
        <id property="id" column="tid"/>
        <result property="name" column="tname"/>
        <collection property="students" ofType="student">
            <id property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>
</mapper>

按照查询嵌套处理

<select id="getTeacherList2" resultMap="getTeacher2">
    select * from mybatis.teacher
</select>
<resultMap id="getTeacher2" type="teacher">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="students" javaType="ArrayList" ofType="student" column="id" select="getStudent"/>
</resultMap>
<select id="getStudent" resultType="student">
    select * from mybatis.student where tid=#{id}
</select>

小结

  1. association多对一:多个学生对应一个老师,使查询到的学生关联一个老师
  2. collection一对多:一个老师含有多个学生,将老师属性里的学生集合查询出来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值