最近在重溫mybatis, 但是在做練習的時候發現一個問題;
查詢,簡單的查詢,返回之後發現結果中,只有id被映射了值,其他屬性都是null; 很納悶,爲什麼一個簡單的測試會出現這種問題;
一開始以爲是自己代碼或者SQL寫的有問題;結果都沒有問題 SQL在數據庫執行是有值的
ok,問題定位到了映射,
提前劇透 .是因爲下劃線和駝峯的原因,無法正確映射,詳細解釋看下面
查看xml,最開始是這樣寫的 ↓↓↓↓↓↓↓
1. 採用的resultType 原因就出現在這裏
<!-- 查詢關聯角色 -->
<select id="selectRoles" resultType="com.zl.box.bootmybaits.model.Role" parameterType="int">
select r.* from role r left join user_role u on r.ID = u.RID where u.UID= #{id}
</select>
爲何原因出現在resultType呢, 看下面實體類與數據庫表結構
public class Role implements Serializable {
/**
* 編號
*/
private Integer id;
/**
* 角色名稱
*/
private String roleName;
/**
* 角色描述
*/
private String roleDesc;
....省略get/set方法
}
數據庫中是採用下劃線連接單詞的,而實體類中是採用的駝峯規則;這就導致了 SQL 中r.* 明明返回了值 但是無法正確映射的問題;
所以以後遇到相同問題的小夥伴,採用resultMap吧,做一下映射關聯,這樣就可以解決問題了
解決方式如下:
--resultMap:
<resultMap id="BaseResultMap" type="com.zl.box.bootmybaits.model.Role">
<id column="ID" property="id" jdbcType="INTEGER"/>
<result column="ROLE_NAME" property="roleName" jdbcType="VARCHAR"/>
<result column="ROLE_DESC" property="roleDesc" jdbcType="VARCHAR"/>
</resultMap>
--SQL
<!-- 查詢關聯角色 -->
<select id="findRoleByUid" resultMap="BaseResultMap" parameterType="int">
select r.* from role r left join user_role u on r.ID = u.RID where u.UID= #{uid}
</select>
然後就OK了;
當然還有一種解決方式那就是,不要寫成r.*,
select r.* from role
寫成r.id id, r.role_name roleName, r.role_desc roleDesc 即可
select r.ID id,r.ROLE_DESC roleDesc, r.ROLE_NAME roleName from role r
Ok 最終的檢驗成果: 都成功的返回了值