MyBatis级联探讨第二篇——鉴别器(discriminator)
来源:互联网 发布:域名认证和备案的区别 编辑:程序博客网 时间:2024/05/17 03:40
1、概述:
鉴别器在于确定使用那个ResultMap来映射SQL查询语句,在实现中我们往往有一个基类,然后可以派生一些类。比如我们要选择一群人可以用List<Person>,然而Person里面有个性别sex,根据它还可以分为Male或者Female。鉴别器就要根据sex决定用Male还是用Female相关的Mapper进行映射。
这些话还是很抽象,不过说起鉴别器,语言真的不好用描述,不过不要紧,我们来看一个实例就豁然开朗了,我们知道在上篇中我们已经有了一个员工的POJO,然后继承这个POJO分成一个男性,一个女性的POJO。
当我们查询一批员工的时候,我们希望的是返回一个List<Employee>,而里面的元素根据性别(sex)自动匹配是MaleEmployee或者是FemaleEmployee,于是我们需要根据sex的值去决定使用MaleEmployee或者是FemaleEmployee的resultMap去映射,这便是鉴别器。
让我们来定义employ的mapper,xml代码如下:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.ykzhen2015.csdn.mapper.EmployeeMapper"><resultMap id="employeeMap" type="com.ykzhen2015.csdn.pojo.Employee"><id property="id" column="id" /><result property="empName" column="emp_name" /><result property="sex" column="sex" /><association property="employeeCard" column="id"select="com.ykzhen2015.csdn.mapper.EmployeeCardMapper.getEmployeeCardByEmpId" /><collection property="projectList" column="id"select="com.ykzhen2015.csdn.mapper.ProjectMapper.findProjectByEmpId" /><discriminator javaType="int" column="sex"><case value="1" resultMap="maleEmployeeMap" /><case value="2" resultMap="femaleEmployeeMap" /></discriminator></resultMap><select id="getEmployee" parameterType="int" resultMap="employeeMap">select id, emp_name as empName, sex from t_employee where id =#{id}</select><resultMap id="maleEmployeeMap" type="com.ykzhen2015.csdn.pojo.MaleEmployee" extends="employeeMap"><collection property="prostateList" select="com.ykzhen2015.csdn.mapper.MaleEmployeeMapper.findProstateList" column="id" /></resultMap><resultMap id="femaleEmployeeMap" type="com.ykzhen2015.csdn.pojo.FemaleEmployee" extends="employeeMap"><collection property="uterusList" select="com.ykzhen2015.csdn.mapper.FemaleEmployeeMapper.findUterusList" column="id" /></resultMap></mapper>
我们这里定义了employee的resultMap,它除了级联其他的和平时我们定义的没什么不一样。这里先不看别的级联,先看看鉴别器:<discriminator>元素,我们定义了用javaType说明它用的是整数作为参数,而column指的是SQL对应的列为sex。
那么<case>定义的是你的条件分支:
当sex=1时候,采用maleEmployeeMap;
当sex=2时,采用femaleEmployeeMap。
maleEmployeeMap和femaleEmployeeMap都继承了employeeMap,并且扩展了一个属性,它们用select属性,来定义如何取对应的属性数据。要记住下面这句话,后面我们还将讨论它:
这里使用了全限定路径,其次用column="id"作为参数传递,如果是多个参数的,需要用逗号分隔。
3、关联Mapper:
上面我们看到了我们使用了select关联其他的sql语句,而select里面给的就是一个全限定的路径。分别是:
com.ykzhen2015.csdn.mapper.MaleEmployeeMapper.findProstateList
和
com.ykzhen2015.csdn.mapper.FemaleEmployeeMapper.findUterusList
现在让我们看看这两个Mapper是怎么样的:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.ykzhen2015.csdn.mapper.MaleEmployeeMapper"> <select id="findProstateList" parameterType="int" resultType="string"> select prostate from t_healthy_male where emp_id = #{emp_id} </select></mapper><?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.ykzhen2015.csdn.mapper.FemaleEmployeeMapper"> <select id="findUterusList" parameterType="int" resultType="string"> select uterus from t_healthy_female where emp_id = #{emp_id} </select></mapper>显然他们都比较简单,和我们定义的普通Mapper没什么区别。
记得上节中标红的这句话,就是两者的关联,这里两个select的全限定id,上节的这句话select属性是保持一致,而参数都是上节column表明的id,这样便建立了关系。
好,鉴别器就是那么简单,这样便能将两者关联在一起了。
- MyBatis级联探讨第二篇——鉴别器(discriminator)
- 鉴别器(discriminator)
- MyBatis的discriminator鉴别器的作用
- mybatis级联问题(association、collection和discriminator)
- discriminator鉴别器的使用
- MyBatis级联探讨第一篇——概念和模型
- MyBatis级联探讨第三篇——一对一和一对多
- Mybatis鉴别器
- mybatis-鉴别器
- Mybatis 鉴别器
- Mybatis 鉴别器
- mybatis的select_resultMap_discriminator鉴别器
- mybatis resultMap鉴别器使用
- mybatis discriminator 鉴定器
- MyBatis级联第四篇——N+1问题和全局延迟加载【推荐,MyBatis级联重要的一篇原创,建议认真读】
- mybatis 学习记录(4.1)—— 级联查询(无 association 和 collection)
- mybatis 学习记录(4.2)—— 级联查询(有 association 和 collection)
- MyBatis学习总结——实现级联表查询(一对一,一对多)
- Java垃圾收集算法与内存泄露
- PHP学习05----PHP数据类型
- 高级渲染配置
- Service的工作过程
- position详解
- MyBatis级联探讨第二篇——鉴别器(discriminator)
- iOS 平台如何使用 TestFlight 进行 Beta 测试
- 网络流量监控
- ajax缓存与浏览器差异
- 关于extjs页面打不开问题
- opencv-图片处理-实现傅里叶变换的窗口函数
- 获取环境变量
- 理解内存管理
- UNPv1第二十二章:信号驱动IO