Mybatis映射文件中數據庫表列名稱和POJO成員域的聯系


 

下面是Mybatis的SQL映射文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

    <select id="findbyname" resultType="user" parameterType="String"> SELECT * FROM user1 WHERE Login_name = #{name} </select>

</mapper>

上面的代碼表示查找出Login_name這一列等於輸入的String參數的記錄,並返回user類對象(pojo),可是mybatis又是如何將數據庫表中的列准確的賦值給user的對象呢?

細節仍然隱藏在命名規范之中,如果數據庫和列名和pojo中成員域名稱相同(pojo類成員域屬性建議均為小寫,並且忽略數據庫列名的大小寫),那么返回的user類中相應屬性將會被賦值數據庫中的值,否則等於默認值。如下圖所示。【下面password指錯了,大家理解就好😂,我暫時先不修改】

 

 

 

 

如果由於種種原因,pojo成員域名稱和數據庫中無法保持一致呢?這是就需要xml中ResultMap的幫助了,它可以自定義的將數據庫的某列和Pojo中某個成員與綁定到一起,從而替代ResultType,顯然這是非常必要的!

<!-- resultMap最終還是要將結果映射到pojo上,type就是指定映射到哪一個pojo -->
    <!-- id:設置ResultMap的id -->
    <resultMap type="com.dao.model.user" id="Usermap">
        <!-- 定義主鍵 ,非常重要。如果是多個字段,則定義多個id -->
        <!-- property:主鍵在pojo中的屬性名 -->
        <!-- column:主鍵在數據庫中的列名 -->
        <!如果pojo中沒有對應任何主鍵的屬性,則省略這部分-->
        <!id property="id" column="id" />

<!-- 定義普通屬性 --> <result property="username" column="Login_name" /> <result property="password" column="Password" /> <result property="nsex" column="Sex" /> </resultMap>
    <select id="findbyname" resultMap="Usermap" parameterType="String"> SELECT * FROM user1 WHERE Login_name = #{name} </select>

OK,大功告成。

 

可能還有小伙伴質疑之前沒有使用ResultMap也成功的在login.jsp成功打印出了用戶名和密碼啊,pojo中的username和數據庫中的Login_name名稱也不相同啊?這是怎么回事?其實這里是誤會了,LoginController.java中只是將@ModelAttribute映射的pojo放入到了Session中,就相當於是從你的輸入獲得的字符串,只不過經判斷后才將其打印出來,所以這個過程和數據庫一毛錢的關系沒有。至於和數據庫有關的是判斷這些字符串是否與數據庫中的相符,但是代碼中我們只判斷返回的對象是否為null以及密碼是否相符,並未判斷用戶名是否相符,因此名稱不一樣事實上對結果並沒有影響。當然雖然是流程邏輯上並沒有問題,但畢竟不符合代碼規范,還是建議各位將數據庫的列名稱與類的成員屬性名稱一致,或者使用ResultMap將兩者建立起映射綁定,以避免不必要的麻煩。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM