`
Copperfield
  • 浏览: 261154 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25214
社区版块
存档分类

IBatis: Discriminator Column Example – Inheritance Mapping(Ibatis中的继承映射)

 
阅读更多

继承映射介绍-iBATIS supports inheritance hierarchies by using a special mapping called a discriminator. Using a discriminator you can determine the type of class to be instantiated based on a value in the database. The discriminator is a part of the ResultMap and works much like a switch statement.

 

问题:对于Manager和Developer来说,他们都是Employee类的子类,且都有自己特殊的属性,Manager有managerId和info属性,developer有developerId和project属性。在使用IBATIS查询一批Employee类时,如何通过自动映射通过判断Employee_type取得他们各自的属性?

 

 1、pojo beans

2、sqlMap

<sqlMap namespace="Employee">
	<typeAlias alias="Employee" type="model.Employee" />



	<resultMap id="resultEmployee" class="Employee">
		<result property="id" column="id" />
		<result property="name" column="name" />
		<discriminator javaType="int" column="employee_type">
			<subMap value="1" resultMap="managerMap" />
			<subMap value="2" resultMap="developerMap" />
		</discriminator>
<!-- 如果employee_type的值是1,则对应managerMap的映射。如果是2,则对应developerMap的映射。-->
	</resultMap>

	<resultMap id="managerMap" class="model.Manager" extends="resultEmployee">
		<result property="managerId" column="manager_id" />
		<result property="info" column="info" />
	</resultMap>

	<resultMap id="developerMap" class="model.Developer" extends="resultEmployee">
		<result property="developerId" column="developer_id" />
		<result property="project" column="product" />
	</resultMap>

	<select id="getAllEmployees" resultMap="resultEmployee">
		SELECT id, name ,employee_type, manager_id, info, developer_id,
		product FROM employee E left join manager M on M.employee_id =
		E.id left join developer D on D.employee_id = E.id
	</select>

</sqlMap>

 3、test code

public class TestSqlMap {
  private static SqlMapClient sqlMapClient = null;
  @Before
  public void loadFile() {
    String resource = "sqlMap/sql-map-config.xml";
    try {
      Reader reader = Resources.getResourceAsReader(resource);

      sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
      reader.close();
    } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  
  @Test
  public void testSql(){
    try {
      List<Employee> list =  sqlMapClient.queryForList("getAllEmployees",null);
    
      
      for (Employee employee : list){
        System.out.println(employee.toString());
      }
      
      assertEquals(5, list.size());
    } catch (SQLException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

 

4、test result:

Employee ID = 1 Name = Kate Manager ID = 1 Info = info Kate
Employee ID = 4 Name = James Manager ID = 2 Info = info James
Employee ID = 5 Name = Susan Developer ID = 3 Project = web
Employee ID = 2 Name = Josh Developer ID = 1 Project = web
Employee ID = 3 Name = Peter Developer ID = 2 Project = desktop

修改sqlMap,去掉managerMap的extends="resultEmployee"和developerMap的extends="resultEmployee" :

Employee ID = 0 Name = null Manager ID = 1 Info = info Kate
Employee ID = 0 Name = null Manager ID = 2 Info = info James
Employee ID = 0 Name = null Developer ID = 3 Project = web
Employee ID = 0 Name = null Developer ID = 1 Project = web
Employee ID = 0 Name = null Developer ID = 2 Project = desktop

5、在以上的例子中,子映射(sub map)对应这标准的结果映射,如果discriminator 找到了一个值去匹配subMap ,则父结果集的映射将失效,参加第四点的修改后的输出,除非子映射明确的扩展了父映射(extends)。

如果discriminator 找不到值去匹配subMap,则使用父结果映射:

Employee ID = 1 Name = Kate
Employee ID = 4 Name = James
Employee ID = 5 Name = Susan
Employee ID = 2 Name = Josh
Employee ID = 3 Name = Peter

  • 大小: 6.5 KB
2
1
分享到:
评论
1 楼 learnworld 2012-04-08  
不错,很清晰!

相关推荐

    maven整合ibatis的简单例子

    在Java开发中,Maven和iBatis是两个非常重要的工具。Maven是一个项目管理和综合工具,它帮助开发者管理依赖、构建项目,并提供了一种标准化的项目结构。而iBatis则是一个SQL映射框架,它将SQL语句与Java代码分离,...

    spring-mvc+iBatis:maven

    Spring MVC 和 iBatis 是两个在 Java Web 开发中广泛使用的框架。Spring MVC 作为 Model-View-Controller 模式的实现,负责处理用户请求并返回响应,而 iBatis 则是一个轻量级的持久层框架,它简化了 SQL 的操作。在...

    iBATIS-SqlMaps,ibatis映射文件

    在映射文件中,iBATIS提供了强大的映射机制,比如自动类型转换、结果集嵌套处理、自动生成主键等。例如,和可以将查询结果的列名映射到Java对象的属性上,&lt;discriminator&gt;元素可以根据特定列的值来决定如何映射结果...

    ibatis Example使用

    根据提供的文件信息,我们可以从中提炼出与ibatis及其Example特性相关的知识点。以下是对这些知识点的详细阐述: ### 1. **ibatis简介** ibatis(现称为MyBatis)是一种支持普通SQL查询、存储过程及高级映射的优秀...

    Ibatis一对一映射提示

    在Java Web开发中,iBATIS(现在被称为MyBatis)是一个流行的持久层框架,它提供了灵活的SQL映射机制,使得开发者可以更方便地操作数据库。本篇将深入讲解iBATIS一对一映射的概念、配置及应用,帮助你更好地理解和...

    ibatis映射文件信息,接口对应

    标题和描述中提到的“ibatis映射文件信息,接口对应”是指Ibatis如何通过映射文件与Java接口进行关联,实现数据操作的封装和调用。 首先,我们需要了解Ibatis的核心组成部分:SqlMapConfig.xml配置文件、Mapper接口...

    ibatis 的关系映射

    标题 "ibatis 的关系映射" 指的是在使用 iBATIS(一款优秀的Java持久层框架)时,如何处理数据库中的对象关系映射(ORM)问题。在Java应用程序中,iBATIS 提供了一种方便的方式来将数据库操作与业务逻辑解耦,使得...

    ibatis 一对多 多对多完整映射

    在IT行业中,数据库关系映射是开发Web应用时不可或缺的一部分,特别是对于ORM(对象关系映射)框架如iBATIS(现在称为MyBatis)。本文将深入探讨如何在iBATIS中实现一对多和多对多的关系映射,并提供相关的源码分析...

    ibatis one to many mapping

    标题 "iBatis 一对多映射" 描述中提到的是关于 iBatis 框架下的一对多关系映射。iBatis 是一个基于 Java 的持久层框架,它允许程序员将 SQL 查询与 Java 代码相结合,以实现更灵活的数据访问。在数据库关系模型中,...

    ibatis总配置和映射配置.txt

    此文本主要是关于ibatis总配置和映射配置和一些需要主要的细节。

    ibatis2.3.4.rar

    1. 配置Ibatis:首先,你需要在项目中引入Ibatis的jar包,并设置相应的配置文件(如mybatis-config.xml),配置数据源、事务管理器以及Mapper扫描路径。 2. 创建SQL映射文件:在项目的资源目录下创建SQL映射文件,...

    ibatis 一对多关系映射

    在IT行业中,数据库关系映射是数据访问层的重要部分,特别是在使用ORM(对象关系映射)框架时。Ibatis,作为一个轻量级的Java ORM框架,提供了强大的功能来处理复杂的数据映射,其中包括一对多的关系映射。在这个...

    IBatisDemo:Ibatis的一个简单Demo

    这个“IBatisDemo”项目是一个简化的示例,旨在展示如何在.NET环境中集成和使用IBatis。在这个Demo中,我们将深入探讨IBatis的核心概念、配置、以及如何与数据库进行交互。 **1. IBatis .NET 简介** IBatis .NET 是...

    深入分析 iBATIS 框架之系统架构与映射原理

    2. **结果集映射**:iBATIS 使用 `&lt;resultMap&gt;` 元素来定义结果集的映射规则,将数据库查询结果中的列与 Java 对象的属性对应起来。例如: ```xml &lt;result property="id" column="USER_ID"/&gt; ...

    iBATIS-SqlMaps中文教程集合

    iBATIS,全称为“Java SQL Mapping Framework”,是由Apache软件基金会开发的一款优秀的开源持久层框架。这个框架的主要目的是简化Java应用程序与数据库之间的交互,通过XML或注解方式将SQL语句映射到Java方法,实现...

    ibatis总结 ibatis ibatis ibatis ibatis

    Ibatis 是一款轻量级的Java持久层框架,它允许开发者将SQL语句与Java代码分离,从而使得数据库访问更加灵活、易于维护。本篇文章将深入探讨Ibatis的核心概念、最佳实践以及与其他框架如Struts和Spring的整合。 1. ...

    Mygeneration_1309_20081006—IBatis_SQL映射+实体模板

    4. **SQL Mapping映射文件**:在IBatis.NET中,SQL Mapping文件是XML格式的,它定义了SQL语句、存储过程以及它们与实体类之间的映射关系。通过这种方式,开发者可以在不修改业务代码的情况下,调整数据库查询逻辑。 ...

    ibatis demo,ibatis例子,ibatis示例

    Ibatis的出现,解决了传统JDBC中手动编写SQL和结果集映射的繁琐工作,提供了更加灵活的数据访问接口。 在"ibatis demo"中,我们通常会看到以下核心概念和知识点: 1. **配置文件**:Ibatis的配置文件(mybatis-...

    ibatis官方中文文档

    《iBatis官方中文文档》是开发者们学习和掌握iBatis框架的重要参考资料,它包含了iBatis的详细使用说明和一系列技术要点。iBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在配置文件中,极大地提高了...

Global site tag (gtag.js) - Google Analytics