多表查询
Mybatis-plus只是对单表查询进行增强,对多表查询没有进行修改,因此多表查询部分使用Mybatis。
实现复杂关系映射,可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置。
User.java
//如果表名和类名不一致,使用@TableName注解说明该类对应的表名
@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;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}
Order.java
@TableName("t_order")
public class Order {
private int id;
private String ordertime;
private double total;
@TableField(exist = false)
private User user;
//alt+insert
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getOrdertime() {
return ordertime;
}
public void setOrdertime(String ordertime) {
this.ordertime = ordertime;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
UserController.java
@RestController
public class UserController {
@Autowired //注入usermapper,将UserMapper实例化出的对象自动注入,就有值了
private UserMapper userMapper;
@GetMapping("/user/findAll")
public List<User> find(){
return userMapper.selectAllUserAndOrders();
}
}
OrderController.java
@RestController
public class OrderController {
@Autowired
private OrderMapper orderMapper;
@GetMapping("/order/findAll")
public List findAll(){
List orders = orderMapper.selectAllOrdersAndUser();
return orders;
}
}
UserMapper.java
@Mapper
//mybatisplus会自动根据User类找到user表进行增、删、改、查操作,前提是类和表的名称保持一致
public interface UserMapper extends BaseMapper<User> {
//查询用户,根据用户id查询信息 select * from t_user where id =
@Select("select * from t_user where id=#{id}")
User selectById(int id);
// 查询用户及其所有的订单
@Select("select * from t_user")
// 结果集的映射,数据库查询出来的内容如何给对象赋值
@Results(
{
//给每个字段赋值,column代表表里面的字段,property代表类里面的字段
@Result(column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "birthday",property = "birthday"),
// Mybatis允许调用另一个mapper的方法,使用@Many注解,表示一个用户对应多个订单的一对多的关系
@Result(column = "id",property = "orders",javaType = List.class,
many = @Many(select = "com.example.mpdemo.mapper.OrderMapper.selectByUid")
)
}
)
List<User> selectAllUserAndOrders();
}
OrderMapper.java
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
@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=@One(select = "com.example.mpdemo.mapper.UserMapper.selectById")
)
})
List<Order> selectAllOrdersAndUser();
}
条件查询
mybatis-plus条件查询部分参考mybatis-plus官方文档“条件构造器”部分:https://baomidou.com/pages/10c804/
UserController.java内添加代码:
MyBatisPlusConfig.java
//条件查询
//Mybatis-plus也提供了一些条件查询的方法,不需要自己写sql语句
//使用Mybatis-plus提供的方法会根据类里面的字段做查询,注意orders属性加上@TableField(exist = false)注解
@GetMapping("/user/find")
public List<User> findByCond(){
QueryWrapper<User> queryWrapper=new QueryWrapper();
// username=zhangsan
queryWrapper.eq("username","zhangsan");
return userMapper.selectList(queryWrapper);
}
分页查询
做分页查询需要添加配置:
//分页查询配置
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor paginationInterceptor(){
// 创建Mybatis-plus的拦截器,当做MYSQL查询时会被该拦截器拦截
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页拦截器,告知数据库类型MYSQL
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
interceptor.addInnerInterceptor(paginationInterceptor);
return interceptor;
}
}
UserController.java内添加代码:
//分页查询
//当数据库记录较多的时候,需要做一个限制查询 select * from xx limit ,10(从第0条开始查,查询10条)
@GetMapping("/user/findByPage")
public IPage findByPage(){
//设置起始值及每页条数 从第几条开始,查询几条
//page对象指明什么表
Page<User> page = new Page<>(0,2);
//IPage描述结果集,将信息都封装到iPage
IPage iPage = userMapper.selectPage(page,null);
return iPage;
}
分页查询结果查看: