mybatis文件映射之鉴别器discriminator标签

摘要:
Mybatis可以使用鉴别器来确定列的值,然后根据列的值更改封装行为。case标记中的value属性标识数据库中列的值,resultType指定封装的结果类型,这是必不可少的。DepartmentMapper.xmlselect*fromtbl_Department,其中id=#{id}测试:package.com。锣mybatis。测验importjava.io。IOException;importjava.io。输入流;导入java.util。列表导入java.util。地图importorg.apache.ibatis.io。资源;importorg.apache.ibatis会话。SqlSession;importorg.apache.ibatis会话。SqlSessionFactory;importorg.apache.ibatis会话。SqlSessionFactoryBuilder;importorg.junit。测验importcom.gong.mybatis.bean。部门importcom.gong.mybatis.bean。受雇者importcom.gong.mybatis.dao。部门映射器;importcom.gong.mybatis.dao。EmployeeMapperPlus;publicclassTestMybatis2{publicSqlSessionFactorygetSqlSessionFactory()throwsIOException{Stringresource=“mybatis config.xml”;InputStreamis=Resources.getResourceAsStream;returnnewSqlSessionFactoryBuilder().build;}@通过IOException{SqlSessionFactorysqlSessionFactory=getSqlSessionFactory();SqlSessionopenSession=sqlSessionFactory.openSession();尝试{EmployeeMapperPlusmapper=openSession.getMapper;Employeemployee=mapper.getEmpByIdStep;System.out.println;System.out.pintln;openSession.commit();}最后{openSession.close();}}第一个测试用例是gender=0:DEBUG01-2020:47:37503==˃准备:select*fromtbl_employewhereid=?

mybatis可以使用鉴别器判断某列的值,然后根据某列的值改变封装行为。

比如说:

如果是女生(gender=0)我们将部门信息提取出来,否则不提取;

如果是男生(gender=1),把last_name的值赋值给email;

EmployeeMapper.xml

    <resultMap type="com.gong.mybatis.bean.Employee" id="MyEmpDis">
        <id column="id" property="id"/>
        <result column="last_name" property="lastName"/>
        <result column="gender" property="gender"/>
        <result column="email" property="email"/>
        <discriminator javaType="string" column="gender">
            <case value="0" resultType="com.gong.mybatis.bean.Employee">
                <association property="dept" select="com.gong.mybatis.dao.DepartmentMapper.getDeptById"
                column="d_id">
                </association>
            </case>
            <case value="1" resultType="com.gong.mybatis.bean.Employee">
                <id column="id" property="id"/>
                <result column="last_name" property="lastName"/>
                <result column="gender" property="gender"/>
                <result column="last_name" property="email"/>
            </case>
        </discriminator>
    </resultMap>
    <select id="getEmpByIdStep" resultMap="MyEmpDis">
        select * from tbl_employee where id=#{id}
    </select>

说明:distriminator中的javaType指定数据库中字段对应着java中的属性的类型,column属性为列名称。case标签中value属性标识数据库中列的值,resultType指定封装的结果类型,不可少。

DepartmentMapper.xml

    <select id="getDeptById" resultType="com.gong.mybatis.bean.Department">
        select * from tbl_department where id=#{id}
    </select>

进行测试:

package com.gong.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

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 com.gong.mybatis.bean.Department;
import com.gong.mybatis.bean.Employee;
import com.gong.mybatis.dao.DepartmentMapper;
import com.gong.mybatis.dao.EmployeeMapperPlus;

public class TestMybatis2 {
    
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(is);
    }

    @Test
    public void test() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            EmployeeMapperPlus mapper = openSession.getMapper(EmployeeMapperPlus.class);
            Employee employee = mapper.getEmpByIdStep(3);
            System.out.println(employee.getLastName());
            System.out.println(employee.getDept());
            openSession.commit();
        } finally {
            openSession.close();
        }
        
    }

}

首先测试的是gender=0的情况:

