mybatis-- resultMap用法

resultMap 可以看https://www.bilibili.com/video/av21272940/   这里的讲解很细致


1. 当表的字段与实体类的属性不一致

例如我的表里的字段是emp_name     javaBean类里面是name, 这时mybatis自动映射不能帮忙了

1. 将 name  改为 empName   就可以

2. 用resultMap来映射

在mapper.xml文件里面

 
         
         
         
         
         
         
         

注意  insert  update  delete是没有resultType和resultMap属性的,下面的图可以看到

http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

mybatis-- resultMap用法_第1张图片

2. 一对多时 如何使用?

(1)使用级联属性


		
		
		
		
		
		
		
	


		

这里column 与你的SQL语句中要查询的列要对应  ,property是对应的POJO属性对应

我将这里的列名 改掉 ,则会查不出对应的部门信息

mybatis-- resultMap用法_第2张图片

(2)可以通过  association来替代级联



		
		
		
		
		
		
			
			
		
	

3)可以通过  association实现分步查询

绑定mapper出现BindingException 要注意不要写成了POJO的全类名


public interface EmployeeMapper {
	
	public Employee getEmpByIdStep(Integer id);

		
		
		
		
		
		
		
	
	


Department里面

public interface DepartmentMapper {
	public Department findDeptById(Integer id);
}


 
 	
 
 

最后的单元测试

@Test
	public void test3() throws Exception{
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		//2.
		SqlSession openSession = sqlSessionFactory.openSession();
		try {
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			Employee emp = mapper.getEmpByIdStep(2);
			System.out.println(emp);
			System.out.println(emp.getDept());
		} finally {
			openSession.close();
		}
	}

可以看到控制台发了两个SQL  ,Employee显示出了全部的内容

mybatis-- resultMap用法_第3张图片

mybatis-- resultMap用法_第4张图片

(4)延迟加载(懒加载)

association和collection还具备延迟加载的功能

在mybatis-config文件中配置下面的

lazyLoadingEnabled

默认是false)

延迟加载的全局开关。当开启时,所有关联对象都会延迟加载

。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。

true | false false

aggressiveLazyLoading

(默认是false,  true in ≤3.4.1)

当开启时,任何方法的调用都会加载该对象的所有属性

。否则,每个属性会按需加载(参考lazyLoadTriggerMethods).

我的mybatis版本3.4.1的    aggressiveLazyLoading默认是true,需要改为false

		
		 
    	 
    	
    	 
将这个注释掉 只开启一个  依然是发送的两个SQL
开启延时加载最好是同时设置这两个,
	@Test
	public void test3() throws Exception{
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		//2.
		SqlSession openSession = sqlSessionFactory.openSession();
		try {
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			Employee emp = mapper.getEmpByIdStep(2);
			
			System.out.println(emp.getEmpName());
			
		} finally {
			openSession.close();
		}
	}

没开启就会发送2个SQL

mybatis-- resultMap用法_第5张图片

开启后只发送了一条SQL

mybatis-- resultMap用法_第6张图片

(5) resultMap高级映射collection的使用

当我要查询 一个部门的所有员工时 ,比如需要查出开发部里的全部员工 , 返回的是查询的部门中包含多名员工

这时将关联的员工信息封装起来     需要用collection来处理

DepartmentMapper.xml里面设置resultMap


 
 	
 	
 	
 	
 		
 		
 		
 	
 
 
 

DepartmentMapper.java  接口中定义这个方法

public Department getDeptByIdPlus(Integer id);

这里的collection用于封装查询到的Employee信息

这里要先在Department POJO类   加上一个集合属性 

public class Department {
	private Integer id;
	private String deptName;
	private List emps;//加上这个集合属性

这样就可以查到  一个部门 下的 所有员工

@2   与association类似,collection同样支持分段查询 以及延迟加载

分段查询: 同样地 要查询一个部门下的所有员工,可以分阶段  先查部门  再查询员工

1.首先在两个mapper加上接口方法

public Department getDeptByIdStep(Integer id); ===》》  DepartmentMapper
public List getEmpsByIdStep(Integer deptId);   ===》》  EmployeeMapper

2.对应的Departmentmapper.xml   以及 EmployeeMapper.xml


 
 	
	 
	
	
	
 
 
 
 
通过测试,可以看到发送了两个SQL

mybatis-- resultMap用法_第7张图片

对于延迟加载   是按需加载,若只要查询部门名,就只会发一条SQL



		
		
		
		
		
		
		
			
				
				
			
			
				
				
				
			
		

你可能感兴趣的:(javaweb)