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

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

一. MyBatis的鉴别器


在resultMap 里面,除了 allocation 一对一,collection 一对多之外,还有一个discriminator 鉴别器, 可以根据类中某个属性的值不同,去执行不同的resultMap 结果。 如,User 类中有一个sex 性别的属性, 需要体检,那么就会有一个男生的健康表,一个女生的健康表, 对应user 表中的外键。 在查询的时候,会根据sex中的性别不同,去不同的表中查询结果。 如果女生去了解男生的健康表,那会出问题的,当然,如果男生去了解女生的健康表,也是会出现问题的, 所以这个时候,就需要discriminator 鉴别器了。


数据库表信息:


User表:

20190711085608781.png

男生健康表 boy_healthy:


20190715182142556.png


女生健康表 girl_healthy:


20190715182155787.png


POJO 对象类:

User.java


package com.yjl.pojo;
/**
 @author:yuejl
 @date: 2019年6月15日 上午11:11:02
 @Description Mybatis 使用的基本类 User
*/
public class User {
  /**
   * @param id id编号,自增
   * @param name 姓名
   * @param age 年龄
   * @param sex 性别
   * @param description 描述
   */
  private Integer id;
  private String name;
  private Integer age;
  private String sex;
  private String description;
  public User(){
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
  public String toString() {
    return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", description=" + description
        + "]";
  }
}


男生健康 Boy_Healthy.java


package com.yjl.pojo;
/**
@atuhor:yuejl
@Description: 男性健康表
*/
public class BoyHealthy {
  /**
   * @param id 编号
   * @param height 高度
   * @param weight 体重
   * @param xin 心
   * @param gan 肝
   * @param qianleixian 前列腺
   * @param description 描述
   */
  private int id;
  private Double height;
  private Double weight;
  private String xin;
  private String gan;
  private String qianleixian;
  private String description;
  //对于员工的处理
  private User userId;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public Double getHeight() {
    return height;
  }
  public void setHeight(Double height) {
    this.height = height;
  }
  public Double getWeight() {
    return weight;
  }
  public void setWeight(Double weight) {
    this.weight = weight;
  }
  public String getXin() {
    return xin;
  }
  public void setXin(String xin) {
    this.xin = xin;
  }
  public String getGan() {
    return gan;
  }
  public void setGan(String gan) {
    this.gan = gan;
  }
  public String getQianleixian() {
    return qianleixian;
  }
  public void setQianleixian(String qianleixian) {
    this.qianleixian = qianleixian;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
  public User getUserId() {
    return userId;
  }
  public void setUserId(User userId) {
    this.userId = userId;
  }
  @Override
  public String toString() {
    return "BoyHealthy [id=" + id +", height=" + height + ", weight=" + weight + ", xin="
        + xin + ", gan=" + gan + ", qianleixian=" + qianleixian + ", description=" + description + "]";
  }
}


女生健康表 Girl_Healthy.java


package com.yjl.pojo;
/**
@atuhor:yuejl
@Description: 女性健康表
*/
public class GirlHealthy {
  /**
   * @param id 编号
   * @param height 高度
   * @param weight 体重
   * @param xin 心
   * @param gan 肝
   * @param zigon 子宫
   * @param description 描述
   */
  private int id;
  private Double height;
  private Double weight;
  private String xin;
  private String gan;
  private String zigong;
  private String description;
  //引入员工的对象
  private User user;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public Double getHeight() {
    return height;
  }
  public void setHeight(Double height) {
    this.height = height;
  }
  public Double getWeight() {
    return weight;
  }
  public void setWeight(Double weight) {
    this.weight = weight;
  }
  public String getXin() {
    return xin;
  }
  public void setXin(String xin) {
    this.xin = xin;
  }
  public String getGan() {
    return gan;
  }
  public void setGan(String gan) {
    this.gan = gan;
  }
  public String getZigong() {
    return zigong;
  }
  public void setZigong(String zigong) {
    this.zigong = zigong;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
  public User getUser() {
    return user;
  }
  public void setUser(User user) {
    this.user = user;
  }
  @Override
  public String toString() {
    return "GirlHealthy [id=" + id +", height=" + height + ", weight=" + weight + ", xin="
        + xin + ", gan=" + gan + ", zigong=" + zigong + ", description=" + description + "]";
  }
}


需要将员工与健康表进行关联, 一对多的形式,为了不改变实体对象的结构,故最好是创建一个Bean, 用来接收。 当然,也可以用一对多的形式,但是不建议那样写。


男生健康Bean. Boy_Bean.


package com.yjl.pojo;
import java.util.List;
/**
@atuhor:yuejl
@Description: 类描述
*/
public class BoyBean extends User{
  private List<BoyHealthy> healthyList;
  public List<BoyHealthy> getHealthyList() {
    return healthyList;
  }
  public void setHealthyList(List<BoyHealthy> healthyList) {
    this.healthyList = healthyList;
  }
}


女生健康Bean. Girl_Bean.


package com.yjl.pojo;
import java.util.List;
/**
@atuhor:yuejl
@Description: 类描述
*/
public class GirlBean extends User{
  /**
   * 一个员工,可能对应多个不同的体检表。 当然,也可以是单个的。 原理都一样。
   */
  private List<GirlHealthy> healthyList;
  public List<GirlHealthy> getHealthyList() {
    return healthyList;
  }
  public void setHealthyList(List<GirlHealthy> healthyList) {
    this.healthyList = healthyList;
  }
}


二. 根据员工编号 嵌套select 查询结果


UserMapper.java 接口:


public User getUserById(int id);


UserMapper.xml sql语句:


