我們之前的Users表,有三個字段:
Users.png
我的實體類有三個名字相同的屬性:
User
但是在平時的開發中,我們表中的字段名和表對應實體類的屬性名稱不一定都是完全相同的,當名字不相同的時候就會引發一些問題。(比如我們的表中字段名都有一個前綴三個字段分別為user_id,user_name,user_age)
下面我們以userMapper.xml中的getUser為例:
<!-- 根據id查詢得到一個User對象,使用這個查詢是查詢不到我們想要的結果的,這主要是因為實體類的屬性名和數據庫的字段名對應不上的原因,因此無法查詢出對應的記錄-->
<select id="getUser" parameterType="int"
resultType="pers.cherish.entity.User">
select * from users where id=#{id}
</select>
這樣我們用之前的測試類TestCRUDByXmlMapper
測試,我們會發現返回了一個null,當實體類中的屬性名和表中的字段名不一致時,使用MyBatis進行查詢操作時無法查詢出相應的結果的問題以及針對問題采用的兩種辦法:
解決辦法一:
通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致,這樣就可以表的字段名和實體類的屬性名一一對應上了,這種方式是通過在sql語句中定義別名來解決字段名和屬性名的映射關系的。
修改userMapper.xml對應的配置信息
<!--
根據id查詢得到一個user對象,使用這個查詢是可以正常查詢到我們想要的結果的,這是因為我們將查詢的字段名都起一個和實體類屬性名相同的別名,這樣實體類的屬性名和查詢結果中的字段名就可以一一對應上-->
<select id="getUser2" parameterType="int"
resultType="pers.cherish.entity.User">
select user_id id, user_name name, user_age age from users where user_id=#{id}
</select>
解決辦法二:
通過<resultMap>來映射字段名和實體類屬性名的一一對應關系。這種方式是使用MyBatis提供的解決方式來解決字段名和屬性名的映射關系的。
<!--
根據id查詢得到一個User對象,使用這個查詢是可以正常查詢到我們想要的結果的,這是因為我們通過<resultMap>映射實體類屬性名和表的字段名一一對應關系
-->
<select id="getUser3" parameterType="int" resultMap="userResultMap">
select * from users where user_id=#{id}
</select>
<!--通過<resultMap>映射實體類屬性名和表的字段名對應關系 -->
<resultMap type="pers.cherish.entity.User" id="userResultMap">
<!-- 用id屬性來映射主鍵字段 -->
<id property="id" column="user_id"/>
<!-- 用result屬性來映射非主鍵字段 -->
<result property="name" column="user_name"/>
<result property="age" column="user_age/>
</resultMap>
以上兩種方式都可以解決,實體類屬性和表列名不一致的問題