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
2 、 província
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>