Mybatis 一对一、一对多、多对多

今天我们来复习一下 Mybatis 框架吧

总所周知,Mybatis 是一款优秀的 基于ORM 半自动 轻量化 的 持久层框架

ORM:对象关系映射,简单的说就是表结构对应实体类

半自动:可灵活配置SQL,优化代码性能

轻量化:简单好用

持久层框架:把数据存储在磁盘上

我知道你都懂,我只是自己复述一下

一对一关系

现有订单表和用户表,要求在查询订单的同时查询该订单所属用户

查询SQL

  select * from orders o,user u where o.uid = u.id

实体类

public class Order {
    private Integer id;
    private String orderTime;
    private Double total;
   private User user;
}

public class User{
    private Integer id;
    private String username;
   // 省略
}

Mapper 关键字:association

<resultMap id="orderMap" type="com.liuyuncen.Order">
  <result property="id" column="id"></result>
  <result property="orderTime" column="orderTime"></result>
  <result property="total" column="total"></result>
  <association property="user" javaType="com.liuyuncen.User">
    <result property="id" column="uid"></result>
    <result property="username" column="username"></result>
  </association>
</resultMap>


<select id="findOrderAndUser" resultMap="orderMap">
  select * from orders o,user u where o.uid = u.id
</select>

mapper 的加载方式有4种

如果是采用 包内映射接口注册,需要保证 xml 文件和 java 文件在同名包下。

一对多关系

还是刚刚的表模型,刚实验的一对一关系中,一个订单只能对应一个用户

现在要求查询一个订单并包括其下的所有订单

大多数情况下,一个用户肯定存在多个订单的情况,这就是一对多关系

但也有可能有些用户一个订单都没有,这样我们就不能使用内连接的方式,应该采用左外连接或右外连接

查询SQL是

select * from user u left join orders o on u.id = o.uid

修改实体类

public class Order {
    private Integer id;
    private String orderTime;
    private Double total;
}

public class User {
    private Integer id;
    private String username;
  // 多个订单
  private List<Order> orderList;
}

Mapper 关键字collection

<resultMap id="userMap" type="com.liuyuncen.User">
    <result property="id" column="uid"></result>
    <result property="username" column="username"></result>
    <collection property="orderList" ofType="com.liuyuncen.Order">
        <result property="id" column="id"></result>
        <result property="orderTime" column="orderTime"></result>
        <result property="total" column="total"></result>
    </collection>
</resultMap>

<select id="findAll" resultMap="userMap">
    select * from user u left join orders o on u.id = o.uid
</select>

多对多关系

用户表和角色的关系为,一个用户有多个角色,一个角色被多个用户使用

sys_user_role 的两个字段既作为联合主键也作为外键,这就是 多对多关系体现

多对多查询需求:查询所有用户同时查询出该用户的所有角色

查询SQL

# 查询所有用户同时查询出该用户的所有角色
select * from user u left join sys_user_role sur on u.id = sur.userid inner join sys_role sr on sur.roleid = sr.id

修改实体类

public class User {
    private Integer id;
    private String username;
    private List<Role> roleList;
}

Mapper

<resultMap id="userRoleMap" type="com.liuyuncen.User">
    <result property="id" column="userid"></result>
    <result property="username" column="username"></result>
    <collection property="roleList" ofType="com.liuyuncen.Role">
        <result property="id" column="roleid"></result>
        <result property="roleName" column="roleName"></result>
        <result property="roleDesc" column="roleDesc"></result>
    </collection>
</resultMap>


<select id="findAllUserAndRole" resultMap="userRoleMap">
    select * from user u left join sys_user_role ur on u.id = ur.userid
                   left join sys_role r on r.id = ur.roleid
</select>

控制台打印信息

ok 今天的分享就到这里了,既然都看到这里了,不妨透露个小秘密,明天分享基于注解的关系查询!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiang想`

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值