1、mybatis的实体类继承
参考资料:
1、mybatis中实体类,po类继承另一个po类的情况
2、mybatis中resultMap配置细则
实体类的继承的作用是:可以通过继承减少代码在实体类中的重复使用,比如数据库的表中常常出现的字段所对应的实体类中的属性。
2、mybatis的resultMap标签中的属性extends,可以继承另外一个命名空间的resultMap标签。
<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>
继承另一个
<!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>
一、mybatis的属性标签
<resultMap>
<constructor>
<idArg/>
<arg/>
</constructor>
<id/>
<result/>
<association property=""/>
<collection property=""/>
<discriminator javaType="">
<case value=""></case>
</discriminator>
</resultMap>
1.1、标签constructor
默认情况下,mybatis会使用实体类中的无参构造。当提供一个有参构造后,实体类中就不会提供无参构造。这时就需要在resultMap中特殊配置
假设实体类中的配置如下:
public User(Long id, String username, String password, String address) {
this.id = id;
this.username = username;
this.password = password;
this.address = address;
}
映射文件的配置如下:
<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、标签association
适用的场景是一对一的
两张表:1、alias
2、province
provinceMapper.xml文件如下
<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>
alias的xml文件如下:
<mapper namespace="xuecheng.dao.AliasMapper"> <select id="findAliasByPid" parameterType="long" resultType="xuecheng.domain.Alias"> SELECT * FROM alias WHERE pid=#{id} </select> </mapper>
1.3、标签collection
<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、标签 discriminator (有点类似于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、注意点:mybatis的懒加载
1.5.1、开启的两种方式,方式一(全局开启,即对所有查询):
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
说明:lazyLoadingEnabled默认是false,即不开启。aggressiveLazyLoading默认是true,即按照层级来进行查询,noodle和rice是同一级,即查询noodle的同时,rice也查询。如果是false,即是按需进行查询,需求查询noodle的时候,就不去查询rice了。
1.5.2、方式二(对局部进行操作)
在collection标签和association标签中,使用fetchType属性,eager代表立即加载,lazy代表延迟加载。
<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、sql标签
可以只封装一部分查询语句,如下:
<sql id="selectAll3">
id,username,address,password
</sql>
引用方式如下:
<select id="getUser3" resultType="user">
SELECT
<include refid="selectAll3"/> FROM user
</select>
还可以在封装的时候使用一些变量,如下:
<sql id="selectAll4">
${prefix}.id,${prefix}.username,${prefix}.address
</sql>
注意变量引用方式是$符号哦,不是#,引用方式如下:
<select id="getUser4" resultType="user" parameterType="string">
SELECT
<include refid="selectAll4">
<property name="prefix" value="u"/>
</include> FROM user u
</select>