Maison > Questions et réponses > le corps du texte
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
La bonne approche est de ne pas changer la classe d'entité (DO),
Créez une nouvelle classe de transfert de données (DTO), telle que MemberDTO,
Écrivez une méthode pour convertir DO en DTO. Les données contenues dans un DTO peuvent provenir de plusieurs DO. Par exemple, si vous devez transférer les données des membres maintenant, que se passe-t-il si vous avez besoin de certains attributs d'autres tables.
DO reste cohérent avec la base de données et DTO reste cohérent avec les interactions externes, de sorte qu'il puisse être ajusté de manière flexible lorsque les données ou l'activité changent.
N'utilisez jamais DO directement pour la transmission de données, car cela n'est pas propice à l'expansion
PHP中文网2017-04-18 09:16:48
Cela n'a rien à voir avec Mybatis, cela devrait être un problème de configuration de sérialisation json.
Je suppose que vous utilisez SpringMVC+Jackson. La configuration de sérialisation de Jackson est la suivante :
<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>
Vous pouvez jeter un œil aux significations correspondantes de plusieurs variables d'énumération de @JsonInclude
Personnellement, je pense que la plus idéale est d'utiliser NON_EMPTY
, qui ne produira pas d'objets vides et de tableaux vides (par exemple : {. }, [] ). Mais veuillez noter : 0 sera également considéré comme VIDE et ne sera pas affiché (ce qui signifie que tous les objets de type int
ou Integer
qui n'ont pas de valeur ou qui sont 0 ne seront pas affichés).
PHP中文网2017-04-18 09:16:48
Lors de la conversion d'un objet en JSON (processus de sérialisation), si la valeur d'un certain attribut de l'objet est nulle, l'attribut ne participera pas à la sérialisation et le résultat JSON généré n'inclura pas cet attribut. Le code est le suivant :
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);
}
Mettez les paramètres ci-dessus dans la carte, puis appelez la méthode json JSON.toJSONString(), la valeur nulle ne sera pas transmise. Jetons un coup d'œil à l'implémentation de la méthode 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();
}
}
ringa_lee2017-04-18 09:16:48
S'il n'y a pas de classe d'entité, l'exposition des champs de la table de données est inévitable.
Je ne sais pas quelle méthode vous avez utilisée pour générer JSON, mais théoriquement, il devrait y avoir un paramètre qui ignore les valeurs nulles. Recherchez-le. Si vous ne le trouvez vraiment pas, vous pouvez utiliser des expressions régulières pour supprimer le. attributs nuls.
伊谢尔伦2017-04-18 09:16:48
Il est nécessaire de construire la classe d'entité correspondante, d'afficher uniquement le contenu qui doit être affiché et de convertir le format des données (comme la date en chaîne, etc.)
ringa_lee2017-04-18 09:16:48
Vous pouvez utiliser HashMap<String,Object> pour accepter les résultats de la requête mybatis