java - Restful服务 MyBatis 多表查询大量字段时结果集映射解决方案?
PHPz
PHPz 2017-04-18 09:14:48
0
6
402

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

PHPz
PHPz

学习是最好的投资!

모든 응답(6)
PHPzhong

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

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

  2. DO를 DTO로 변환하는 방법을 작성하세요. DTO에 포함된 데이터는 여러 DO에서 나올 수 있습니다. 예를 들어 지금 회원 데이터를 전송해야 하는 경우 다른 테이블의 일부 속성이 필요한 경우에는 어떻게 해야 할까요?

DO는 데이터베이스와 일관성을 유지하고 DTO는 외부 상호작용과 일관성을 유지하므로 데이터나 비즈니스가 변경될 때 유연하게 조정할 수 있습니다.
DO를 데이터 전송에 직접 사용하지 마십시오. 이는 확장에 도움이 되지 않습니다.

洪涛

이것은 Mybatis와는 아무런 관련이 없으며 json 직렬화 구성 문제여야 합니다.
SpringMVC+Jackson을 사용한다고 가정합니다. Jackson의 직렬화 구성은 다음과 같습니다.

으아악

@JsonInclude의 여러 열거형 변수에 해당하는 의미를 살펴볼 수 있습니다. 개인적으로 가장 이상적인 것은 빈 개체와 빈 배열을 출력하지 않는 NON_EMPTY을 사용하는 것입니다(예: { }, [] ). 그러나 참고: 0은 EMPTY로 간주되어 출력되지 않습니다(즉, 값이 할당되지 않았거나 0인 모든 int 유형 또는 Integer 개체가 출력되지 않음을 의미).

Ty80

객체를 JSON으로 변환(직렬화 프로세스)할 때 객체의 특정 속성 값이 null인 경우 해당 속성은 직렬화에 참여하지 않으며 생성된 JSON 결과에는 이 속성이 포함되지 않습니다. 코드는 다음과 같습니다.

으아악

위 매개변수를 맵에 넣은 후 json 메서드 JSON.toJSONString()을 호출하면 null 값이 전송되지 않습니다. JSON.toJSONString() 메서드의 구현을 살펴보겠습니다.

으아악
左手右手慢动作

엔티티 클래스가 없으면 데이터 테이블 필드 노출이 불가피합니다.

JSON을 생성할 때 어떤 방법을 사용했는지는 모르겠지만 이론적으로는 null 값을 무시하는 매개변수가 있어야 합니다. 실제로 찾을 수 없으면 정규식을 사용하여 제거할 수 있습니다. 널 속성.

伊谢尔伦

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

左手右手慢动作

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

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