1. 程式人生 > 實用技巧 >Mybatis中實體類屬性和資料列之間對映的四種辦法

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;
}