MyBatis的discriminator 鉴别器使用(十一)下

简介: MyBatis的discriminator 鉴别器使用(十一)

三. 根据员工编号嵌套result 查询。


为了根据不同的情况,可以查询出不同的结果,那么需要将sex 当成一个参数传递进去。

UserMapper.java 提供接口:


public User getUserByIdWithResultString(@Param(value="id") int id,
      @Param(value="sex") String sex);


UserMapper.xml sql语句:


<resultMap type="user" id="userResultMapWithDiscriminatorResult">
    <!-- 员工的基本属性。 -->
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="sex" column="sex"/>
    <result property="age" column="age"/>
    <result property="description" column="description"/>
    <!-- 分类选择 -->
    <discriminator javaType="string" column="sex">
      <case value="男" resultMap="boyHealthyMapWithResult"></case>
      <case value="女" resultMap="girlHealthyMapWithResult"></case>
    </discriminator>
  </resultMap>
  <select id="getUserByIdWithResultString" resultMap="userResultMapWithDiscriminatorResult">
    <!--因为表中id,description 等大量字段重复,为了保证不被合并,这里要用别名进行区分。-->
    select u.id as id,u.name as name,u.sex as sex,u.age as age,u.description as description,
    b.id as bid,b.height as bheight,b.weight as bweight,b.xin as bxin,b.gan as bgan,b.qianleixian as bqianleixian,b.description as bdescription,
    g.id as gid,g.height as gheight,g.weight as gweight,g.xin as gxin,g.gan as ggan,g.zigong as gzigong,g.description as gdescription
     from user u,boy_healthy b,girl_healthy g where u.id=#{id}
    and 
    <!--这里的 sex, 指的是前台传入的参数。 这里的写法,见下文。-->
    <if test='sex=="男"'>
      u.id=b.userId
    </if>
    <if test='sex=="女"'>
      u.id=g.userId
    </if>
  </select>
  <!-- 嵌套结果 -->
  <resultMap type="boyBean" id="boyHealthyMapWithResult" extends="userResultMapWithDiscriminator">
    <collection property="healthyList" ofType="boyHealthy" javaType="ArrayList">
      <id property="id" column="bid"/>
      <result property="height" column="bheight"/>
      <result property="weight" column="bweight"/>
      <result property="xin" column="bxin"/>
      <result property="gan" column="bgan"/>
      <result property="qianleixian" column="bqianleixian"/>
      <result property="description" column="bdescription"/>
    </collection>
  </resultMap>
  <resultMap type="girlBean" id="girlHealtyMapWithResult" extends="userResultMapWithDiscriminator">
    <collection property="healthyList" ofType="girlHealthy" javaType="ArrayList">
          <id property="id" column="gid"/>
          <result property="height" column="gheight"/>
          <result property="weight" column="gweight"/>
          <result property="xin" column="gxin"/>
          <result property="gan" column="ggan"/>
          <result property="zigong" column="gzigong"/>
          <result property="description" column="gdescription"/>
    </collection>
  </resultMap>


测试方法:


  @Test
  public void getByIdWithResultTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=userMapper.getUserByIdWithResultString(1,"男");
    System.out.println("员工信息:"+user);
    if("男".equals(user.getSex())){
      BoyBean boyBean=(BoyBean)user;
      List<BoyHealthy> boyHList=boyBean.getHealthyList();
      boyHList.forEach(n ->System.out.println(n));
    }else{
      GirlBean girlBean=(GirlBean)user;
      List<GirlHealthy> girlHList=girlBean.getHealthyList();
      girlHList.forEach(n ->System.out.println(n));
    }
  }


20190715182258945.png


如果传入的参数是女性,为2 的话。


User user=userMapper.getUserByIdWithResultString(2,“女”);


20190715182313239.png


会发现,动态 if 语句中的写法是:


<if test='sex=="男"'>
      u.id=b.userId
    </if>
    <if test='sex=="女"'>
      u.id=g.userId
    </if>


这是为了区分字符串的。 如果写成 if test=“sex==‘男’” ,那么会把男当成char 类型,会报 数字格式化异常 NumberFormatExeption。


当然,也可以 利用 toString() 进行替换。


<if test="sex eq '男'.toString()">
      u.id=b.userId
    </if>
<if test="sex eq '女'.toString()">
  u.id=g.userId
</if>


也可以利用


&quot; 


进行转义。


<if test="sex==&quot;男&quot;">
      u.id=b.userId
    </if>
    <if test="sex==&quot;女&quot;">
      u.id=g.userId
    </if>


上面扩充的是一个集合。 当然,通常是扩充一下 bean, 添加一些其余的属性。 如在Bean 中,添加其他属性。


四. Bean扩充 对象中属性。


有的时候,普通的对象是无法正确的封装数据展示的,常常会用bean 继承这个对象,然后扩充 这个对象,添加某些属性,达到数据封装的目的。


如 在BoyBean 和GirlBean 中添加其余的属性, 正常的属性,非集合形式。


在BoyBean 中添加 heightDesc 的属性。


/*关于身高的描述*/
  private String heightDesc;


在GirlBean 中添加weightDesc 的属性.


/*关于体重的描述*/
  private String weightDesc;


UserMapper.java 中接口:


