mybatis 一對(duì)一 映射實(shí)體類(lèi)、嵌套查詢(xún)

一對(duì)一

在SysUser 類(lèi)中增加SysRole字段。
1、sql語(yǔ)句將role.role_name映射到role.roleName上。

2、還可以在XML 映射文件中配置結(jié)果映射。
<resultMap id="userRoleMap" type ="SysUser"〉
<id property="id" column="id"/>
<result property="userName" column="use_name"/>
<result property="userPassword" column="user_password" />
<result property="role.id" column ="role_id"/>
<result property="role.roleName" column="role_name"/>
<result property="role.createTime" column="role_create_time" jdbcType="TIMESTAMP"/>
</resultMap>
為了避免不同表中存在相同的列,如create_time, 在它前面增加了"role_"前綴。

3、MyBatis是支持resultMap繼承,因此可以簡(jiǎn)化上面的resultMap配置
<resultMap id= "userRoleMap" extends= "userMap" type= "SysUser">
<result property= "role.id" column="role_id "/>
<result property= "role.roleName" column= "role_name"/>
<result property= "role.createTime" column ="role_create_time" jdbcType= "TIMESTAMP"/>
</resultMap>

4、使用resultMap的association標(biāo)簽配置
<resultMap id= "userRoleMap" extends= "userMap" type= "SysUser">
<association property="role" columnPrefix="role_" javaType="SysRole">
<result property= "id" column="role_id "/>
<result property= "roleName" column= "role_name"/>
<result property= "createTime" column ="create_time" jdbcType= "TIMESTAMP"/>
</association>
</resultMap>
association標(biāo)簽的屬性property對(duì)應(yīng)實(shí)體類(lèi)中的屬性名,必填項(xiàng)。另外我們還配置了columnPrefix="role_",在寫(xiě)SQL的時(shí)候,和sys_role表相關(guān)的查詢(xún)列的別名都要有"role_"前綴,在內(nèi)部result配置column時(shí),需要去掉前綴。sql:r.id role_id, r.role_name role_role_name, r.create_time role_create_time。

5、使用association 配置時(shí)還可以使用resultMap 屬性配置成一個(gè)已經(jīng)存在的resultMap
<resultMap id= "roleMap" type = "SysRole">
<id property="id" column="id"/>
<result property="roleName" column= "role_name"/>
<result property="createTime" column="create_time" jdbcType = "TIMESTAMP"/>
</resultMap>
<resultMap id="userRoleMap" extends= "userMap" type="SysUser">
<association property="role" columnPrefix="role_" resultMap="roleMap"/>
</resultMap>
MyBatis 默認(rèn)會(huì)給 roleMap 添加當(dāng)前命名空間的前綴,代碼如下,test.mybatis.simple.mapper.UserMapper.roleMap。目前的 roleMap 是寫(xiě)在UserMapper.xml中的,其實(shí)更合理的位置應(yīng)該是在RoleMapper.xml中。將roleMap移動(dòng)到RoleMapper.xml中后,這里的userRoleMap就不能簡(jiǎn)單地指定為roleMap了,而是要修改為以下的樣子。
<resultMap id="userRoleMap" extends= "userMap" type="SysUser">
<association property="role" columnPrefix="role_" resultMap="test.mybatis.simple.mapper.RoleMapper.roleMap"/>
</resultMap>
上面的情況都是一種情況,這種方式的好處是減少數(shù)據(jù)庫(kù)查詢(xún)次數(shù),減輕數(shù)據(jù)庫(kù)的壓力。缺點(diǎn)是由于要在應(yīng)用服務(wù)器上將結(jié)果映射到不同的類(lèi)上,因此也會(huì)增加應(yīng)用服務(wù)器的壓力。當(dāng)一定會(huì)使用到嵌套結(jié)果,并且整個(gè)復(fù)雜的SQL執(zhí)行速度很快時(shí),建議使用這種方法。

還可以利用簡(jiǎn)單的SQL 通過(guò)多次查詢(xún)轉(zhuǎn)換為我們需要的結(jié)果,最后會(huì)將結(jié)果組合成一個(gè)對(duì)象。

<resultMap id = "userRoleMapSelect" extends = "userMap" type= "SysUser">
<association property="role" column="{id=role_id}" select="test.mybatis.simple.mapper.RoleMapper.selectRoleById" />
</resultMap>
<select id="selectUserAndRoleByIdSelect" resultMap="userRoleMapSelect">
select u.id, u.user_name, u.user_password, u.user_email, u.user_info,u.head_img, u.create_time,
ur.role_id
from sys_user u
join sys_user_role ur on u.id = ur.user_id
where u.id= #{id}
</select>
association 屬性 select :另一個(gè)查詢(xún)的id, MyBatis 會(huì)額外執(zhí)行這個(gè)查詢(xún)。
column :列名(或別名),將主查詢(xún)中列的結(jié)果作為嵌套查詢(xún)的參數(shù),配置方式如 column = {propl=coll , prop2=col2}。
fetchType :數(shù)據(jù)加載方式,可選值為lazy 和eager,分別為延遲加載和積極加載,這個(gè)配置會(huì)覆蓋全局的lazyLoadingEnabled 配置。

問(wèn)題:如果主查詢(xún)結(jié)果不是1條數(shù)據(jù),而是N條數(shù)據(jù),那就會(huì)出現(xiàn)N+1問(wèn)題。主SQL 會(huì)查詢(xún)一次,查詢(xún)出N 條結(jié)果,這N條結(jié)果要各自執(zhí)行一次查詢(xún),那就需要進(jìn)行N次查詢(xún)。

解決辦法:fetchType="lazy"
<resultMap id = "userRoleMapSelect" extends = "userMap" type= "SysUser">
<association property="role" column="{id=role_id}"
  select="test.mybatis.simple.mapper.RoleMapper.selectRoleById" fetchType="lazy"/>
</resultMap>
<select id="selectUserAndRoleByIdSelect" resultMap="userRoleMapSelect">
  select u.id, u.user_name, u.user_password, u.user_email, u.user_info,u.head_img, u.create_time,
  ur.role_id
from sys_user u
  join sys_user_role ur on u.id = ur.user_id
  where u.id= #{id}
</select >

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。