Mybatis——實體類屬性名和數據庫字段名不同時的解決辦法


在使用Mybatis來持久化數據庫時,有時候會碰到數據庫中表中的字段與java實體類中屬性名不一致的情況,在這種情況下Mybatis是不能完成字段的自動映射的。而通常情況下,數據庫及實體類是不應該被改的的。所以要在不改變數據庫以及實體類的情況下解決這個問題,下面是解決該問題的三種方式:

java實體類:

public class User
{
    private Long id;
    private String userName;
    private String passWord;
    /**
     * ...
     * get,set方法不再列出
     * ...
     * */
}

 

1.既然是因為名字不一致而導致Mybatis不能完成自動映射,那么就可以將兩者的名字想辦法保持一致,為查詢出的數據庫字段起個別名就可以,實例如下:

<select id="selectUserById" resultType="User">
        select 
        id,
        user_name as userName,<!--不用在意大小寫,Mybatis會先轉換成大寫再進行匹配  -->
        user_password as userPassword,
        from user
        where id = #{id}
</select>

 


2.另一種解決名字不一致的方式是事先指定映射關系,這樣Mybatis也能自動完成映射。Mybatis提供了resultMap可以指定映射關系,示例如下:

  type 屬性:指定實體類的全限定類名
  id 屬性:給定一個唯一標識,是給查詢 select 標簽引用用的。
<resultMap type="User" id="UserResultMap">
      id 標簽:用於指定主鍵字段
      result 標簽:用於指定非主鍵字段
      column 屬性:用於指定數據庫列名
      property 屬性:用於指定實體類屬性名稱
        <id column="id" property="id"/>
        <result column="user_name" property="userName"/>
        <result column="user_password" property="userPassword"/>
</resultMap>
    
    
<select id="selectUserById" resultMap="UserResultMap">
        select 
        id,
        user_name,
        user_password,
        from user
        where id = #{id}
</select>

 


注意:
1.使用resultMap時,在select語句配置中,要有resultMap替換原來的resultType。

2.resultMap中的column要與查詢到的字段名一致,property要與實體類的屬性一致。

3.在通常情況下,java中的實體類中的屬性一般是采用駝峰命名命名的,而數據庫中表的字段則用下划線區分字母。在這種情況下,Mybatis提供了一個全局屬性mapUnderscoreToCamelCase來解決兩者名字不一致的問題。

<settings>
    <!--其他配置...  -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!--其他配置...  -->
</settings>

 

注意:因為該屬性是全局屬性,所以需要配置在Mybatis的配置文件中,而不是Mapper.xml映射文件中。


免責聲明!

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



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