cari

Rumah  >  Soal Jawab  >  teks badan

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 hari yang lalu414

membalas semua(6)saya akan balas

  • PHPz

    PHPz2017-04-18 09:16:48

    Pendekatan yang betul adalah untuk tidak menukar kelas entiti (DO),

    1. Buat kelas pemindahan data (DTO) baharu, seperti MemberDTO,

    2. Tulis kaedah untuk menukar DO kepada DTO Data yang terkandung dalam DTO mungkin datang daripada beberapa DO Contohnya, jika anda perlu memindahkan data Ahli sekarang, bagaimana jika anda memerlukan beberapa atribut jadual lain.

    DO kekal konsisten dengan pangkalan data dan DTO kekal konsisten dengan interaksi luaran, supaya ia boleh dilaraskan secara fleksibel apabila data atau perniagaan berubah.
    Jangan gunakan DO secara langsung untuk penghantaran data, kerana ini tidak sesuai untuk pengembangan

    balas
    0
  • PHP中文网

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

    Ini tiada kaitan dengan Mybatis, ia sepatutnya menjadi isu konfigurasi bersiri json.
    Saya menganggap anda menggunakan SpringMVC+Jackson Konfigurasi bersiri Jackson adalah seperti berikut:

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                <property name="serializationInclusion" value="NON_NULL"/><!-- 重点:只输出非NULL字段 -->
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    Anda boleh melihat makna yang sepadan bagi beberapa pembolehubah penghitungan @JsonInclude Secara peribadi, saya rasa yang paling ideal ialah menggunakan NON_EMPTY, yang tidak akan mengeluarkan objek kosong dan tatasusunan kosong (contohnya: {. }, [] ). Tetapi sila ambil perhatian: 0 juga akan dianggap sebagai KOSONG dan tidak akan dikeluarkan (bermaksud semua int jenis atau Integer objek yang tidak diberikan nilai atau 0 tidak akan dikeluarkan).

    balas
    0
  • PHP中文网

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

    Apabila menukar objek kepada JSON (proses siri), jika nilai atribut tertentu objek adalah batal, atribut tidak akan mengambil bahagian dalam siri dan hasil JSON yang dijana tidak akan menyertakan atribut ini. Kodnya adalah seperti berikut:

    public String toNotifyBody(NotifyBean bean) {
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("orderId", bean.orderId);
            map.put("title", bean.title);
            map.put("subject", bean.subject);
            map.put("operateType", bean.operateType);
            map.put("handlePerson", bean.handlePerson);
            map.put("extractPerson", bean.extractPerson);
            map.put("sla", bean.sla);
            return JSON.toJSONString(map);
        }
    

    Letakkan parameter di atas dalam peta, dan kemudian panggil kaedah json JSON.toJSONString(), nilai nol tidak akan dihantar. Mari kita lihat pelaksanaan kaedah JSON.toJSONString().

    public static final String toJSONString(Object object) {
            return toJSONString(object, new SerializerFeature[0]);
        }
        public static final String toJSONString(Object object, SerializerFeature... features) {
            SerializeWriter out = new SerializeWriter();
    
            try {
                JSONSerializer serializer = new JSONSerializer(out);
                for (com.alibaba.fastjson.serializer.SerializerFeature feature : features) {
                    serializer.config(feature, true);
                }
    
                serializer.write(object);
    
                return out.toString();
            } finally {
                out.close();
            }
        }

    balas
    0
  • ringa_lee

    ringa_lee2017-04-18 09:16:48

    Jika tiada kelas entiti, mendedahkan medan jadual data tidak dapat dielakkan.

    Saya tidak tahu kaedah apa yang anda gunakan untuk menjana JSON, tetapi secara teorinya, harus ada parameter yang mengabaikan nilai nol Carinya Jika anda benar-benar tidak menemuinya, anda boleh menggunakan ungkapan biasa untuk mengalih keluar atribut nol.

    balas
    0
  • 伊谢尔伦

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

    Adalah perlu untuk membina kelas entiti yang sepadan, hanya memaparkan kandungan yang perlu dipaparkan dan menukar format data (seperti tarikh kepada rentetan, dll.)

    balas
    0
  • ringa_lee

    ringa_lee2017-04-18 09:16:48

    Anda boleh menggunakan HashMap<String,Object> untuk menerima hasil pertanyaan mybatis

    balas
    0
  • Batalbalas