Mybatis和objectMapper的问题

2024-06-04 05:38
文章标签 问题 mybatis objectmapper

本文主要是介绍Mybatis和objectMapper的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用了Mybatis的懒加载,即

<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 按需延迟加载 -->
<setting name="aggressiveLazyLoading" value="false"/>

xml中

<select id="queryByID" resultMap="pojoResultMap">
SELECT
*
FROM
<include refid="tableName"/>
WHERE order_id = #{id};
</select>

<sql id="tableName">tb_order</sql>

<resultMap type="Order" id="pojoResultMap" autoMapping="true">
<id column="order_id" property="orderId"/>
<association property="orderShipping" javaType="OrderShipping" column="order_id" select="queryOrderShippingByOrderId" autoMapping="true"></association>
<collection property="orderItems" javaType="Arraylist" ofType="OrderItem" autoMapping="true" select="queryOrderItemByOrderId" column="order_id">
</collection>
</resultMap>

<select id="queryOrderShippingByOrderId" resultType="OrderShipping" parameterType="String">
SELECT * FROM tb_order_shipping WHERE order_id = #{orderId};
</select>

<select id="queryOrderItemByOrderId" resultType="OrderItem" parameterType="String">
SELECT * FROM tb_order_item WHERE order_id = #{orderId};
</select>

Order类,只列出部分属性:

public class Order {
private String orderId;//id+时间戳
@NotEmpty
private List<OrderItem> orderItems;//商品详情
private OrderShipping orderShipping; //物流地址信息

setter和getter略

}

查询Order时会出现两个问题,出现问题的本质原因是:这种查询返回的Order对象会多一个handler属性(代理对象):

1、如果使用springmvc返回json会报解析错误。解决方法是写一个Mapper继承ObjectMapper 

public class CustomMapper extends ObjectMapper {
/**

*/
private static final long serialVersionUID = 1L;


public CustomMapper() {
this.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// 设置 SerializationFeature.FAIL_ON_EMPTY_BEANS 为 false
this.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
}
}

然后在spring-servlet.xml的<mvc:annotation-driven>下面<mvc:message-converters>追加:

<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <!-- 配置 objectMapper 为我们自定义扩展后的 CustomMapper -->
            <property name="objectMapper">
                <bean class="com.taotao.store.order.util.CustomMapper">
                </bean>
            </property>
        </bean>
</mvc:message-converters>
</mvc:annotation-driven>

这个作用其实就是在解析时忽略对象中某些不存在的属性。比如Order类中根本没有handler属性。

2、当我们以调api方式获取resposeBody的json字符串后,要做反序列化,比如Order order = MAPPER.readValue(respBody, Order.class);

但Order中没有handler属性,respBody中有handler属性,那怎么办?

第一种方法:要对MAPPER进行配置,即在使用前调用MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);这样就不会解析这种不存在的属性了

第二种方法:在pojo类上使用@JsonIgnoreProperties(ignoreUnknown = true),比如在Order类上用这个注解。注意,这个注解无法解决上面第一个问题。

---------------------------------------

List<Cart> list = MAPPER.readValue(respBody,
MAPPER.getTypeFactory().constructCollectionType(List.class, Cart.class));

这篇关于Mybatis和objectMapper的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029208

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja