多表、分页查询

多表查询

与数据库概念一样,就是多表关联,用户的一些信息可能属于另一个表的内容
实现复杂关系映射,可以私用@Results注解,@Result注解、@One注解、@Many注解组合完成复杂关系的配置

  • @Results:代替标签,该注解中可以加入单个或多个@Result注解
  • @Result:代替标签和标签,@Result中可以使用以下属性:
    • -column:数据表的字段名称
      -property:类中对应的属性名
      -one:与@One注解配合,进行一对一的映射
      -many:与@Many注解配合,进行一对多的映射
  • @One:代替标签,用于指定查询中返回的单一对象
    通过select属性指定用于多表查询的方法
    使用格式:
    • @Result(column=",property="",one=@One(select=""))
  • @Many:代替标签,用于指定查询中返回的结合对象
    使用格式:
    • @Result(column="",property="",many=@Many(select=""))

下面我们演示,查询一个学生,并将其其他信息一同展示
场景:查询学生信息,同时展示他的订单信息,如下有两张表

  • 这样的需求首先应该将目标类做修改
    需要上述这样的需求,那么就需要在学生类中定义这么一个属性,用于存放订单;但订单这个属性并不是每次查询学生信息都必须要出现,而且学生数据表中并没有这个订单字段;我们如今使用MyBatis-Plus的单表查询,其底层实际上是将目标类中声明的所有属性(默认为每个属性对应有字段)都进行查询显示,订单字段其实不存在,所以这时就会报错;为了解决这样的问题,就可以通过@TableField(exist = false)这个注解来声明,该属性不是数据表中的字段,这样就不会影响到数据表的正常查询功能。(但如果是使用MyBatis的单表查询,那么上述注释就不是必须要写的)
    订单这个属性需要我们自己来映射。
  • 自行映射
    1.自行映射就出现一个问题,MyBatis-Plus只对单表查询做出了提升,多表查询依然依赖于MyBatis,在映射字段时要用到sql语句,所以在Stus类中的@TableName("stus")语句可以不写。
    2.在StusMapper.java中我们需要定义一个方法selectAllUaerAndOrders(),用于在查询所有学生的同时,也查询出学生所有的订单
    3.手动完成新增属性的映射
    • 在@Results是结果集的映射:从数据库查询到的东西,如何来给对象赋值,@Results中可以放置多个@Result,里面的内容就是赋值的过程
      一旦利用@Results注解,那么表中的所有字段都需要逐个完成映射,属性名相同也要写
    • @Result,用于给每一个字段进行赋值(这其实是映射,赋值是一种表现形式而已)
      • @Result中的参数分为两部分:
        1.column = "":代表数据表中的字段;
        2.property = "":代表目标类中的属性;将前面的字段值赋值给后面的属性
    • 在最后的@Result注解中任然利用column = ""先去标记数据表中要使用的字段,然后用property = ""来标明映射目标,并且必须说明映射目标的类型javaType=List.class
      完成一个表中的字段与另一个表的映射,我们要进行的操作是依据这个字段,查询另一个表的字段,这样的操作需要定义方法来完成;于是我们在OrderMapper中定义此方法
      在一个Mapper中调用另一个Mapper中的抽象方法,需要用@Many注解来声明,使用@Many的原因是:一个学生可能对应多个订单,这是一对多的关系
      在@Many中要声明调用那个Mapper中的那么方法,参数是select=""。

当完成订单的查询之后,就会将所有值传递给最后的@Result注解中由property = ""声明的映射目标,即完成了新增属性的映射

  • 一对一自行映射

一对多一对一的区别在于外键的映射采用的是不同的注解:@Many、@One
对于多表查询的注意点

  • 1.@Results注解中的@Result里面的映射关系。映射的对象之间要对应,也就是字段名和属性名的对应
  • 2.在最后的@Result中,一定要正确找出依据那一个字段(外键),映射那一个数据表
  • 3.找到对应的数据表之后,一定要声明javaType属性。这个属性是依据自己在类中是如何定义的。
  • 4.映射关系确定之后,调用另一个Mapper中的方法来实现目标操作。
    方法在定义是一定要注意:
    • 1.方法的定义位置
    • 2.方法名称;
    • 3.方法的参数名称(参数名称主要依据于参数来源于那个数据表);

条件查询

mybatis-plus在查询时,我们知道是不用写sql语句的;那我们如何去表示查询条件呢?
mybatis-plus中提供了QueryWrapper类,这个类就是用来表示条件的,mybatis-plus提供了条件构造器
有一个AbstractWrapper父类,他有两个子类QueryWrapper用于查询、UpdateWrapper用于更新,内部提供了各种各样的表示条件的方法。
进行条件查询:

  • 1.先创建一个QueryWrapper的对象,里面有很多表示条件的方法。(更多方法查看官方文档:条件构造器
    比如,要判断是否相等,里面有两个属性值,一个是要判断哪个字段,第二个是它用于判断的是多少
    利用创建的对象,来调用需要的条件方法,然后把这个对象放到查询语句中去,就可以做到按条件查询

    注意:
    1.mybatis-plus的查询语句再查询字段时是根据类中的属性来查询的;
    2.当数据表中没有属性对应的字段时,就会报错,所以根据我们前面学的,一定要对非字段属性利用@TableField(exist = false)进行声明

多表的查询利用mybatis;对单表的操作还是建议mybatis-plus

分页查询

当数据比较多的时候,为了便于浏览以及加快加载速度,我们将数据分成多页进行查询,其实也可以用sql语句进行查询,不过mybatis-plus提供了分页查询的插件

  • 步骤:
    1.编写配置文件;代码是固定的,其中一条是说明数据库类型(这条语句要根据实际情况)注意:配置操作不要局限于配置文件,可以利用配置类做相关配置
@Configuration
public class MyBatisPlusConfig 
@Bean
public MybatisPlusInterceptor paginationInterceptor() f
MybatisPlusInterceptor interceptor = new MybatisplusInterceptor();
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); interceptor.addInnerInterceptor(paginationInterceptor);
return interceptor;


2.测试;创建Page对象,再利用selectPage()方法来查看每页的对象

  • Page对象的泛型是声明要查询那张表,目前来看是查询Stus表,实例化的时候要传递两个参数,第一个是其实记录的索引,第二个是每页取的条数
  • 注意:此时得到的结果就不再是一个列表了,mybatis-plus自动将这些返回结果封装到了一个它提供的IPage对象中;为什么要这样呢?
    • mybatis-plus为我们做查询时,不仅仅查询了每页的记录数据,还为我们提供了当前页码总共页数等等数据都被封装到了IPage对象中
posted @   BattleTrumpet  阅读(681)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示