springboot和vue:七、mybatis/mybatisplus多表查询+分页查询
作者:小教学发布时间:2023-10-02分类:程序开发学习浏览:71
导读:mybatisplus实际上只对单表查询做了增强(速度会更快),从传统的手写sql语句,自己做映射,变为封装好的QueryWrapper。本篇文章的内容是有两张表,分别是用户表和...
mybatisplus实际上只对单表查询做了增强(速度会更快),从传统的手写sql语句,自己做映射,变为封装好的QueryWrapper。
本篇文章的内容是有两张表,分别是用户表和订单表,在不直接在数据库做表连接的情况下,通过后台代码完成①查询订单的同时查到该订单所属的用户,②查询用户的同时查到该用户的订单列表的功能。
Mybatis版本
准备表环境
t_user
### t_order
编写实体类
Order类
@TableName("t_order")
public class Order {
@TableId(type = IdType.AUTO)
private int id;
private String order_time;
private String total;
private int uid;
@TableField(exist = false)
private User user;
- @TableName表示数据库表名的映射。其实加上与不加都无所谓。因为我们先用的是mybatis,最终会自己写一个方法去映射。
- @TableId(type = IdType.AUTO)表示该注解下面的字段在数据库是自增的。
- @TabelField(exist = false)表示该注解下面的字段在数据库中实际是不存在的,mybatis不需要去数据库中映射,我们自己会编写映射方法。
最后记得在类里面自动生成getter和setter还有toString方法。
User类
@TableName("t_user")
public class User {
@TableId(type = IdType.AUTO)
private int id;
private String username;
private String password;
private String birthday;
//描述用户的所有订单
@TableField(exist = false)
private List<Order> orders;
@TableName同上,加与不加都无所谓。最后记得在类里面自动生成getter和setter还有toString方法。
编写mapper方法
UserMapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Update("insert into t_user values (#{id},#{username},#{password},#{birthday})")
public int insert(User user);
//查询用户及其所有的订单
@Select("select * from t_user")
@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.mybatisplusdemo.mapper.OrderMapper.selectByUid")
)
}
)
List<User> selectAllUserAndOrders();
}
- @Result的column代表数据库里的列名,property代表代码里的数据结构。即从数据库里查到的数据映射到代码里的哪个参数。
- 因为一个用户可能有多个订单,所以最后一个@Result里面写的是的many=@Many。
- 最后一个@Result表明的意思是mybatis/mybatisplus允许在mapper方法内部继续调用一个mapper方法,把column里查到的数值传给mapper方法,最终后者返回的结果才是真正传给property的值。
- 注意调用的mapper方法需要写全类名(上篇文章提到过如何快速复制)再加方法名。
OrderMapper
@Select("select * from t_order where uid = #{uid}")
List<Order> selectByUid(int uid);
@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.mybatisplusdemo.mapper.UserMapper.selectById")
)
}
)
List<Order> selectAllOrderAndUser();
注意到是one = @One,因为一个订单只对应着一个用户。
编写controller方法
OrderController
@RestController
@CrossOrigin
public class OrderController {
@Autowired
private OrderMapper orderMapper;
@GetMapping("/order/findAll")
public List findAll()
{
List orders = orderMapper.selectAllOrderAndUser();
return orders;
}
}
UserController
@RestController
@CrossOrigin
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/user")
public List query(){
List<User> list = userMapper.selectList(null);
System.out.println(list);
return list;
}
@GetMapping("/user/findAll")
public List<User> find(){ return userMapper.selectAllUserAndOrders();}
}
测试
MybatisPlus版本做条件查询
mybatisplus提供了封装好的QueryWrapper类,让我们做条件查询或者更新查询。
注意如果想要使用mybatisplus,要把原来实体类里的@TableField加上
编写controller类
UserMapper
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/user/find")
public List<User> query() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username","zhangsan");
// 筛选出用户名为张三的用户。
return userMapper.selectList(queryWrapper);
}
}
测试
MybatisPlus版本做分页查询
编写配置类
新建一个软件包config,编写一个配置类
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor paginationInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 定义一个拦截器
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); //告诉它数据库类型
interceptor.addInnerInterceptor(paginationInnerInterceptor);// 拦截器注册
return interceptor;
}
}
在controller里面添加方法
在UserController中添加分页查询方法
@GetMapping("user/findByPage")
public IPage findByPage(){
Page<User> page = new Page<>(0,2); // 设置起始值和每页条数
IPage iPage = userMapper.selectPage(page,null); // 返回结果集,这里如果想额外增加附属条件
//可以写在第二个参数queryWrapper中
return iPage;
}
测试
- 上一篇:实现单行/多行文本溢出
- 下一篇:[论文笔记]UNILM
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 6鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 7[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 8鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 9鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版