广告
返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis如何实现多表查询(多对一、一对多)
  • 280
分享到

MyBatis如何实现多表查询(多对一、一对多)

2024-04-02 19:04:59 280人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

mybatis实现多表查询  一、多对一查询 数据库的准备 创建两张表,一张老师表,一张学生表 将老师主键id关联学生外键tid 创建sql的语句 create ta

mybatis实现多表查询

 一、多对一查询

数据库的准备

创建两张表,一张老师表,一张学生表

将老师主键id关联学生外键tid

创建sql的语句


create table teacher(
   id int  primary key,
	teacher_name varchar(30) not null
)

insert into teacher(id,teacher_name) values (1,'毛老师')

create table student(
  id int  primary key,
	student_name varchar(30) not null,
	tid int default null
)

//建立主外键关联
alter table student add constraint teacher_student_id foreign key (tid) references teacher(id)

insert into student values (1,'小明',1)
insert into student values (2,'小毛',1)
insert into student values (3,'小红',1)
insert into student values (4,'大黄',1)
insert into student values (5,'超儿',1)

项目结构

使用Lombok插件,创建实体类。

(提高整洁度,主要想toulan)


@Data
public class Student {
    private int id;
    private String name;
    //学生需要关联一个老师
    private Teacher teacher;
}

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

1、嵌套查询处理

编写接口


public interface StudentMapper {
    //查询所有学生的信息以及对应老师的信息
    public List<Student> getStudent();
}

2. 编写StudentMapper.xml的查询语句(重点)


<mapper namespace="dao.StudentMapper">
<!--    思路:
        1. 查询所有学生的信息
        根据查询出来的学生tid,寻找对应的老师

-->
    <select id="getStudent" resultMap="StudentTeacher">
    select * from student
    </select>
    <resultMap id="StudentTeacher" type="pojo.Student">
<!--        复杂的属性需要单独处理 是对象就使用association,是集合就使用collection-->
<!--    select 子查询    -->
        <result property="name" column="student_name"/>
        <association property="teacher" column="tid" javaType="pojo.Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="pojo.Teacher">
        select * from teacher where id=#{id}
    </select>

测试


    @Test
    public void getStudent(){

        SqlSession sqlSession = Mybatisutil.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList = mapper.getStudent();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();
    }

测试结果

2、联合查询处理

编写接口


//按照结果嵌套查询
public List<Student> getStudent2();

2. 编写StudentMapper.xml的查询语句(重点)


<!--    按照结果嵌套处理-->
    <select id="getStudent2" resultMap="StudentTeacher2">
    select s.id sid,s.student_name sname,t.teacher_name tname
    from student s,teacher t
    where s.tid=t.id
    </select>
    <resultMap id="StudentTeacher2" type="pojo.Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <association property="teacher" javaType="pojo.Teacher">
            <result property="name" column="tname"/>
        </association>
    </resultMap>

编写测试类


    @Test
    public void getStudent(){

        SqlSession sqlSession = Mybatisutil.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> studentList = mapper.getStudent2();
        for (Student student : studentList) {
            System.out.println(student);
        }
        sqlSession.close();
    }

测试结果

二、一对多查询

更改实体类


@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;
}

1、嵌套查询处理 编写接口


Teacher getTeacher2(@Param("tid") int id);

由于字段不一致,要做映射

主要TeacherMapper.xml的查询语句(重点)


<select id="getTeacher2" resultMap="TeacherStudent2">
            select * from teacher where id=#{tid}
    </select>
    <resultMap id="TeacherStudent2" type="pojo.Teacher">
        <result property="name" column="teacher_name"/>
        <collection property="students" javaType="ArrayList" ofType="pojo.Student" select="getStudentByTeacherId" column="id"/>
    </resultMap>
    <select id="getStudentByTeacherId" resultType="pojo.Student">
        select * from student where tid=#{tid}
    </select>

测试类


   @Test
    public void getTeacher(){

        SqlSession sqlSession = Mybatisutil.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher2(1);
        System.out.println(teacher);
        sqlSession.close();
    }

测试结果:


Teacher(id=0, name=毛老师, students=[Student(id=1, name=null, tid=1), Student(id=2, name=null, tid=1), Student(id=3, name=null, tid=1), Student(id=4, name=null, tid=1), Student(id=5, name=null, tid=1)])

2、联合查询处理

编写接口


