MyBatis 中鉴别器 Discriminator 的用法

如果我们的实体类中有继承关系,MyBatis如何根据实体类的type实例化为具体的子类了?MyBatis为我们提供了这项功能,需要使用鉴别器也就是Discriminator的用法。

这里先来介绍一些我们的业务场景,方面读者快速了解。假设我们有一个AbstractDatabase的抽象类用来记录数据库的一些元数据信息,比如用户名、密码、主机名、数据库类型等信息。但是每中数据库都有自己的一些行为,比如获取Connection,我们希望这些方法在AbstractDatabase的子类中实现。那么问题来了,我们如何将这些元数据从数据库取出的时候实例化对应的子类的?下面看MyBatis是如何配置的。

 <resultMap id="databaseMap" type="tabletools.util.database.db.AbstractDatabase">
        <result property="name" column="connection_name" jdbcType="VARCHAR"/>
        <result property="host" column="host_info" jdbcType="VARCHAR"/>
        <result property="port" column="port"  jdbcType="BIGINT"/>
        <result property="programName" column="program_name" jdbcType="VARCHAR"/>
        <result property="userName" column="username" jdbcType="VARCHAR"/>
        <result property="password" column="password" jdbcType="VARCHAR"/>
        <result property="description" column="description" jdbcType="VARCHAR"/>

        <discriminator javaType="String" column="storage_type">
            <case value="Hive" resultMap="hiveDatabaseMap"></case>
            <case value="Oracle" resultMap="oracleDatabaseMap"></case>
        </discriminator>

    </resultMap>

    <resultMap id="oracleDatabaseMap" type="tabletools.util.database.db.OracleDatabase">


    </resultMap>

    <resultMap id="hiveDatabaseMap" type="tabletools.util.database.db.HiveDatabase">


    </resultMap>

通过上面的配置读者应该大致了解用法了,我们只需要在discriminator标签中指定对应的column,然后使用case映射到对用的resultMap中,也就是我们后面定义的两个resultMap,一个是oracleDatabaseMap,另外一个是hiveDatabaseMap。MyBatis根据查询出来的数据自动实例化对应的子类,这样就不需要我们手动转换了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注