Mybatis中實體類屬性和數據列之間映射的四種辦法


Mybatis不像Hibernate中那么自動化,通過@Column注解或者直接使用實體類的屬性名作為數據列名,而是需要自己指定實體類屬性和 
數據表中列名之間的映射關系,這一點讓用慣了Hibernate的人很不習慣,所幸經過探索找到了建立映射關系的三種辦法,其中總也有比較 
簡單的。

首先先定義一個實體類,如下:

public class User implements Serializable {
    private Integer userId;
    private String userName;
    ......
}

1. 通過XML映射文件中的resultMap
這種方式是最常見的,類似如下:

<mapper namespace="data.UserMapper">
    <resultMap type="data.User" id="userResultMap">
        <!-- 用id屬性來映射主鍵字段 -->
        <id property="id" column="user_id"/>
        <!-- 用result屬性來映射非主鍵字段 -->
        <result property="userName" column="user_name"/>
    </resultMap>
</mapper>

通過里面的id標簽和result標簽來建立映射關系,由property和column分別指定實體類屬性和數據表的列名。

2. 通過注解@Results和@Result
這兩個注解是與XML文件中的標簽相對應的:

@Results對應resultMap
@Result對應result
這兩個注解是應用在方法的級別上的,也就是在mapper方法上,如下:

@Select("select * from t_user where user_name = #{userName}")
@Results(
        @Result(property = "userId", column = "user_id"),
        @Result(property = "userName", column = "user_name")
)
User getUserByName(@Param("userName") String userName);

缺點:

由於注解是針對方法的,對於Mapper中的每個操作數據庫的方法都必須有相同的注解完成映射關系的建立,導致很多的配置是重復的;
如果要避免配置重復的問題,可以采用在XML配置文件中配置這個resultMap,然后再@Result中通過id屬性引用這個resultMap, 
但是這樣感覺很麻煩(由於使用了兩種配置方式),不如直接使用基於XML的resultMap配置方式;
3. 通過屬性配置完成映射
使用者最陌生的是通過配置屬性來完成映射,Mybatis給我們提供了一種映射方式,如果屬性的命名是遵從駝峰命名法的,數據列名遵從下划線命名, 
那么可以使用這種方式,類似如下:

userName對應user_name;
userId對應user_id;
配置代碼如下:

SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
Configuration configuration = new Configuration();
configuration.setMapUnderscoreToCamelCase(true);
sqlSessionFactoryBean.setConfiguration(configuration);

4. 通過使用在SQL語句中定義別名完成映射
這種方式最直接,直接在SQL語句中建立別名來完成映射,如下:

@Select("select user_name as userName, user_id as userId from t_user where user_name = #{userName}")
User getUserByName(@Param("userName") String userName);


Restful 接口調用Json接收相關問題
1、背景:

在項目上使用SpringBoot為框架,調用第三方接口時,返回的參數類型,不符合標准的命名規則,需要進行處理,接受數據

2、現象:

調用第三方接口返回數據格式為方式均為小寫,如下:

{
           "rowid": "111111",
           "created": "2018-12-27 16:15:25",
           "createdby": "1111111",
           "lastupd": "2018-12-27 08:25:48",
           "lastupdby": "111111",
           "modificationnum": 1
        }
返回Json參數字段均為小寫,在接收時,需要按照標准的命名規則進行映射

3、解決辦法:

創建接收數據對象,生成Get\Set方法:,在Set方法上,加上@JsonProperty注解,

@JsonProperty 此注解用於屬性上,作用是把該屬性的名稱序列化為另外一個名稱,如把rowId屬性序列化為rowid,@JsonProperty("rowid")。

   private String rowId;
   private Date created;
   private String createdBy;
   private Date lastUpd;
private String lastUpdBy;

@JsonProperty("rowId")
   public String getRowId() {
       return rowId;
  }

   @JsonProperty("rowid")
   public void setRowId(String rowId) {
       this.rowId = rowId;
  }

   public Date getCreated() {
       return created;
  }
   @JsonDeserialize(using = CustomJsonDateDeserializer.class)
   public void setCreated(Date created) {
       this.created = created;
  }

   @JsonProperty("createdBy")
   public String getCreatedBy() {
       return createdBy;
  }

   @JsonProperty("createdby")
   public void setCreatedBy(String createdBy) {
       this.createdBy = createdBy;
  }

 


免責聲明!

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



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