栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis加强(1)~myBatis对象关系映射(多对一关系、一对多关系)、延迟/懒加载


一、myBatis对象关系映射(多对一关系、一对多关系) 1、多对一关系:

—例子:多个员工同属于一个部门。


(1)myBatis发送 额外SQL: ■ 案例:员工表通过 dept_id 关联 部门表,需求:查询指定员工id、name、所属的部门名称的信息。![在这里插入图片描述](https://img-blog.csdnimg.cn/ce2171b6b0ee4e4e8799f0da06d60c50.png#pic_center
//部门对象的接口、映射文件省略,跟员工逻辑差不多


public interface EmployeeMapper {
	Employee get(Long id);
}
	



	
	
	 		




    select id, name, dept_id from employee2 where id = #{id}




	@Test
	public void testGet() throws Exception {	
		SqlSession session = MyBatisUtil.getSession();	
		EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
		Employee e = employeeMapper.get(1L);
		System.out.println(e);
		//需要通过查询得到的dept_id查询获取得到部门对象
		
		//手动添加额外查询语句
//		Long dept_id = e.getDept().getId();
//		DepartmentMapper departmentMapper = session.getMapper(DepartmentMapper.class);
//		Department d = departmentMapper.get(dept_id);
//		e.setDept(d);
		

		System.out.println(e.getDept());	
		session.commit();
		session.close();
	}

上面是通过手动添加的额外SQL查询,通过配置resultMap的association属性,让myBatis帮我们执行如下:

	
	
		
		
		
		
		
			
	

(2)使用额外的 SQL 做映射配置会导致的问题:N+1问题

例如:每个员工的部门编号dept_id 是不同的,当查询所有员工的id、name、所属的部门名称的信息时就会发送额外N条SQL语句。

N:发送额外N条SQL语句去查询员工所属的部门名称: select name from department where id = dept_id;

1:查询所有员工的id、name、所属的部门的编号dept_id:select * from employee;

----解决:使用内联映射(多表查询),此时一条 SQL 语句搞定。

----处理多表查询的结果集的方法:内联映射。


(3)对象关联的查询: 方式一:额外的SQL 方式二:内联映射
(4)处理多表查询的结果集的方法【内联映射】:

方式一:属性名-列名 通过resultMap的子元素result进行映射配置[内联映射-使用result]:

方式二:属性名-列名 通过resultMap的子元素association进行映射配置[内联映射-使用association]![在这里插入图片描述](https://img-blog.csdnimg.cn/fc2253e7fa254bb78933471d22bd2ecb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiAIOS5kA==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center
(5)多对一关系配置总结:

★**使用association元素,配置单一对象属性。**

方式一:额外的SQL[分步查询],一般需要进入另外一个页面展示更加详细的信息。方式二:内联映射[多表查询],常用。需要在列表中显示关联对象的数据,使用内联映射,否则会出现N+1问题。



2、一对多关系配置:

—例子:一个部门有多个员工。


(1)一对多关系-额外的SQL:
  



	
	
	
	
	 




	  
     select d.id, d.name, e.id e_id, e.name e_name, e.dept_id e_dept_id from department d
  	 join employee2 e on d.id = e.dept_id where d.id = #{id}	



二、设置延迟/懒加载
  	
  	
  		
  		
  		
  		
         
  		
  	

动态代理-增强功能–延迟加载



总结:多对一、一对多关系的单属性对象/集合属性对象,使用association或collection元素?使用额外SQL或内联查询?

针对【单属性对象】:使用assoication元素,通常需要使用多表查询操作,即内联查询 针对【集合属性对象】:使用collection元素,通常还要使用延迟加载,即额外SQL处理

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/731331.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号