mybatis中基于注解方式的多表查询

愿天堂没有BUG

共 4543字,需浏览 10分钟

 ·

2021-10-01 13:17

开发前的准备

当前文章中所用到的表以及数据, 用到的mybatis配置文件可以去这篇文章中查看mybatis基于xml方式的多表查询

唯一要注意的是我们在mybatis配置文件中, 不再需要加载核心配置文件, 而是要指明使用注解的包

 <mappers>
     <package name="com.raylee.mapper"/>
 </mappers>
复制代码

用户类

 public class User {
     private int id;
     private String username;
     private String password;
   
  private List<Order> orderList;
     private List<Role> roleList;
 }
复制代码

订单类

 public class Order {
     private int id;
     private Date ordertime;
     private int total;
 
     private User user;
 }
复制代码

角色类

 public class Role {
     private int id;
     private String roleName;
     private String roleDesc;
 }
复制代码

注解关键字

@Insert 添加sql语句使用的注解

@Update 更新sql语句使用的注解

@Delete 删除sql语句使用的注解

@Select 查询sql语句使用的注解

@Result 当使用查询语句时, 返回单条数据时的注解

@Results 当使用查询语句时, 返回多条数据时的注解, 配合@Result一起使用

@One 在一对一的查询结果时使用的注解, 例如: 一个订单对应一个用户

@Many 在一对多的查询结果时使用的注解, 例如: 一个用户可以有多个订单

单表查询

通过id查询users表

 @Select("select * from users where id = #{id}")
 public User findById(int id);
复制代码

通过用户id查询orders表

 @Select("select * from orders where uid = #{uid}")
 public Order findByUid(int uid);
复制代码

一对一查询

一个订单只属于一个用户, 当我们查询订单数据时也需要查询该订单所对应的用户数据

定义的接口

 public interface OrderMapper {
   @Select("select * from orders")
   @Results({
         @Result(column = "id", property = "id"),
         @Result(column = "ordertime", property = "ordertime"),
         @Result(column = "total", property = "total"),
         @Result(
                 property = "user",
                 // 根据哪个字段去查询users表中的数据
                 column = "uid",
                 javaType = User.class,
                 one = @One(select = "com.raylee.mapper.UserMapper.findById")
        )
  })
   public List<Order> findAll();
 }
复制代码

注解分析

首先, 通过@Select注解查询出所有的订单

然后, 通过@Results进行字段和实体类属性的映射

最后, 通过@One再去进行每个订单中用户的数据查询

一对多查询

定义的接口

 @Select("select * from users")
 @Results({
         @Result(column = "id", property = "id"),
         @Result(column = "username", property = "username"),
         @Result(column = "password", property = "password"),
         @Result(
                 property = "orderList",
                 column = "id",
                 javaType = List.class,
                 many = @Many(select = "com.raylee.mapper.OrderMapper.findByUid")
        )
 })
 public List<User> findUserOrderAll();
复制代码

注解分析

首先, 通过@Select注解查询出所有的用户

然后, 通过@Results进行字段和实体类属性的映射

最后, 通过@Many再去orders表中查询用户所有的订单数据

多对多查询

定义的接口

 @Select("select * from users")
 @Results({
         @Result(column = "id", property = "id"),
         @Result(column = "username", property = "username"),
         @Result(column = "password", property = "password"),
         @Result(
                 property = "roleList",
                 javaType = List.class,
                 column = "id",
                 many = @Many(select = "com.raylee.mapper.RoleMapper.findByUid")
        )
 })
 public List<User> findUserRoleAll();
 
 @Select("select * from user_role ur, roles r where ur.rid = r.id and ur.uid = #{uid}")
 public List<Role> findByUid(int uid);
复制代码

注解分析

首先, 通过@Select注解查询出所有的用户

然后, 通过@Results进行字段和实体类属性的映射

最后, 通过@Many再去roles表和user_role中间表中查询用户所有角色信息


作者:云淡风轻的博客
链接:https://juejin.cn/post/7013270827290329124
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



浏览 28
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报