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와 같은 새로운 데이터 전송 클래스(DTO)를 생성합니다.
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 값을 무시하는 매개변수가 있어야 합니다. 실제로 찾을 수 없으면 정규식을 사용하여 제거할 수 있습니다. 널 속성.
伊谢尔伦2017-04-18 09:16:48
해당 엔터티 클래스를 빌드하고, 표시해야 하는 내용만 표시하고, 데이터 형식(예: 날짜를 문자열로 등)으로 변환하는 작업이 필요합니다.