文章目录
一、多表查询
可能会用到的注解

这里的场景是,查询每个用户及其所有的订单。就是查询你的id号的同时,把你所有的历史订单信息都拉出来。
表结构这样
CREATETABLEUser(
id INTPRIMARYKEYAUTO_INCREMENT,
username VARCHAR(255)NOTNULL,
password VARCHAR(255)NOTNULL,
birthday VARCHAR(10));INSERTINTOUser(id, username, password, birthday)VALUES(1,'Alice','password123','1990-01-01'),(2,'Bob','pass456word','1992-05-10'),(4,'Bob','pass456word','1992-05-10'),(3,'Bob','pass456word','1992-05-10'),(5,'Bob','pass456word','1992-05-10'),(6,'Bob','pass456word','1992-05-10');CREATETABLE t_order (
id INTPRIMARYKEYAUTO_INCREMENT,
order_time VARCHAR(255)NOTNULL,
total doubleNOTNULL,
uid INTNOTNULL);INSERTINTO t_order (order_time, total, uid)VALUES('2023-04-01 00:00:00',100.00,1),('2023-04-01 00:00:00',100.00,1),('2023-04-01 00:00:00',100.00,2),('2023-04-01 00:00:00',100.00,3);
具体的流程呢是在User里面加一个List<Order>,这个很好理解每个用户需要有多个订单嘛,使用一个列表来接受很合理。
在UserMapper里面写一下方法,很好理解id、username、password、birthday都需要映射到对应类的里的字段
column代表表里面字段,property代表类里面的字段
.。主要是最后的那个many,是要将表里面的
id
通过
selectByUid
的返回结果映射到orders中。这个selectById是要我们自己写的。路径不能写错哦。
@Select("select * from User")//使用Results注解后,所有字段都要手动映射@Results({@Result(column ="id",property ="id"),@Result(column ="username",property ="username"),@Result(column ="password",property ="password"),@Result(column ="birthday",property ="birthday"),@Result(column="id",property ="orders", javaType =List.class,
many =@Many(select ="com.example.hello.mapper.OrderMapper.selectByUid"))//使用表里的字段id映射为orders:根据用户的id查找订单。将id传递给selectByUid。})List<User>selectAllUserAndOrders();
@Select("select * from t_order where uid=#{uid}")List<Order>selectByUid(int uid);
然后在controller写调用selectAllUserAndOrders的接口即可。
@GetMapping("/user/findall")publicList<User>find(){return userMapper.selectAllUserAndOrders();}

反过来说,我如果希望查询所有订单及对应的用户,其实直接在OrderMapper里面编写Results映射即可,只不过一个订单只对应一个用户所以要使用
one
接收,在将uid传入到UserMapper的selectById,在OrderBean里面增加一个User成员变量存放即可。
@GetMapping("/order/findall")publicList<Order>findall(){List<Order> orders = orderMapper.selectAllOrdersandUser();return orders;}
@Select("select * from t_order")@Results({@Result(column ="id",property ="id"),@Result(column ="ordertime",property ="ordertime"),@Result(column ="total",property ="total"),@Result(column ="uid",property ="user",javaType =User.class,
one =@One(select="com.example.hello.mapper.UserMapper2.selectById"))})List<Order>selectAllOrdersandUser();
@Select("select * from User where id = #{id}")UserselectById(int id);

注意:如果中间遇到什么问题,尝试一步一步找错误,是不是数据库建立的有问题,注解上面写好的执行语句能不能再sql里面正常执行
二、mybatis-plus条件查询
例如常见的字段等于、大于、小于。mybatis-plus提供了很多模板,我这里举一个例子官网
我要查询
username
是我输入进来的所有行
@GetMapping("/user/find/{username}")publicList<User>findByCond(@PathVariableString username){System.out.println(username);System.out.println("*---------*");QueryWrapper<User> queryWrapper =newQueryWrapper();
queryWrapper.eq("username",username);return userMapper.selectList(queryWrapper);}
三、分页查询
使用mybatisPlus实现分页查询,很实用的一个东西。
首先配置好Config文件
@ConfigurationpublicclassMybatisPlusConfig{@BeanpublicMybatisPlusInterceptorpaginationInterceptor(){MybatisPlusInterceptor interceptor =newMybatisPlusInterceptor();PaginationInnerInterceptor paginationInnerInterceptor =newPaginationInnerInterceptor(DbType.MYSQL);
interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}}
在controller中定义分页查询接口。其中current和size分别代表当前页数和每页是多少条数据。selectPage方法中第一个第二个参数需要通过构造QueryWrapper传入即可,也可以直接传入null表示select *。
@GetMapping("/user/findbypage/{current}/{size}")publicIPagefindByPage(@PathVariableint current,@PathVariableint size){Page<User> page =newPage<>(current,size);QueryWrapper<User> queryWrapper =newQueryWrapper();
queryWrapper.eq("username","Bob");IPage iPage = userMapper.selectPage(page,queryWrapper);return iPage;}
版权归原作者 牛右刀薛面 所有, 如有侵权,请联系我们删除。