鉴别器和switch语句
无论是在C语言还是Java里,相信大家都会对switch语句有一定的印象,switch语句是多分支选择语句,即根据不同的字段,选择执行不同的语句,最大的用处就是用来处理多分支选择的场景。以前初学C语言的时候,把多选择结构用多个嵌套的if语句来实现,导致代码可读性低,switch语句正好解决这一代码冗长的问题。这篇日志写的鉴别器,discriminator标签,就是类似switch语句,实现根据不同的字段来选择不同的resultMap进行映射。你可能会有疑问,查询之前我们的实体类和结果集映射不都是事先配置好的吗?字段和属性一一对应,为什么还要有选择不同的结果集映射这一步?原因,有可能查询返回多个不同的结果集,或者利用鉴别器discriminator,你可以选择那些字段能被映射,那些字段屏蔽掉不被映射。下面来看看这个鉴别器的使用场景有哪些。
场景 – 限权管理:选择映射有联系的结果集
使用场景之一,就是限权的管理,例如一个商场的数据库,对于不同的顾客,管理员因为权限问题,可以查询得到的顾客信息不同,有的顾客除了基本信息外,只能被查询出省会和城市信息,而有的顾客,除了基本信息外,只能被查询出年龄和生日信息。如果要实现这样的限权管理,可以在查询映射时,使用discriminator标签,鉴别查询得到的每一条顾客信息中,根据数据库中的权限字段,假设权限为“1”的顾客,除了基本信息外,只能被查询出省会和城市;权限为“2”的顾客,除基本信息,只能被查询出生日和年龄。然后鉴别器discriminator在查询返回时,会根据权限字段“1”和“2”,分别给出不同的结果集映射,对于权限为“1”的顾客信息,使用屏蔽生日和年龄的resultMap来映射,而对于权限为“2”的顾客,则使用给出生日和年龄字段的映射关系的resultMap。下面来简单看一下这个实现:
持久化实体类
public class UserDiscriminator1 {
private int id;
private String username; //顾客姓名
private String gender; //性别
private String email; //电子邮件
private String province; //省会
private String city; //城市
public UserDiscriminator1() {
}
public UserDiscriminator1(int id, String username, String gender, String email,
String province, String city) {
this.username = username;
this.gender = gender;
this.email = email;
this.province = province;
this.city = city;
}
// 省略get()和set()方法
}
假设我们有两个实体类,分别代表两类顾客,其中一类顾客,UserDiscriminator1,除了基本信息外,我们的限权只能够查询出他们的省会和城市信息。
public class UserDiscriminator2 {
private int id;
private String username; //顾客姓名
private String gender; //性别
private String email; //电子邮件
private Date birthday; //生日
private int age; //年龄
public UserDiscriminator2() {
}
public UserDiscriminator2(int id, String username, String gender, String email,
Date birthday, int age) {
this.username = username;
this.gender = gender;
this.email = email;
this.birthday = birthday;
this.age = age;
}
// 省略get()和set()方法
}
第二类顾客,UserDiscriminator2,除了基本信息,我们的限权只能查出他们的生日和年龄。
在两类顾客的实体类中,假设顾客姓名,性别和电子邮件都是可以查询出来的通用信息,其他的一些个人信息,根据限权的不同,得到的顾客信息会不同。接下来看SQL映射配置文件。
映射配置文件
SQL映射配置文件很重要,因为鉴别器discriminator标签就在里面,它会根据字段的不同,选择不同的case指定的映射方式:
<resultMap type="com.mybatis.po.UserDiscriminator" id="userDiscriminatorResultMap1">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
<result property="gender" column="user_gender"/>
<result property="email" column="user_email"/>
<discriminator javaType="int" column="user_id&#