Mybatis學習筆記來自B站狂神說Java Mybatis系列視訊~
視訊連結:https://www.bilibili.com/video/BV1NE411Q7Nx
純個人手打,可能會有錯誤,歡迎指正交流探讨~
個人郵箱:[email protected]
4、ResultMap結果集映射
要解決的問題:屬性名和字段名不一緻
環境:建立一個項目,将之前的項目拷貝過來
1. 查詢為null的問題
-
檢視之前的資料庫字段名
id,username,pwd
- java實體類設計
public class User { private Integer id; private String username; private String password;//如果與資料庫對應的話,應該是pwd,這裡改為password
- 接口
- mapper映射檔案
<!--根據id查詢使用者--> <select id="getUserbyid" parameterType="int" resultType="com.gang.pojo.User"> select * from mybatis.user where id=#{id}; </select>
- 測試
@Test public void test2(){ SqlSession sqlSession=MybatisUtils.getSqlSession(); UserDao userDao=sqlSession.getMapper(UserDao.class); User user=userDao.getUserbyid(1); System.out.println(user); sqlSession.close(); }
- 結果:
- User{id=1, username=‘zhangsan’, pwd=‘null’}
- 查詢結果password為空,說明出現了問題。
- 分析:
-
select * from user where id = #{id} 可以看做
select id,name,pwd from user where id = #{id}
- 而mybatis會根據這些查詢的列名(會将列名轉化為小寫,資料庫不區分大小寫) , 去對應的實體類中查找相應列名的set方法設值 , 由于找不到setPwd() , 是以password傳回null ; 【自動映射】
-
2. 解決方案
- 方案一:在sql語句中為列名指定别名,别名和實體類的屬性名一緻
<!--根據id查詢使用者-->
<select id="getUserbyid" parameterType="int" resultType="com.gang.pojo.User">
select id,name,pwd as password from mybatis.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="selectUserById" resultMap="UserMap">
<!-- 在這裡通過一個resultMap="UserMap" 結果集映射實作>
select id , name , pwd from user where id = #{id}
</select>
3. ResultMap
自動映射
-
元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBCresultMap
資料提取代碼中解放出來。ResultSets
- 實際上,在為一些比如連接配接的複雜語句編寫映射代碼的時候,一份
能夠代替實作同等功能的長達數千行的代碼。resultMap
-
ResultMap 的設計思想是,對于簡單的語句根本不需要配置顯式的結果映射,而對于複雜一點的語句隻需要描述它們的關系就行了。
你已經見過簡單映射語句的示例了,但并沒有顯式指定
。比如:resultMap
<select id="selectUserById" resultType="map">
select id , name , pwd
from user
where id = #{id}
</select>
上述語句隻是簡單地将所有的列映射到
HashMap
的鍵上,這由
resultType
屬性指定。雖然在大部分情況下都夠用,但是 HashMap 不是一個很好的模型。你的程式更可能會使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 對象)作為模型。
ResultMap
最優秀的地方在于,雖然你已經對它相當了解了,但是根本就不需要顯式地用到他們。
手動映射
- 傳回值類型為ResultMap
<select id="selectUserById" resultMap="UserMap"> select id , name , pwd 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>