Configuração detalhada do resultMap de mybatis

1. Herança de classe de entidade de mybatis

Materiais de referência:
1. A classe de entidade em mybatis, a classe po herda outra classe po
2. As regras de configuração de resultMap em mybatis

A função da herança de classe de entidade é reduzir a reutilização de código em classes de entidade por meio de herança, como atributos em classes de entidade correspondentes a campos que freqüentemente aparecem em tabelas de banco de dados.

2. O atributo estende na tag resultMap de mybatis pode herdar a tag resultMap de outro namespace.

<mapper namespace="xuecheng.dao.ACVSFundTest">

    <resultMap id="res" extends="xuecheng.dao.BaseEntityTest.baseCol" type="xuecheng.domain.ACVSFund">
        <!--<id column="id" property="id"/>-->
        <result column="fund_code" property="fundCode"/>
        <result column="fund_name" property="fundName"/>
        <result column="gmt_Create" property="gmtCreate"/>

    </resultMap>

Herdar outro

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="xuecheng.dao.BaseEntityTest">
    <resultMap id="baseCol" type="xuecheng.domain.BaseEntity">
        <id column="id" property="id"/>
        <result column="username" property="username"/>
        <result column="age" property="age"/>
    </resultMap>

Um, o rótulo de atributo de mybatis

<resultMap>
        <constructor>
            <idArg/>
            <arg/>
        </constructor>
        <id/>
        <result/>
        <association property=""/>
        <collection property=""/>
        <discriminator javaType="">
            <case value=""></case>
        </discriminator>
</resultMap>

1.1, construtor de rótulo

Por padrão, mybatis usará a construção sem parâmetro na classe de entidade. Quando uma estrutura parametrizada é fornecida, nenhuma estrutura sem parâmetros não é fornecida na classe de entidade. Neste momento, é necessária uma configuração especial no resultMap

Suponha que a configuração na classe de entidade seja a seguinte:

public User(Long id, String username, String password, String address) {
    
    
        this.id = id;
        this.username = username;
        this.password = password;
        this.address = address;
    }

A configuração do arquivo de mapeamento é a seguinte:

<resultMap id="userResultMap" type="org.sang.bean.User">
        <constructor>
            <idArg column="id" javaType="long"/>
            <arg column="username" javaType="string"/>
            <arg column="password" javaType="string"/>
            <arg column="address" javaType="string"/>
        </constructor>
    </resultMap>

1.2, associação de rótulo

Os cenários aplicáveis ​​são um para um

Duas tabelas: 1, alias
Insira a descrição da imagem aqui

2 、 província
Insira a descrição da imagem aqui

O arquivo provinceMapper.xml é o seguinte

<mapper namespace="xuecheng.dao.ProvinceMapper">
    <resultMap id="provinceResultMapper" type="xuecheng.domain.Province">
        <id column="id" property="id"/>
        <!--association 中的属性property 是一对一中的属性名称,
                        column是指传入参数的id
                        select 是指执行的方法-->
        <association property="alias" column="id" select="xuecheng.dao.AliasMapper.findAliasByPid"/>
    </resultMap>
    <select id="getProvince" resultMap="provinceResultMapper">
      SELECT * FROM province
    </select>

</mapper>

O arquivo xml do alias é o seguinte:

<mapper namespace="xuecheng.dao.AliasMapper">
   <select id="findAliasByPid" parameterType="long" resultType="xuecheng.domain.Alias">
       SELECT * FROM alias WHERE pid=#{id}
   </select>
</mapper>

1.3, coleção de rótulos

 <resultMap id="provinceResultMapper" type="xuecheng.domain.Province">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!--association 中的属性property 是一对一中的属性名称,
                        column是指传入参数的id
                        select 是指执行的方法-->
        <!--<association property="alias" column="id" select="xuecheng.dao.AliasMapper.findAliasByPid"/>-->

        <!--<collection property="cities" column="id" select="xuecheng.dao.CityMapper.findById"/>-->
</resultMap>

1.4, discriminador de rótulo (algo semelhante à instrução switch)

    <resultMap id="provinceResultMapper" type="xuecheng.domain.Province">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!--association 中的属性property 是一对一中的属性名称,
                        column是指传入参数的id
                        select 是指执行的方法-->
        <!--<association property="alias" column="id" select="xuecheng.dao.AliasMapper.findAliasByPid"/>-->

        <!--collection的测试-->
        <!--<collection property="cities" column="id" select="xuecheng.dao.CityMapper.findById"/>-->


        <!--以下有点类似于switch语句-->
        <discriminator javaType="int" column="area">
            <case value="1" resultMap="noodleResultMap"></case>
            <case value="2" resultMap="riceResultMap"></case>
        </discriminator>

        <!--以下collection,不能查出准确数据。原因不知因为是啥?-->
        <!--<collection property="cities" ofType="xuecheng.domain.City">-->
            <!--<id column="id" property="id"/>-->
            <!--<result column="name" property="name"/>-->
            <!--<result column="pid" property="pid"/>-->

        <!--</collection>-->

    </resultMap>

1.5. Pontos a serem observados: carregamento lento de mybatis

1.5.1. Duas maneiras de abrir, maneira um (abrir globalmente, ou seja, para todas as consultas):

<settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

Nota: lazyLoadingEnabled é false por padrão, ou seja, não está ativado. agressivoLazyLoading é verdadeiro por padrão, ou seja, a consulta é realizada de acordo com o nível Macarrão e arroz estão no mesmo nível, ou seja, ao consultar macarrão, o arroz também é consultado. Se for falso, a consulta é realizada sob demanda. Quando você precisa consultar macarrão, não consultará arroz.

1.5.2, Método Dois (operar parcialmente)

Na tag de coleção e na tag de associação, use o atributo fetchType, eager representa o carregamento imediato e lazy representa o carregamento atrasado.

<association property="alias" column="id" select="org.sang.db.AliasMapper.findAliasByPid" fetchType="eager"/>
<collection property="cities" column="id" select="org.sang.db.CityMapper.findCityByPid" fetchType="lazy"/>

1.6, rótulo sql

Você pode encapsular apenas parte da instrução de consulta da seguinte maneira:

<sql id="selectAll3">
        id,username,address,password
</sql>

O método de referência é o seguinte:

<select id="getUser3" resultType="user">
        SELECT
        <include refid="selectAll3"/> FROM user
 </select>

Você também pode usar algumas variáveis ​​ao encapsular, da seguinte maneira:

<sql id="selectAll4">
        ${prefix}.id,${prefix}.username,${prefix}.address
</sql>

Observe que o método de referência da variável é o sinal $, não #. O método de referência é o seguinte:

<select id="getUser4" resultType="user" parameterType="string">
        SELECT
        <include refid="selectAll4">
            <property name="prefix" value="u"/>
        </include> FROM user u
</select>

Acho que você gosta

Origin blog.csdn.net/weixin_43983411/article/details/109846839
Recomendado
Clasificación