찾다

 >  Q&A  >  본문

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일 전413

모든 응답(6)나는 대답할 것이다

  • PHPz

    PHPz2017-04-18 09:16:48

    올바른 접근 방식은 엔터티 클래스(DO)를 변경하지 않는 것입니다.

    1. MemberDTO와 같은 새로운 데이터 전송 클래스(DTO)를 생성합니다.

    2. 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 값을 무시하는 매개변수가 있어야 합니다. 실제로 찾을 수 없으면 정규식을 사용하여 제거할 수 있습니다. 널 속성.

    회신하다
    0
  • 伊谢尔伦

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

    해당 엔터티 클래스를 빌드하고, 표시해야 하는 내용만 표시하고, 데이터 형식(예: 날짜를 문자열로 등)으로 변환하는 작업이 필요합니다.

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-18 09:16:48

    HashMap<String,Object>을 사용하여 mybatis 쿼리 결과를 받아들일 수 있습니다

    회신하다
    0
  • 취소회신하다