5、MyBatis初級教程之ResultMap
阿新 • • 發佈:2020-07-20
6、ResultMap
要解決的問題:屬性名和欄位名不一致
1、檢視之前的資料庫的欄位名
2、Java中的實體類設計
public class User {
private int id; //id
private String name; //姓名
private String password; //密碼和資料庫不一樣!
//構造
//set/get
//toString()
}
3、介面
//根據id查詢使用者
User getUserByIdMap(int id);
4、mapper對映檔案
<select id="getUserByIdMap" resultType="user"> select * from user where id = #{id} </select>
5、測試
@Test
public void testgetUserByIdMap() {
SqlSession session = MybatisUtils.getSession(); //獲取SqlSession連線
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserByIdMap(1);
System.out.println(user);
session.close();
}
結果:
- User{id=1, name='張三', password='null'}
- 查詢出來發現 password 為空 . 說明出現了問題!
分析:
-
select * from user where id = #{id} 可以看做
select id,name,pwd from user where id = #{id}
-
mybatis會根據這些查詢的列名(會將列名轉化為小寫,資料庫不區分大小寫) , 去對應的實體類中查詢相應列名的set方法設值 , 由於找不到setPwd() , 所以password返回null ; 【自動對映】
解決方案
方案一:為列名指定別名 , 別名和java實體類的屬性名一致 .
<select id="getUserByIdMap" resultType="User"> select id , name , pwd as password from user where id = #{id} </select>
方案二:使用結果集對映->ResultMap 【推薦】
<resultMap id="UserMap" type="User">
<!-- id為主鍵 -->
<id column="id" property="id"/>
<!-- column是資料庫表的列名 , property是對應實體類的屬性名 -->
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserByIdMap" resultMap="UserMap">
select id , name , pwd from user where id = #{id}
</select>
ResultMap
自動對映
resultMap
元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBCResultSets
資料提取程式碼中解放出來。- 實際上,在為一些比如連線的複雜語句編寫對映程式碼的時候,一份
resultMap
能夠代替實現同等功能的長達數千行的程式碼。 - ResultMap 的設計思想是,對於簡單的語句根本不需要配置顯式的結果對映,而對於複雜一點的語句只需要描述它們的關係就行了。
你已經見過簡單對映語句的示例了,但並沒有顯式指定 resultMap
。比如:
<select id="getUserByIdMap" resultType="map">
select id , name , pwd
from user
where id = #{id}
</select>
上述語句只是簡單地將所有的列對映到 HashMap
的鍵上,這由 resultType
屬性指定。雖然在大部分情況下都夠用,但是 HashMap 不是一個很好的模型。你的程式更可能會使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 物件)作為模型。
ResultMap
最優秀的地方在於,雖然你已經對它相當瞭解了,但是根本就不需要顯式地用到他們。
手動對映
1、返回值型別為resultMap
<select id="getUserByIdMap" resultMap="UserMap">
select id , name , pwd from user where id = #{id}
</select>
2、編寫resultMap,實現手動對映!
<resultMap id="UserMap" type="User">
<!-- id為主鍵 -->
<id column="id" property="id"/>
<!-- column是資料庫表的列名 , property是對應實體類的屬性名 -->
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
如果世界總是這麼簡單就好了。但是肯定不是的,資料庫中,存在一對多,多對一的情況,我們之後會使用到一些高階的結果集對映,association,collection這些,我們將在之後講解,今天你們需要把這些知識都消化掉才是最重要的!理解結果集對映的這個概念!