天天看點

Mybatis筆記(四) Mybatis之ResultMap結果集映射

Mybatis學習筆記來自B站狂神說Java Mybatis系列視訊~

視訊連結:https://www.bilibili.com/video/BV1NE411Q7Nx

純個人手打,可能會有錯誤,歡迎指正交流探讨~

個人郵箱:[email protected]

4、ResultMap結果集映射

​ 要解決的問題:屬性名和字段名不一緻

​ 環境:建立一個項目,将之前的項目拷貝過來

1. 查詢為null的問題

  1. 檢視之前的資料庫字段名

    id,username,pwd

  2. java實體類設計
    public class User {
        private Integer id;
        private String username;
        private String password;//如果與資料庫對應的話,應該是pwd,這裡改為password
               
  3. 接口
  4. mapper映射檔案
    <!--根據id查詢使用者-->
    <select id="getUserbyid" parameterType="int" resultType="com.gang.pojo.User">
        select * from mybatis.user where id=#{id};
    </select>
               
  5. 測試
    @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();
    }
               
  6. 結果:
    1. User{id=1, username=‘zhangsan’, pwd=‘null’}
    2. 查詢結果password為空,說明出現了問題。
  7. 分析:
    1. select * from user where id = #{id} 可以看做

      select id,name,pwd from user where id = #{id}

    2. 而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

自動映射

  • resultMap

    元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC

    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

最優秀的地方在于,雖然你已經對它相當了解了,但是根本就不需要顯式地用到他們。

手動映射

  1. 傳回值類型為ResultMap
    <select id="selectUserById" 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>