Mybatis_06_插件_sql查询一对多and多对一

插件Lombok

project lombok 官网

1. 在idea里面安装

在这里插入图片描述

2.在项目中.xml里导入Lombok的jar包
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

3.在你要偷懒的实体类上加注解即可
@Getter and @Setter
@FieldNameConstants
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
@Builder
@SuperBuilder
@Singular
@Delegate
@Value
@Accessors
@Wither
@With
@SneakyThrows
@val
@var
experimental @var
@UtilityClass
Lombok config system
Code inspections
Refactoring actions (lombok and delombok)

实例:

在这里插入图片描述

基本够用:
@Date:无参构造、get、set、tostring、hashcode、equals
@AllArgsConstructor
@NoArgsConstructor

sql查询一对多:

  • 对个学生,对应一个老师
  • 对于学生这边而言,就是一个多对一的现象,即从学生这边关联一个老师!
  • 对于老师而言,集合,一个老师,有很多学生【一对多】
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, '秦老师');
INSERT INTO teacher(`id`, `name`) VALUES (2, '陈老师');

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');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('6', '大明', '2');


小技巧:对应的接口有多个时可以这么写

在这里插入图片描述
放心:只要你对应的包一样,target里面它们会被打包在同一包下
在这里插入图片描述

在这里插入图片描述

测试环境搭建
  • 导入lombok
  • 新建实体类Teacher,Student
@Data
public class Teacher {
    private int id;
    private String name;
}
@Data
//少一个有参构造
public class Student {
    private int id;
    private String name;
    //学生需要关联一个老师
    private Teacher t;

}
  • 建立Mapper接口
  • 建立Mapper.xml文件

按照查询嵌套处理

<!--
思路:
    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>

按照结果嵌套处理 (推荐)

<select id="getStudent2" resultMap="StudentTeacher2">
    SELECT s.id sid,s.name sname,t.name tname
    FROM student s,teacher t
    WHERE s.tid=t.id;
</select>

<resultMap id="StudentTeacher2" type="Student">
    <result property="id" column="sid"/>
    <result property="name" column="sname"/>
    <association property="teacher" javaType="Teacher">
        <result property="name" column="tname"/>
    </association>
</resultMap>
  • 在核心配置文件中绑定注册我们的Mapper接口或者文件【方式很多,随心选】
  • 测试查询是否能够成功

回顾MySql多对一查询方式:

  • 子查询(按照查询嵌套处理)
  • 链表查询(按照结果嵌套处理)

多对一(其实…一样)

实例题目:
一对多的理解:

一个老师拥有多个学生
如果对于老师这边,就是一个一对多的现象,即从一个老师下面拥有一群学生(集合)

搭建环境

  • 实体类编写
@Data
public class Student {
   private int id;
   private String name;
   private int tid;
}

