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 结果集,只返回查询字段?
PHPz2017-04-18 09:16:48
正しいアプローチは、エンティティ クラス (DO) を変更しないことです。
MemberDTO、
DO を DTO に変換するメソッドを作成します。DTO に含まれるデータは複数の DO から取得される場合があります。たとえば、今すぐメンバー データを転送する必要がある場合、他のテーブルの属性が必要な場合はどうなるでしょうか。
DO はデータベースとの一貫性を維持し、DTO は外部インタラクションとの一貫性を維持するため、データやビジネスが変更された場合に柔軟に調整できます。
拡張につながらないため、データ送信に DO を直接使用しないでください
PHP中文网2017-04-18 09:16:48
これは Mybatis とは関係ありません。JSON シリアル化構成の問題であるはずです。
SpringMVC+Jackson を使用しているとします。Jackson のシリアル化構成は次のとおりです。
@JsonInclude
のいくつかの列挙型変数の対応する意味を見てみましょう。個人的には、空のオブジェクトや空の配列を出力しない NON_EMPTY
を使用するのが最も理想的だと思います (例: { }、[])。ただし、注意してください: 0 も EMPTY とみなされ、出力されません (つまり、値が割り当てられていない、または 0 であるすべての int
タイプまたは Integer
オブジェクトは出力されません)。
PHP中文网2017-04-18 09:16:48
オブジェクトを JSON に変換するとき (シリアル化プロセス)、オブジェクトの特定の属性の値が null の場合、その属性はシリアル化に参加せず、生成された JSON 結果にはこの属性は含まれません。コードは次のとおりです:
リーリー上記のパラメータをマップに配置して、json メソッド JSON.toJSONString() を呼び出すと、null 値は送信されません。 JSON.toJSONString() メソッドの実装を見てみましょう。
リーリーringa_lee2017-04-18 09:16:48
エンティティ クラスがない場合、データ テーブル フィールドの公開は避けられません。
JSON の生成にどのような方法を使用したかはわかりませんが、理論的には、null 値を無視するパラメーターがあるはずです。本当に見つからない場合は、正規表現を使用して削除できます。 null 属性。