MyBatis 无论是 resultType 还是 resultMap 都需要一个实体
例如我们这样一个SQL
<mapper namespace="com.savorgames.dao.MemberMapper">
<select id="test" resultType="com.savorgames.domain.Member">
SELECT username,password FROM "user";
</select>
</mapper>
Member实体
public class Member {
private int uid;
private String username;
private String password;
private String email;
private String nickname;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
结果集映射Mapper
List<Member>
现在问题来了,做restful服务器时候,将实体转换成 json 会出现大量空值 并暴露数据库表字段,传输的json也相对变大了
例如:
[{"uid":0,"username":"阿斯达","password":null,"email":null,"nickname":null},{"uid":0,"username":"阿萨法","password":null,"email":null,"nickname":null},{"uid":0,"username":"阿斯达","password":null,"email":null,"nickname":null},{"uid":0,"username":"啊实打实的","password":null,"email":null,"nickname":null},{"uid":0,"username":"阿斯达啊","password":null,"email":null,"nickname":null},{"uid":0,"username":"是打算打","password":null,"email":null,"nickname":null},{"uid":0,"username":"阿斯达","password":"12312312","email":null,"nickname":null}]
总不能每一个sql语句都写一个实体类吧,如何灵活的处理 MyBatis 结果集,只返回查询字段?
正確的做法是不要改變實體類別(DO),
新建資料傳輸類別(DTO),例如MemberDTO,
寫一個方法吧DO轉換成DTO,一個DTO包含的數據可能來自好幾個DO,就像你現在需要傳輸Member的數據,如果需要其他表的一些屬性怎麼辦。
DO是保持和資料庫一致的,DTO是保持跟外界互動一致的,這樣在資料或業務發生變動的時候,可以靈活的調整。
千萬不要把DO直接拿來做資料傳輸,這樣不利於擴充
這個跟Mybatis沒有半毛錢關係吧,應該是json序列化的配置問題。
我假設你用的是SpringMVC+Jackson,Jackson的序列化配置如下:
可以看一下
@JsonInclude
的几个枚举变量对应的含义,个人认为最理想的应该是用NON_EMPTY
,这个会把空对象、空数组也不输出(例如:{}, [])。但要注意的是:0也会被认为是EMPTY从而不输出(意味着所有没赋值或为0的int
类型或Integer
物件都不會被輸出)。將物件轉換為JSON時(序列化過程),如果物件的某個屬性值為null,則該屬性不參與序列化,產生的JSON結果也不會包含該屬性。程式碼如下:
將上述參數,放在map中,然後呼叫json的方法JSON.toJSONString()的時候,對於null值,是不傳輸的。我們來看看JSON.toJSONString()方法的實作。
如果沒有實體類,暴露資料表欄位是必然的。
不知道你使用的什麼方法產生 JSON,不過理論上,應該會有一個忽略空值的參數,找找看,如果實在找不到,可以用正規表示式把空屬性去掉。
建構對應的實體類別是必須的,只顯示需要展示的內容,並對資料的格式進行轉換(例如date轉string等)
你可以用HashMap接受mybatis查詢結果