MyBatis——ResultType

MyBatis——ResultType

一、查詢爲null問題

  1. 查看之前的數據庫的字段名
    1567008272118.png

  2. Java中的實體類設計

    public class User {
    
        private int id;  //id
        private String name;   //姓名
        private String password;   //密碼和數據庫不一樣!
        
        //構造
        //set/get
        //toString()
    }
    
  3. 接口

    //根據id查詢用戶
    User selectUserById(int id);
    
  4. mapper映射文件

    <select id="selectUserById" resultType="user">
        select * from user where id = #{id}
    </select>
    
  5. 測試

    @Test
    public void testSelectUserById() {
        SqlSession session = MybatisUtils.getSession();  //獲取SqlSession連接
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = mapper.selectUserById(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="selectUserById" 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="selectUserById" resultMap="UserMap">
    select id , name , pwd from user where id = #{id}
</select>

二、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>
    

如果世界總是這麼簡單就好了。但是肯定不是的,數據庫中,存在一對多,多對一的情況,我們之後會使用到一些高級的結果集映射,association,collection這些,我們將在之後講解,今天你們需要把這些知識都消化掉纔是最重要的!理解結果集映射的這個概念!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章