public User getUserByIdWithResultBeanString(@Param(value="id") int id,
      @Param(value="sex") String sex);


UserMapper.xml sql语句:


<resultMap type="user" id="userResultMapWithDiscriminatorBean">
            <!-- 员工的基本属性。 -->
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <result property="age" column="age"/>
        <result property="description" column="description"/>
    <!-- 分类选择 -->
    <discriminator javaType="string" column="sex">
      <!-- 扩充的对象为 boyBean -->
      <case value="男" resultType="boyBean">
        <!-- 继续扩充其他的属性。 -->
        <result property="heightDesc" column="beanDesc"/>
      </case>
      <case value="女" resultType="girlBean">
        <result property="weightDesc" column="beanDesc"/>
      </case>
    </discriminator>
  </resultMap>
  <select id="getUserByIdWithResultBeanString" resultMap="userResultMapWithDiscriminatorBean">
    select distinct u.id as id,u.name as name,u.sex as sex,u.age as age,u.description as description,
    if(u.sex='男','男性身高描述','女性身高描述') as beanDesc
     from user u,boy_healthy b,girl_healthy g where u.id=#{id}
    and 
    <if test="sex==&quot;男&quot;">
      u.id=b.userId
    </if>
    <if test="sex==&quot;女&quot;">
      u.id=g.userId
    </if>
  </select>


测试方法:


  @Test
  public void getUserByIdWithResultBeanStringTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=userMapper.getUserByIdWithResultBeanString(2,"女");
    System.out.println("员工信息:"+user);
    if("男".equals(user.getSex())){
      BoyBean boyBean=(BoyBean)user;
      System.out.println("描述是:"+boyBean.getHeightDesc());
    }else{
      GirlBean girlBean=(GirlBean)user;
      System.out.println("描述是:"+girlBean.getWeightDesc());
    }
  }


控制台打印输出:


20190715182329859.png


如果是男性的话:


User user=userMapper.getUserByIdWithResultBeanString(1,"男");


20190715182339153.png


这就是discriminator 的基本用法。


谢谢!!!

相关文章
|
SQL Java 数据库连接
Mybatis之discriminator(鉴别器)详解
前言 最近干了一个工作是使用discriminator去写一个新的API,那么写这个新的API原因是什么呢?原因是这样的:我们的项目使用Mybatis,我们项目中有一个实体类叫做User,在User中还含有很多别的实体类,例如Role,Permission,Address等(有经验的肯定知道这种嵌套实体类的情况,使用和)。
3976 0
|
SQL Java 数据库连接
MyBatis的discriminator 鉴别器使用(十一)上
MyBatis的discriminator 鉴别器使用(十一)
248 0
MyBatis的discriminator 鉴别器使用(十一)上
|
Java 数据库连接 mybatis
MyBatis从入门到精通(十三):使用discriminator鉴别器映射
MyBatis从入门到精通(十三):使用discriminator鉴别器映射最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解鉴别器映射discriminator标签的简单用法。
866 0
|
1月前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
|
1月前
|
算法 Java 数据库连接
Spring+MySQL+数据结构+集合,Alibaba珍藏版mybatis手写文档
Spring+MySQL+数据结构+集合,Alibaba珍藏版mybatis手写文档
|
1月前
|
Java 数据库连接 Spring
Spring 整合mybatis
Spring 整合mybatis
28 2
|
6天前
|
Java 数据库连接 mybatis
在Spring Boot应用中集成MyBatis与MyBatis-Plus
在Spring Boot应用中集成MyBatis与MyBatis-Plus
37 5
|
6天前
|
Java 数据库连接 数据库
实现Spring Boot与MyBatis结合进行数据库历史数据的定时迁移
实现Spring Boot与MyBatis结合进行数据库历史数据的定时迁移
21 2
|
8天前
|
缓存 NoSQL Java
在 SSM 架构(Spring + SpringMVC + MyBatis)中,可以通过 Spring 的注解式缓存来实现 Redis 缓存功能
【6月更文挑战第18天】在SSM(Spring+SpringMVC+MyBatis)中集成Redis缓存,涉及以下步骤:添加Spring Boot的`spring-boot-starter-data-redis`依赖;配置Redis连接池(如JedisPoolConfig)和连接工厂;在Service层使用`@Cacheable`注解标记缓存方法,指定缓存名和键生成策略;最后,在主配置类启用缓存注解。通过这些步骤,可以利用Spring的注解实现Redis缓存。
26 2
|
1月前
|
Java 关系型数据库 数据库连接
MyBatis-Plus介绍及Spring Boot 3集成指南
MyBatis-Plus是一个MyBatis扩展工具,旨在简化Java开发中的CRUD操作。它具有无侵入性、低损耗、强大的CRUD功能、Lambda表达式支持、主键自动生成、ActiveRecord模式、全局操作和内置代码生成器等特点。在Spring Boot 3中集成MyBatis-Plus,需在pom.xml添加依赖,排除特定版本的mybatis-spring,并用@MapperScan注解指定Mapper接口路径。此外,还介绍了如何使用MyBatis-Plus代码生成器自动生成Mapper、Model、Service和Controller层代码,以加速开发。
77 2
MyBatis-Plus介绍及Spring Boot 3集成指南