多表、分页查询
多表查询
与数据库概念一样,就是多表关联,用户的一些信息可能属于另一个表的内容
实现复杂关系映射,可以私用@Results注解,@Result注解、@One注解、@Many注解组合完成复杂关系的配置
- @Results:代替
标签,该注解中可以加入单个或多个@Result注解 - @Result:代替
标签和 标签,@Result中可以使用以下属性: - -column:数据表的字段名称
-property:类中对应的属性名
-one:与@One注解配合,进行一对一的映射
-many:与@Many注解配合,进行一对多的映射
- -column:数据表的字段名称
- @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中的参数分为两部分:
- 在最后的@Result注解中任然利用column = ""先去标记数据表中要使用的字段,然后用property = ""来标明映射目标,并且必须说明映射目标的类型javaType=List.class
完成一个表中的字段与另一个表的映射,我们要进行的操作是依据这个字段,查询另一个表的字段,这样的操作需要定义方法来完成;于是我们在OrderMapper中定义此方法
在一个Mapper中调用另一个Mapper中的抽象方法,需要用@Many注解来声明,使用@Many的原因是:一个学生可能对应多个订单,这是一对多的关系
在@Many中要声明调用那个Mapper中的那么方法,参数是select=""。
- 在@Results是结果集的映射:从数据库查询到的东西,如何来给对象赋值,@Results中可以放置多个@Result,里面的内容就是赋值的过程
当完成订单的查询之后,就会将所有值传递给最后的@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
- Page
对象的泛型是声明要查询那张表,目前来看是查询Stus表,实例化的时候要传递两个参数,第一个是其实记录的索引,第二个是每页取的条数
- 注意:此时得到的结果就不再是一个列表了,mybatis-plus自动将这些返回结果封装到了一个它提供的IPage对象中;为什么要这样呢?
- mybatis-plus为我们做查询时,不仅仅查询了每页的记录数据,还为我们提供了当前页码、总共页数等等数据都被封装到了IPage对象中了
- mybatis-plus为我们做查询时,不仅仅查询了每页的记录数据,还为我们提供了当前页码、总共页数等等数据都被封装到了IPage对象中了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下