検索

ホームページ  >  に質問  >  本文

java - Restful服务 MyBatis 多表查询大量字段时结果集映射解决方案?

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 结果集,只返回查询字段?

PHPzPHPz2893日前411

全員に返信(6)返信します

  • PHPz

    PHPz2017-04-18 09:16:48

    正しいアプローチは、エンティティ クラス (DO) を変更しないことです。

    1. MemberDTO、

    2. などの新しいデータ転送クラス (DTO) を作成します。
    3. DO を DTO に変換するメソッドを作成します。DTO に含まれるデータは複数の DO から取得される場合があります。たとえば、今すぐメンバー データを転送する必要がある場合、他のテーブルの属性が必要な場合はどうなるでしょうか。

    DO はデータベースとの一貫性を維持し、DTO は外部インタラクションとの一貫性を維持するため、データやビジネスが変更された場合に柔軟に調整できます。
    拡張につながらないため、データ送信に DO を直接使用しないでください

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 09:16:48

    これは Mybatis とは関係ありません。JSON シリアル化構成の問題であるはずです。
    SpringMVC+Jackson を使用しているとします。Jackson のシリアル化構成は次のとおりです。

    リーリー

    @JsonInclude のいくつかの列挙型変数の対応する意味を見てみましょう。個人的には、空のオブジェクトや空の配列を出力しない NON_EMPTY を使用するのが最も理想的だと思います (例: { }、[])。ただし、注意してください: 0 も EMPTY とみなされ、出力されません (つまり、値が割り当てられていない、または 0 であるすべての int タイプまたは Integer オブジェクトは出力されません)。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-18 09:16:48

    オブジェクトを JSON に変換するとき (シリアル化プロセス)、オブジェクトの特定の属性の値が null の場合、その属性はシリアル化に参加せず、生成された JSON 結果にはこの属性は含まれません。コードは次のとおりです:

    リーリー

    上記のパラメータをマップに配置して、json メソッド JSON.toJSONString() を呼び出すと、null 値は送信されません。 JSON.toJSONString() メソッドの実装を見てみましょう。

    リーリー

    返事
    0
  • ringa_lee

    ringa_lee2017-04-18 09:16:48

    エンティティ クラスがない場合、データ テーブル フィールドの公開は避けられません。

    JSON の生成にどのような方法を使用したかはわかりませんが、理論的には、null 値を無視するパラメーターがあるはずです。本当に見つからない場合は、正規表現を使用して削除できます。 null 属性。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:16:48

    対応するエンティティクラスを構築し、表示したい内容のみを表示し、データ形式を変換(日付から文字列など)する必要があります

    返事
    0
  • ringa_lee

    ringa_lee2017-04-18 09:16:48

    HashMap<String,Object> を使用して mybatis クエリの結果を受け入れることができます

    返事
    0
  • キャンセル返事