mybatis中基于注解方式的多表查询
开发前的准备
当前文章中所用到的表以及数据, 用到的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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
