08.Mybatis多表查询

一对一(多对一)

  • 需求:
      查询所有账户信息,关联查询下单用户信息
  • 注意:
      因为一个账户信息只能供某个用户使用,所以从查询账户信息出发关联查询用户信息为一对一查询。如 果从用户信息出发查询用户下的账户信息则为一对多查询,因为一个用户可以有多个账户
  • 用户为User 表,账户为Account 表。一个用户(User)可以有多个账户(Account),模型如下
    在这里插入图片描述

方式一 (继承的方式)

  • 定义账户信息的实体类
	@Date
	public class Account implements Serializable{
		private Integer id;
		private Integer uid;
		private Double money;
	}
  • 定义 AccountUser 类
	@Date
	public class AccountUser extends Account implements Serializable {
		private String username; 
		private String address; 
	}
  • 定义账户的持久层 Dao 接口
	public interface IAccountDao {
		// 类型是AccountUser
		List<AccountUser> findAll(); 
	}
  • 定义 AccountDao.xml 文件中的查询配置信息
    <select id="findAll" resultType="accountuser">   
        select a.*,u.username,u.address from account a,user u where a.uid =u.id;  
    </select>

方式二(resultMap的方式)

  • 定义账户信息的实体类
	@Date
	public class Account implements Serializable{
		private Integer id;
		private Integer uid;
		private Double money;
		// 加入User实体类
		private User user; 
	}
  • 定义账户的持久层 Dao 接口
	public interface IAccountDao {
		// 类型是Account
		List<Account> findAll(); 
	}
  • 重新定义 AccountDao.xml 文件
    <resultMap id="accountMap" type="account">
        <id property="id" column="aid"/>
        <result property="uid" column="uid"/>
        <result property="money" column="money"/>
        <!--property为Account实体类中的属性,javaType为property的pojo中属性类型-->
        <!--加入实体类用association,多对一,这是一-->
        <association property="user" javaType="user">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="address" column="address"/>
            <result property="sex" column="sex"/>
            <result property="birthday" column="birthday"/>
        </association>
    </resultMap>
    <select id="findAllByIntroduce" resultMap="accountMap">
		select u.*,a.id as aid,a.uid,a.money from account a,user u where a.uid =u.id
    </select>

一对多

  • 需求:
      查询所有用户信息及用户关联的账户信息
  • 分析:
      用户信息和他的账户信息为一对多关系,并且查询过程中如果用户没有账户信息,此时也要将用户信息 查询出来,我们想到了左外连接查询比较合适
  • User 类加入 List< Account >
@Data
public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    private List<Account> accounts;
}
  • 定义账户的持久层 Dao 接口
	public interface IAccountDao {
		// 类型是Account
		List<User> findAll(); 
	}
    <resultMap type="user" id="userMap">
        <id column="id" property="id"></id>
        <result column="username" property="username"/>
        <result column="address" property="address"/>
        <result column="sex" property="sex"/>
        <result column="birthday"
                property="birthday"/>   
        <!--collection 是用于建立一对多中集合属性的对应关系    ofType 用于指定集合元素的数据类型-->
        <!--在实体类中加入了List而不是实体类Account-->
        <collection property="accounts" ofType="account">
            <id column="aid" property="id"/>
            <result column="uid" property="uid"/>
            <result column="money" property="money"/>
        </collection>
    </resultMap>

    <!-- 配置查询所有操作 -->
    <select id="findAll" resultMap="userMap">   
        select u.*,a.id as aid ,a.uid,a.money from user u left outer join account a on u.id =a.uid  
    </select>

多对多

  • 多对多关系其实我们看成是双向的一对多关系,模型如下
    在这里插入图片描述
  • 编写角色实体类
@Data
public class Role implements Serializable {
    private Integer roleId;
    private String roleName;
    private String roleDesc;
    private List<User> users;
}
  • 编写 Role 持久层接口
	public interface IRoleDao {
		List<Role> findAll(); 
	}
  • 编写映射文件
    <resultMap id="roleMap" type="Role">
        <id property="roleId" column="id"/>
        <result property="roleName" column="ROLE_NAME"/>
        <result property="roleDesc" column="ROLE_DESC"/>
        <!--collection 是用于建立一对多中集合属性的对应关系    ofType 用于指定集合元素的数据类型-->
        <collection property="user" ofType="user">
            <id property="id" column="id"/>
            <result property="username" column="username"/>
            <result property="address" column="address"/>
            <result property="sex" column="sex"/>
            <result property="birthday" column="birthday"/>
        </collection>
    </resultMap>
    <select id="findAll" resultMap="roleMap">
        select u.*,r.ROLE_NAME,r.ROLE_DESC from user_role ur left join role r on ur.rid = r.id left join
        user u on u.id = ur.uid 
    </select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值