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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论