//获取指定老师下的所有学生及老师的信息
    Teacher getTeacher(@Param("tid") int id);

由于字段不一致,要做映射

主要TeacherMapper.xml的查询语句(重点)


<!--    按结果嵌套查询-->
    <select id="getTeacher" resultMap="TeacherStudent">
        select s.id sid,s.student_name sname,t.teacher_name tname,t.id tid
        from student s,teacher t
        where s.tid=t.id and t.id=#{tid}
    </select>
    <resultMap id="TeacherStudent" type="pojo.Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
        <!--        复杂的属性需要单独处理 是对象就使用association,是集合就使用collection
        javaType="" 指定的属性类型
        集合中的泛型信息,使用ofType获取-->
        <collection property="students" ofType="pojo.Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>

测试类


   @Test
    public void getTeacher(){

        SqlSession sqlSession = Mybatisutil.getSqlSession();
        TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
        Teacher teacher = mapper.getTeacher(1);
        System.out.println(teacher);
        sqlSession.close();
    }

测试结果:


Teacher(id=1, name=毛老师, students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小毛, tid=1), Student(id=3, name=小红, tid=1), Student(id=4, name=大黄, tid=1), Student(id=5, name=超儿, tid=1)])

总结

本章就使用了简单的两张表联合查询,介绍简单的使用,更复杂的多表联合主要在编写sql的时候难度大点,或者是嵌套查询要更严谨点

官方文档也给了详细的非常复杂的多表查询如下: mybatis,这么复杂的看的我头疼


<!-- 非常复杂的语句 -->
<select id="selectBlogDetails" resultMap="detailedBlogResultMap">
  select
       B.id as blog_id,
       B.title as blog_title,
       B.author_id as blog_author_id,
       A.id as author_id,
       A.username as author_username,
       A.passWord as author_password,
       A.email as author_email,
       A.bio as author_bio,
       A.favourite_section as author_favourite_section,
       P.id as post_id,
       P.blog_id as post_blog_id,
       P.author_id as post_author_id,
       P.created_on as post_created_on,
       P.section as post_section,
       P.subject as post_subject,
       P.draft as draft,
       P.body as post_body,
       C.id as comment_id,
       C.post_id as comment_post_id,
       C.name as comment_name,
       C.comment as comment_text,
       T.id as tag_id,
       T.name as tag_name
  from Blog B
       left outer join Author A on B.author_id = A.id
       left outer join Post P on B.id = P.blog_id
       left outer join Comment C on P.id = C.post_id
       left outer join Post_Tag PT on PT.post_id = P.id
       left outer join Tag T on PT.tag_id = T.id
  where B.id = #{id}
</select>

在我们编写的时候注意点:

  • 不要忘记注册Mapper.xml
  • 在初学的时候尽量不要给实体类取别名,为了不要混淆,加深理解
  • 实体类字段要和数据库字段一致,如果不一致,那就要用result标签做映射
  • 复杂的属性需要单独处理,是对象就使用association,是集合就使用collection来映射
    javaType="" 指定的属性类型|
    集合中的泛型信息,使用ofType获取
    多注意复杂属性的嵌套使用

JavaType & ofType

  • JavaType 用来指定实体类中属性的类型
  • ofType 用来指定映射到List或者集合中的实体类pojo类型,泛型中的约束类型

到此这篇关于MyBatis如何实现多表查询(多对一、一对多)的文章就介绍到这了,更多相关MyBatis多表查询内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: MyBatis如何实现多表查询(多对一、一对多)

