第5天:Mybatis-plus多表查询及分页查询

Mybatis-plus多表查询及分页查询

多表查询

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;
    }

分页查询结果查看:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46443403/article/details/128962312