mybatis级联多对多(三层)

要求:查询用户的所有信息,包括用户的角色和角色的权限
数据库
五张表,分别是:
(1)用户表
(2)角色表
(3)用户与角色的关系表
(4)权限表
(5)角色与权限的关系表
在这里插入图片描述
乍一看好像是多对多,一个用户有多个角色,一个角色有多个权限,但是关系表里面一个权限也对应多个角色,以前没接触过这种关系表,而且以前都用的表联查,突然有点懵==
多对多是没法写级联的,分析一下应该是这样的关系:一个user可以有多个role,一个role可以有多个permission,如图:
在这里插入图片描述
理清楚这个关系就可以重构实体类了:
在user类里加入List<Role>

public class User {
    private int id;
    private String username;
    private String password;
    private String salt;
  
    private List<Role> roleList;
}

在role类里加入List<Permission>

public class Role {
    private int id;
    private String name;
    private String description;

    private List<Permission> permissionList;
}

映射:
(1)IUserDao

@Select("select * from pe_user where id=#{id}") //查出的结果集是user对象
    //结果集映射
    @Results({
            //id映射自己的id,还是级联的key。roleList来自于关系表中的
            @Result(column = "id",property = "id"),
            @Result(column = "id",property = "roleList",many=@Many(select = "xxx.IRoleDao.findById"))
    })
    public User findUserById(int id);

(2)IRoleDao

//返回的结果集是role对象
    @Select("select *  from pe_role where id in (select role_id from pe_user_role where user_id=#{id})")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "id",property = "permissionList",many = @Many(select = "xxx.IPermissionDao.findById"))
    })
    public List<Role> findById(int id);

(3)IPermissionDao

@Select("select * from pe_permission where id in( " +
            "select permission_id from pe_role_permission where role_id=#{id})")
    public List<Permission> findById(int id);

测一下,查出来了

@Test
    void contextLoads() {
        User user = mapper.findUserById(1);
        System.out.println(user);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis提供了一种简便的方式来实现一对多的级联查询。在这种情况下,一个实体类中包含了多个子实体类的集合,这些子实体类与该实体类是一对多的关系。 下面是一对多的级联查询的示例: 1. 首先,我们创建以下两个实体类: Order.java ```java public class Order { private int id; private String code; private List<OrderItem> items; // 省略getter和setter方法 } ``` OrderItem.java ```java public class OrderItem { private int id; private int orderId; private String product; private int quantity; // 省略getter和setter方法 } ``` 2. 接下来,我们需要创建一个映射文件来进行一对多的级联查询。在这个映射文件中,我们需要使用`<collection>`标签来定义一个集合属性,用来存储子实体类的列表。 OrderMapper.xml ```xml <mapper namespace="com.example.OrderMapper"> <resultMap id="orderMap" type="com.example.Order"> <id property="id" column="id"/> <result property="code" column="code"/> <collection property="items" ofType="com.example.OrderItem"> <id property="id" column="item_id"/> <result property="product" column="product"/> <result property="quantity" column="quantity"/> </collection> </resultMap> <select id="getOrders" resultMap="orderMap"> SELECT o.id, o.code, i.id as item_id, i.product, i.quantity FROM orders o LEFT JOIN order_items i ON o.id = i.order_id ORDER BY o.id </select> </mapper> ``` 在这个映射文件中,我们使用了`<resultMap>`标签来定义一个结果集映射,它包含了一个`<collection>`标签来定义子实体类的集合属性。在查询语句中,我们使用了`LEFT JOIN`来将订单和订单项关联起来,并使用`ORDER BY`子句来按订单ID排序。 3. 最后,我们需要创建一个接口来调用映射文件中的查询方法。 OrderMapper.java ```java public interface OrderMapper { List<Order> getOrders(); } ``` 现在,我们可以使用这个接口来查询订单和订单项的信息,如下所示: ```java SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); SqlSession sqlSession = factory.openSession(); OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class); List<Order> orders = orderMapper.getOrders(); for (Order order : orders) { System.out.println(order.getCode()); for (OrderItem item : order.getItems()) { System.out.println("\t" + item.getProduct() + " x" + item.getQuantity()); } } ``` 这个示例中,我们首先创建了一个`SqlSessionFactory`对象,然后使用它来创建一个`SqlSession`对象。接下来,我们使用`getMapper()`方法来获取一个`OrderMapper`接口的实现类。最后,我们调用查询方法来获取订单和订单项的信息,并遍历结果集来输出这些信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值