    <resultMap type="user" id="userResultMapWithDiscriminator">
    <!-- 员工的基本属性。 -->
    <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">
      <!--根据不同的值,执行不同的resultMap-->
      <case value="男" resultMap="boyHealthyMap"></case>
      <case value="女" resultMap="girlHealthyMap"></case>
    </discriminator>
  </resultMap>
  <select id="getUserById" parameterType="int" resultMap="userResultMapWithDiscriminator">
    select * from user where id=#{id}
  </select>
  <!-- 关于男性的鉴别器 -->
  <resultMap type="boyBean" id="boyHealthyMap" extends="userResultMapWithDiscriminator">
    <collection property="healthyList" ofType="boyHealthy" javaType="ArrayList"
    column="id" select="com.yjl.mapper.BoyHealthyMapper.findHealthyByUserId">
    </collection>
  </resultMap>
  <!-- 关于女性的鉴别器 -->
  <resultMap type="girlBean" id="girlHealthyMap" extends="userResultMapWithDiscriminator">
    <collection property="healthyList" ofType="girlHealthy" javaType="ArrayList"
    column="id" select="com.yjl.mapper.GirlHealthyMapper.findHealthyByUserId">
    </collection>
  </resultMap>


那么对应 就有一个

BoyHealthyMapper.java 提供了一个接口:


public List<BoyHealthy> findHealthyByUserId(@Param(value="userId") int userId);


BoyHealthyMapper.xml 的sql语句:


<?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="com.yjl.mapper.BoyHealthyMapper">
  <resultMap type="boyHealthy" id="boyHealthyMap">
    <id property="id" column="id"/>
    <result property="height" column="height"/>
    <result property="weight" column="weight"/>
    <result property="xin" column="xin"/>
    <result property="gan" column="gan"/>
    <result property="qianleixian" column="qianleixian"/>
    <result property="description" column="description"/>
  </resultMap>
  <select id="findHealthyByUserId" parameterType="int" resultMap="boyHealthyMap">
    select * from boy_healthy t where t.userId=#{userId}
  </select>
</mapper>


GirlHealthyMapper.java 也提供了一个接口:


public List<GirlHealthy> findHealthyByUserId(@Param(value="userId") int userId);


GirlHealthyMapper.xml 的sql语句:


<mapper namespace="com.yjl.mapper.GirlHealthyMapper">
  <resultMap type="girlHealthy" id="girlHealthyMap">
    <id property="id" column="id"/>
    <result property="height" column="height"/>
    <result property="weight" column="weight"/>
    <result property="xin" column="xin"/>
    <result property="gan" column="gan"/>
    <result property="zigong" column="zigong"/>
    <result property="description" column="description"/>
  </resultMap>
  <select id="findHealthyByUserId" parameterType="int" resultMap="girlHealthyMap">
    select * from girl_healthy t where t.userId=#{userId}
  </select>
</mapper>


测试方法:


  @Test
  public void getByIdTest(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=userMapper.getUserById(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));
    }
  }


运行结果如下:


20190715182224660.png


如果传入的是女性的id, 如2

User user=userMapper.getUserById(2);


20190715182243401.png


当然,也有对应的嵌套result 的形式。

相关文章
|
SQL Java 数据库连接
Mybatis之discriminator(鉴别器)详解
前言 最近干了一个工作是使用discriminator去写一个新的API,那么写这个新的API原因是什么呢?原因是这样的:我们的项目使用Mybatis,我们项目中有一个实体类叫做User,在User中还含有很多别的实体类,例如Role,Permission,Address等(有经验的肯定知道这种嵌套实体类的情况,使用和)。
4135 0
|
SQL Java 数据库连接
MyBatis的discriminator 鉴别器使用(十一)下
MyBatis的discriminator 鉴别器使用(十一)
351 0
MyBatis的discriminator 鉴别器使用(十一)下
|
Java 数据库连接 mybatis
MyBatis从入门到精通(十三):使用discriminator鉴别器映射
MyBatis从入门到精通(十三):使用discriminator鉴别器映射最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解鉴别器映射discriminator标签的简单用法。
908 0
|
30天前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
91 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
30天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
52 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
267 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
30天前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
15 0
mybatis使用二:springboot 整合 mybatis,创建开发环境
|
1月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
37 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学