鉴别器discriminator - 按字段选择结果集

本文介绍了MyBatis中的鉴别器discriminator标签,用于根据字段值选择不同的结果集映射,类似于switch语句。通过一个限权管理的场景,展示了如何配置实体类、映射文件以及测试用例,实现根据用户权限返回不同信息的结果集。文章还提到了鉴别器与外部resultMap的结合使用以及在级联(嵌套)结果集中的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鉴别器和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&#
### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值