MyBatis级联探讨第二篇——鉴别器(discriminator)

1、概述:

鉴别器在于确定使用那个ResultMap来映射SQL查询语句,在实现中我们往往有一个基类,然后可以派生一些类。比如我们要选择一群人可以用List,然而Person里面有个性别sex,根据它还可以分为Male或者Female。鉴别器就要根据sex决定用Male还是用Female相关的Mapper进行映射。

这些话还是很抽象,不过说起鉴别器,语言真的不好用描述,不过不要紧,我们来看一个实例就豁然开朗了,我们知道在上篇中我们已经有了一个员工的POJO,然后继承这个POJO分成一个男性,一个女性的POJO。


2、实例:

当我们查询一批员工的时候,我们希望的是返回一个List,而里面的元素根据性别(sex)自动匹配是MaleEmployee或者是FemaleEmployee,于是我们需要根据sex的值去决定使用MaleEmployee或者是FemaleEmployee的resultMap去映射,这便是鉴别器。

让我们来定义employ的mapper,xml代码如下:




	
		
		
		
		
		
		
			
			
		
	

	

	
		
	

	
		
	


我们这里定义了employee的resultMap,它除了级联其他的和平时我们定义的没什么不一样。这里先不看别的级联,先看看鉴别器:元素,我们定义了用javaType说明它用的是整数作为参数,而column指的是SQL对应的列为sex。

那么定义的是你的条件分支:

当sex=1时候,采用maleEmployeeMap;

当sex=2时,采用femaleEmployeeMap。

maleEmployeeMapfemaleEmployeeMap都继承了employeeMap,并且扩展了一个属性,它们用select属性,来定义如何取对应的属性数据。要记住下面这句话,后面我们还将讨论它:

这里使用了全限定路径,其次用column="id"作为参数传递,如果是多个参数的,需要用逗号分隔。



3、关联Mapper:

上面我们看到了我们使用了select关联其他的sql语句,而select里面给的就是一个全限定的路径。分别是:

com.ykzhen2015.csdn.mapper.MaleEmployeeMapper.findProstateList

com.ykzhen2015.csdn.mapper.FemaleEmployeeMapper.findUterusList

现在让我们看看这两个Mapper是怎么样的:




    






    


显然他们都比较简单,和我们定义的普通Mapper没什么区别。

记得上节中标红的这句话,就是两者的关联,这里两个select的全限定id,上节的这句话select属性是保持一致,而参数都是上节column表明的id,这样便建立了关系。

好,鉴别器就是那么简单,这样便能将两者关联在一起了。




你可能感兴趣的:(MyBatis级联探讨第二篇——鉴别器(discriminator))