mybatis基于xml配置的多表查询

mybatis多表查询

表之间的关系有几种:
	一对多
	多对一
	一对一
	多对多
举例:
	用户和订单就是一对多
	订单和用户就是多对一
		一个用户可以下多个订单
		多个订单属于同一个用户

	人和身份证号就是一对一
		一个人只能有一个身份证号
		一个身份证号只能属于一个人

	老师和学生之间就是多对多
		一个学生可以被多个老师教过
		一个老师可以交多个学生
特例:
	如果拿出每一个订单,他都只能属于一个用户。
	所以Mybatis就把多对一看成了一对一。

mybatis中的多表查询:

示例:用户和账户
    一个用户可以有多个账户
    一个账户只能属于一个用户(多个账户也可以属于同一个用户)
步骤:
    1、建立两张表:用户表,账户表
		让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
	2、建立两个实体类:用户实体类和账户实体类
	    让用户和账户的实体类能体现出来一对多的关系
	3、建立两个配置文件
		用户的配置文件
		账户的配置文件
	4、实现配置:
		当我们查询用户时,可以同时得到用户下所包含的账户信息
		当我们查询账户时,可以同时得到账户的所属用户信息
  • 表关系建立()
从表为一: (一对一,多对一)		
	在"主表"中创建一个"从表"实体的对象引用
	//简单理解,如果当前"主表"类的一个对象,只能对应一个"从表"类的对象,则就是"对一"关系.就创建一个对象引用
	
从表为多: (一对多,多对多)		
	在"主表"中创建一个"从表"实体的集合引用
	//简单理解,如果当前"主表"类的一个对象,能对应多个"从表"类的对象,则就是"对多"关系.就创建集合引用
  • 多表联合查询-从表为一
1.示例:

	/**
	 *	以"User用户"和"Account账户"作为案例, 
	 *	从"Account"角度分析,一个账户,只能属于一个用户. 
	 *	所以"Account"对"User"是"对一关系".	
	 */	

2.在"主表"中创建一个"从表"实体的对象引用

	public class Account implements Serializable {
		//定义"主表Account"的属性
		private Integer id;
		private Integer uid;
		private Double money;

		// 定义"从表User"的对象引用
		private User user;
		
		set....get...
	}
3.修改"主表"查询相关的sql语句,改为联合查询,并重新定义返回值类型resultMap

    <select id="findAll" resultMap="accountUserMap">
		select u.*,a.id as aid,a.uid,a.money
		from account a , user u
		where u.id = a.uid;
	</select>
4.修改"主表"查询结果类型

	//配置"主表"的映射信息
	<resultMap id="accountUserMap" type="account">
		<id property="id" column="aid"></id>
		<result property="uid" column="uid"></result>
		<result property="money" column="money"></result>
		
		//配置"从表",也就是"对一"的那一方的映射
		<association property="user" column="uid" javaType="user">
			<id property="id" column="id"></id>
			<result column="username" property="username"></result>
			<result column="address" property="address"></result>
		</association>
		
	</resultMap>
  • 多表联合查询-从表为多
1.说明

	/**
	 *	以"User用户"和"Account账户"作为案例, 
	 *	从"User"角度分析,一个人,可以有多个账户
	 *	所以"User"对"Account"是"对多关系".	
	 */	

2.在"主表"中创建一个"从表"实体的对象引用

	public class User implements Serializable {
		//定义"主表User"的属性
		private Integer id;
		private String username;
		private String address;
		private String sex;
		private Date birthday;

		//对多关系映射:定义"从表Account"的集合映射
		private List<Account> accounts;
		
		set....get...
	}
	
3.修改"主表"查询相关的sql语句,改为联合查询,并重新定义返回值类型resultMap

	<select id="findAll" resultMap="userAccountMap">
		select u.*,a.id as aid,a.uid,a.money from user u
		left outer join account a
		on u.id = a.uid
	</select>
	
	
4.修改"主表"查询结果类型

	//配置"主表"的映射信息
	<resultMap id="userAccountMap" type="user">
		<id property="id" column="id"></id>
		<result property="username" column="username"></result>
		<result property="address" column="address"></result>
		<result property="sex" column="sex"></result>
		<result property="birthday" column="birthday"></result>
	
		//配置"从表",也就是"对多"的那一方的映射
		<collection property="accounts" ofType="account">
			<id column="aid" property="id"></id>
			<result column="uid" property="uid"></result>
			<result column="money" property="money"></result>
		</collection>
		
	</resultMap>

猜你喜欢

转载自blog.csdn.net/weixin_43343131/article/details/84783005