```java
@Data 
public class Teacher {
   private int id;
   private String name;
   //一个老师多个学生
   private List<Student> students;
}

**

按结果嵌套处理

**

接口

//获取指定老师,及老师下的所有学生
public Teacher getTeacher(int id);

接口对应的Mapper配置文件

<mapper namespace="com.kuang.mapper.TeacherMapper">

   <!--
   思路:
       1. 从学生表和老师表中查出学生id,学生姓名,老师姓名
       2. 对查询出来的操作做结果集映射
           1. 集合的话,使用collection!
               JavaType和ofType都是用来指定对象类型的
               JavaType是用来指定pojo中属性的类型
               ofType指定的是映射到list集合属性中pojo的类型。
   -->
   <select id="getTeacher" resultMap="TeacherStudent">
      select s.id sid, s.name sname , t.name tname, t.id tid
      from student s,teacher t
      where s.tid = t.id and t.id=#{id}
   </select>

   <resultMap id="TeacherStudent" type="Teacher">
       <result  property="name" column="tname"/>
       <collection property="students" ofType="Student">
           <result property="id" column="sid" />
           <result property="name" column="sname" />
           <result property="tid" column="tid" />
       </collection>
   </resultMap>
</mapper>

将Mapper文件注册到MyBatis-config文件中

<mappers>
   <mapper resource="mapper/TeacherMapper.xml"/>
</mappers>

测试

@Test
public void testGetTeacher(){
   SqlSession session = MybatisUtils.getSession();
   TeacherMapper mapper =session.getMapper(TeacherMapper.class);
   Teacher teacher = mapper.getTeacher(1);
   System.out.println(teacher.getName());
   System.out.println(teacher.getStudents());
}

结果:
在这里插入图片描述

        /**查到了我们要的的三个属性 老师id name 和他对应的学生
         * Teacher(id=1, 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)])
         */

按查询嵌套处理

TeacherMapper接口编写方法

public Teacher getTeacher2(int id);

编写接口对应的Mapper配置文件

<select id="getTeacher2" resultMap="TeacherStudent2">
select * from teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
   <!--column是一对多的外键 , 写的是一的主键的列名-->
   <collection property="students" javaType="ArrayList"ofType="Student" column="id" select="getStudentByTeacherId"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
  select * from student where tid = #{id}
</select>

将Mapper文件注册到MyBatis-config文件中

<mappers>
   <mapper resource="mapper/TeacherMapper.xml"/>
</mappers>

测试:

@Test
public void testGetTeacher2(){
   SqlSession session = MybatisUtils.getSession();
   TeacherMapper mapper =session.getMapper(TeacherMapper.class);
   Teacher teacher = mapper.getTeacher2(1);
   System.out.println(teacher.getName());
   System.out.println(teacher.getStudents());
}

小结

1、关联-association【多对一】

2、集合-collection【一对多】

3、所以association是用于一对一和多对一,而collection是用于一对多的关系

4、JavaType和ofType都是用来指定对象类型的

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

注意说明:

1、保证SQL的可读性,尽量通俗易懂

2、根据实际要求,尽量编写性能更高的SQL语句

3、注意属性名和字段不一致的问题

4、注意一对多和多对一 中:字段和属性对应的问题

5、尽量使用Log4j,通过日志来查看自己的错误

一对多和多对一对于很多人来说是难点,一定要大量的做练习理解!

面试高频:

  • MySql引擎
  • InnoDB底层原理
  • 索引
  • 索引优化
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Mybatis查询一对多分页可以通过两种方式实现。 第一种方式是使用Mybatis的内置分页插件PageHelper。通过在需要分页查询的方法前加上PageHelper.startPage(pageNum, pageSize)代码,然后执行查询语句,就可以在查询结果中获取到分页后的数据。同时,可以使用PageInfo对查询结果进行封装,获取到分页的相关信息。 第二种方式是手动实现分页功能。可以通过编写SQL语句,使用LIMIT和OFFSET关键字来实现分页查询。根据页面传来的页码和每页显示数量,计算出需要跳过的记录数量,然后在查询语句中使用LIMIT限制查询结果的数量,OFFSET指定跳过的记录数量。最后,将查询结果返回即可。 无论使用哪种方式,一对多的分页查询都需要考虑到关联表的关系。在设置分页查询条件时,需要注意关联表之间的查询条件,以及在查询结果中如何处理关联表的数据。 总结起来,Mybatis查询一对多的分页可以通过使用内置分页插件PageHelper或者手动编写SQL语句实现。在设置分页查询条件时,要考虑关联表的关系,以及在查询结果中如何处理关联表的数据。 ### 回答2: MyBatis是一个在Java中使用的持久层框架,它可以用来简化数据库查询和操作的编码工作。在MyBatis中进行一对多查询并分页,需要通过配置文件和SQL语句来实现。 首先,在配置文件中配置数据库连接信息和映射文件等。然后,在映射文件中编写需要的SQL语句。对于一对多查询,可以使用嵌套查询或者关联查询。 使用嵌套查询的方式,可以先查询主表的信息,然后在嵌套查询中查询与主表关联的从表的信息。在查询结束后,可以通过PageHelper插件来实现分页功能。 使用关联查询的方式,可以使用SQL的连接语句来一次性查询主表和从表的信息。在查询结束后,同样可以通过PageHelper插件来实现分页功能。 无论使用哪种方式,最后都需要将查询结果封装为Java对象,并返回给调用方。 总结起来,要在MyBatis中进行一对多查询并分页,首先需要配置数据库连接信息和映射文件。然后,根据需要的查询方式编写SQL语句。最后,使用PageHelper插件实现分页功能,将查询结果封装为Java对象返回。 ### 回答3: Mybatis是一种用于Java语言的持久层框架,可以方便地进行数据库操作。当需要查询一对多关系并进行分页时,可以通过以下步骤实现: 1. 首先,在数据库中建立相关的表,例如主表和从表,确保它们之间有一对多关系。 2. 在Mybatis的XML配置文件中定义两个对应主表和从表的实体类和映射关系。在主表的映射文件中,使用collection标签引入从表的实体类和映射关系,并指明关联的字段。在从表的映射文件中,使用association标签引入主表的实体类和映射关系,并指明关联的字段。 3. 在主表的Mapper接口中定义一对多查询的方法,使用@Results和@Result注解进行映射配置。在@Results注解中使用@Result注解指定查询结果的字段名和对应的实体类属性名。在@Result注解中使用@Collection注解指定从表的映射配置。 4. 在Mapper接口的XML配置文件中实现一对多查询的SQL语句,并使用分页相关的SQL语句进行结果分页。可以使用limit和offset关键字实现分页查询。 5. 在DAO层或Service层调用Mapper接口中定义的一对多查询方法,并传入分页参数,获取查询结果。 这样就可以实现Mybatis一对多查询分页功能。通过配置实体类和映射关系,定义查询方法,并使用分页相关的SQL语句,可以方便地实现对一对多关系数据的分页查询。Mybatis的灵活性和便捷性使得开发人员可以很方便地操作数据库,减少了大量重复的编码工作,提高了开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值