本文链接: https://www.lsjlt.com/news/125167.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MyBatis如何实现多表查询(多对一、一对多)
    MyBatis实现多表查询  一、多对一查询 数据库的准备 创建两张表,一张老师表,一张学生表 将老师主键id关联学生外键tid 创建sql的语句 create ta...
    99+
    2022-11-12
  • MyBatis中怎么实现一对多查询和多对一查询
    这篇“MyBatis中怎么实现一对多查询和多对一查询”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MyBatis中怎么实现一...
    99+
    2023-06-29
  • 使用Mybatis 如何实现多对一或一对多的关联查询
    使用Mybatis 如何实现多对一或一对多的关联查询?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先  数据库量表之间字段关系(没有主外键)studentmaj...
    99+
    2023-05-31
    mybatis 一对多 多对一
  • Mybatis怎么实现一对一、一对多关联查询
    今天小编给大家分享一下Mybatis怎么实现一对一、一对多关联查询的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Mybati...
    99+
    2023-07-05
  • SpringBoot中Mybatis注解一对多和多对多查询实现示例
    目录一、模拟的业务查询二、对应的实体类如下三、对应的建表语句和模拟数据如下四、@One一对一映射五、@Many一对多查询六、@One @Many的总结一、模拟的业务查询 系统中的用户...
    99+
    2022-11-13
  • Mybatis多对一查询的实现方法
    目录架构环境搭建数据库实体类接口Mapper配置文件子查询方法按结果集查询架构 这里从学生的角度来说就是多对一的场景 那么在Java中是怎么样的呢? 环境搭建 数据库 CREATE...
    99+
    2022-11-13
  • mybatis一对多嵌套查询怎么实现
    本文小编为大家详细介绍“mybatis一对多嵌套查询怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“mybatis一对多嵌套查询怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。mybatis一对多嵌...
    99+
    2023-07-05
  • 解析Mybatis对sql表的一对多查询问题
    Mybatisd对sql表的一对多查询 select * from projectrecord pr left join projects po on po.pid=p...
    99+
    2022-11-13
  • 利用mybatis如何实现一个一对多查询功能
    利用mybatis如何实现一个一对多查询功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.需求分析:在开发中会遇到这样一个问题,查询订单信息,级联查询出用户信息和订单明...
    99+
    2023-05-31
    mybatis 一对多查询
  • mybatis通过中间表实现一对多查询功能
    需求: 通过一个学生的id查询出该学生所学的所有科目。 使用到的表格: 1.student:学生表 2.subject:科目表 3.stu_sub:学生-科目表(这里的成绩字段没...
    99+
    2022-11-12
  • 关于mybatis一对一查询一对多查询遇到的问题
    springboot整合mybatis项目博客系统文章,相册,评论,标签,等表IDEA为最新版2021.3.3,mysql数据库为最新版Navicat(或许有些字段不支持特定的命名)...
    99+
    2022-11-13
  • MySQL如何实现一对多查询
    这篇文章给大家分享的是有关MySQL如何实现一对多查询的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。这次要实现的是一对多查询,使用 MySQL 的 group_concat 函数...
    99+
    2022-10-18
  • Mybatis使用@one和@Many实现一对一及一对多关联查询
    目录一、准备工作1.创建springboot项目,项目结构如下2.添加pom.xml配置信息3.配置相关信息二、使用@One注解实现一对一关联查询三、使用@Many注解实现一对多关联...
    99+
    2022-11-12
  • 在MyBatis中实现一对多查询和多对一查询的方式详解(各两种方式)
    目录1、多对一1、1环境搭建1、2编写实体类、1、3编写接口方法1、4编写Mapper1、5实现1、6运行结果2、一对多2、1环境搭建和一对多一样2、2编写实体类2、3编写接口的方法...
    99+
    2022-11-13
  • MySQL一对多查询
    一、MySQL一对多查询最新数据 当我们需要查询多张表之间的数据关系时,MySQL中的一对多查询就是非常关键的一种操作方式。下面,我们以查询最新数据为例子来介绍MySQL一对多查询。 SELEC...
    99+
    2023-08-31
    mysql 数据库
  • Mybatis实现一对一、一对多关联查询的方法(示例详解)
    Mybatis实现一对一、一对多关联查询,关联查询:多个表联合查询,只查询一次,通过resultMap里面的<association>、<collection>...
    99+
    2023-05-14
    Mybatis关联查询 Mybatis一对一 Mybatis一对多关联查询
  • mybatis一对一查询一对多查询遇到的问题怎么解决
    这篇文章主要介绍“mybatis一对一查询一对多查询遇到的问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mybatis一对一查询一对多查询遇到的问题怎么解决”文章能帮助大家解决问题。实体...
    99+
    2023-06-30
  • Mybatis对sql表的一对多查询问题怎么解决
    这篇“Mybatis对sql表的一对多查询问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Mybatis对sql表...
    99+
    2023-07-02
  • 怎么在mybatis中实现多对一关联查询
    怎么在mybatis中实现多对一关联查询?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。第一种关联方式1.修改实体类Student,追加关联属性,用于封装关联的数据修改完以后...
    99+
    2023-06-15
  • mybatis如何使用注解实现一对多关联查询
    mybatis 注解实现一对多关联查询 @Select("select id,mockexam_section as section,id as sectionId" ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作