MyBatis-映射文件07-discriminator标签

本文介绍了如何在MyBatis中使用discriminator标签进行性别判断,根据查询的员工性别(gender)不同,执行不同的封装策略。当查询到女性员工时,进一步查询部门信息;对于男性员工,则将last_name字段值赋给email。通过示例展示了EmployeeMapper、DepartmentMapper的XML配置及测试结果,揭示了MyBatis的灵活封装和懒加载特性。

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

MyBatis-映射文件07-discriminator标签

discriminator鉴别器:mybatis可以使用该鉴别器来判断某列的值,然后根据判断的结果改变封装行为 (类似于switch-case)
需求描述:

根据id查询员工的信息(tbl_employee表),如果查询出来的员工是女生(gender=0),则进而把该员工的部门信息查询出来;如果查询到的是男生(gender=1),就把last_name这一列的值封装到email这一JavaBean变量

解决方案:

1.使用resulyMap封装结果集

2.在resultMap标签内使用标签来进行性别的判断

​ 1)判断结果为0时,使用标签来调用部门的映射文件中的查询方法

​ 2)判断结果为1时,重新定义封装规则

具体代码实现:

EmployeeMapper.class

package dao;

import bean.Employee;

public interface EmployeeMapper {
	// 使用鉴别器查询
	public Employee getEmpByDis(Integer id);
}

EmployeeMapper.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="dao.EmployeeMapper">
	<resultMap type="bean.Employee" id="MyEmpsDis">
		<id column="id" property="id" />
		<result column="last_name" property="lastName" />
		<result column="email" property="email" />
		<result column="gender" property="gender" />

		<!-- column:指定要判别的列名 javaType:要判别的列的值对应的java类型(数据类型or对象类型) -->
		<discriminator javaType="string" column="gender">
			<!-- value为要判别的列的不同取值 ,0为女生,1为男生 resultType:指定封装的结果类型 ,不能缺省,也可以使用resultMap -->
			<!-- 女生:查部门 -->
			<case value="0" resultType="bean.Employee">
				<association property="dept" select="dao.DepartmentMapper.getDeptById" column="d_id"></association>
			</case>
			<!-- 男生:重新定义封装方法 -->
			<case value="1" resultType="bean.Employee">
				<id column="id" property="id" />
				<result column="last_name" property="lastName" />
				<result column="last_name" property="email" />		<!-- 把last_name赋值给email -->
				<result column="gender" property="gender" />
			</case>
		</discriminator>
	</resultMap>
	<!-- 对应的接口中的方法:public Employee getEmpByDis(Integer id); -->
	<select id="getEmpByDis" resultMap="MyEmpsDis">
		select * from tbl_employee where id = #{id}
	</select>
</mapper>

DepartmentMapper.java

package dao;
import bean.Department;
public interface DepartmentMapper {
	public Department getDeptById(Integer id);
}

DepartmentMapper.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="dao.DepartmentMapper">

	<!-- 对应的接口方法:public Department getDeptById(Integer id); -->
	<select id="getDeptById" resultType="bean.Department">
		select id,dept_name departmentName from tbl_dept where id = #{id}
	</select>

</mapper>

测试方法:

package test;

import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import bean.Employee;
import dao.EmployeeMapper;

public class MyBatisTest {

	// 获取SqlSessionfactory对象的方法
	public SqlSessionFactory getSqlSessionFactory() throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		return new SqlSessionFactoryBuilder().build(inputStream);

	}
	@Test
	public void test() throws IOException {
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		SqlSession openSession = sqlSessionFactory.openSession();
		try {
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			Employee empByDis = mapper.getEmpByDis(1);
			System.out.println(empByDis);
			System.out.println(empByDis.getDept());
			
			Employee empByDis2 = mapper.getEmpByDis(4);
			System.out.println(empByDis2);
			System.out.println(empByDis2.getDept());
		} finally {
			openSession.close();
		}
	}

}

测试结果:

DEBUG 11-02 15:05:26,487 ==>  Preparing: select * from tbl_employee where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 11-02 15:05:26,520 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 11-02 15:05:26,541 <==      Total: 1  (BaseJdbcLogger.java:145) 
Employee [id=1, lastName=Admin, email=Admin, gender=1]
null
DEBUG 11-02 15:05:26,545 ==>  Preparing: select * from tbl_employee where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 11-02 15:05:26,548 ==> Parameters: 4(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 11-02 15:05:26,552 ====>  Preparing: select id,dept_name departmentName from tbl_dept where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 11-02 15:05:26,553 ====> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 11-02 15:05:26,556 <====      Total: 1  (BaseJdbcLogger.java:145) 
DEBUG 11-02 15:05:26,557 <==      Total: 1  (BaseJdbcLogger.java:145) 
Employee [id=4, lastName=tina, email=tina.com, gender=0]
Department [id=1, departmentName=开发部]

从查询结果可以开出,查询到男生时,并没有去查他的部门信息,因此输出部门时输出结果为null,反而他的email的值与lastName的值相同,因此时使用了重新定义的封装规则;查询到女生时,可以输出她所在的部门信息,且email与lastName值不相同,并且查询女生的部门信息这里使用到了分步查询,利用懒加载,使得只有再需要输出部门信息时才会去发送查询部门的sql请求

p.s.具体的JavaBean实体类的定义与数据库表的定义、以及全局配置文件可参考其他博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值