DEBUG 01-20 20:47:37,503 ==> Preparing: select * from tbl_employee where id=? (BaseJdbcLogger.java:145)
DEBUG 01-20 20:47:37,590 ==> Parameters: 3(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-20 20:47:37,757 <== Total: 1 (BaseJdbcLogger.java:145)
小红
DEBUG 01-20 20:47:37,759 ==> Preparing: select * from tbl_department where id=? (BaseJdbcLogger.java:145)
DEBUG 01-20 20:47:37,760 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-20 20:47:37,763 <== Total: 1 (BaseJdbcLogger.java:145)
Department [id=1, deptName=开发部]

可以查到部门的信息。

接下来是gender=1的情况:

Employee employee = mapper.getEmpByIdStep(1);

DEBUG 01-20 20:53:32,581 ==> Preparing: select * from tbl_employee where id=? (BaseJdbcLogger.java:145)
DEBUG 01-20 20:53:32,647 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-20 20:53:32,708 <== Total: 1 (BaseJdbcLogger.java:145)
xiximayou
null

发现部门信息是查不到的。

再进行gender=1时的情况:

            Employee employee = mapper.getEmpByIdStep(1);
            System.out.println(employee);
            System.out.println(employee.getDept());

DEBUG 01-20 20:54:39,440 ==> Preparing: select * from tbl_employee where id=? (BaseJdbcLogger.java:145)
DEBUG 01-20 20:54:39,480 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-20 20:54:39,555 <== Total: 1 (BaseJdbcLogger.java:145)
Employee [id=1, lastName=xiximayou, gender=1, email=xiximayou, dept=null]
null

email被修改,且部门信息查不到。

gender=0的情况:

        Employee employee = mapper.getEmpByIdStep(3);
        System.out.println(employee);
        System.out.println(employee.getDept());

DEBUG 01-20 20:56:19,177 ==> Preparing: select * from tbl_employee where id=? (BaseJdbcLogger.java:145)
DEBUG 01-20 20:56:19,221 ==> Parameters: 3(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-20 20:56:19,384 <== Total: 1 (BaseJdbcLogger.java:145)
DEBUG 01-20 20:56:19,385 ==> Preparing: select * from tbl_department where id=? (BaseJdbcLogger.java:145)
DEBUG 01-20 20:56:19,386 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145)
DEBUG 01-20 20:56:19,389 <== Total: 1 (BaseJdbcLogger.java:145)
Employee [id=3, lastName=小红, gender=0, email=xiaohong@qq.com, dept=Department [id=1, deptName=开发部]]
Department [id=1, deptName=开发部]

email未被修改,且可以查到部门的信息。

免责声明:文章转载自《mybatis文件映射之鉴别器discriminator标签》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python--画图时希腊字母的显示SpringMVC(四)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ssm框架基本流程

题目,写的有点大了,其实就是 对一张表的基本处理,增删改查的基本操作演示。好了,我们开始了。 假如,我们在做一个单表处理,就举例是 学院(某个大学的学院) 吧。首先,我们分析 学校这样表有哪些属性,分析完后,就可以在数据库中 建 depart 这张表了。有三个属性: 然后要在项目中 做一个 depart Bean 可以使用generate mybais...

MyBatis学习4---使用MyBatis_Generator生成Dto、Dao、Mapping

由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,所以查资料发现有现成的工具可以自动生成底层模型类、Dao接口类甚至Mapping映射文件。 一、建立表结构 CREATE TABLE `user` (`id` varchar(50) NOT NULL,`username` varch...

MyBatis与Spring MVC结合时,使用DAO注入出现:Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

错误源自使用了这个例子:http://www.yihaomen.com/article/java/336.htm,如果运行时会出现如下错误: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessi...

Mybatis之collection标签嵌套查询(select)的写法

业务:查询一种商品,展示该商品多种规格。 GroupDetailsVo : package com.community.api.vo; import java.io.Serializable;import java.math.BigDecimal;import java.util.Date;import java.util.List; import lom...

mybatis 注解形式设置批量新增、批量更新数据

1. 批量更新: @Update({"<script>" + "<foreach collection="smsConfigTemplateList" item="item" separator=";">" + " UPDATE" + " mt_m...

多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构

前言 SaaS模式是什么? 传统的软件模式是在开发出软件产品后,需要去客户现场进行实施,通常部署在局域网,这样开发、部署及维护的成本都是比较高的。 现在随着云服务技术的蓬勃发展,就出现了SaaS模式。 所谓SaaS模式即是把产品部署在云服务器上,从前的客户变成了“租户”,我们按照功能和租用时间对租户进行收费。 这样的好处是,用户可以按自己的需求来购买功...