網站首頁 編程語言 正文
MyBatisSystemException異常產生原因及解決方案
01 異常發生場景
- 當我使用mybatis對數據庫操作時報的錯誤
<resultMap id="shoppingCartProduct" type="shoppingCartProductVo">
<id property="shoppingCartId" column="shopping_cart_id"></id>
<result property="productId" column="product_id"></result>
<result property="num" column="num"></result>
<result property="productName" column="product_name"></result>
<result property="productTitle" column="product_title"></result>
<result property="productIntro" column="product_intro"></result>
<result property="productPicture" column="product_picture"></result>
<result property="productPrice" column="product_price"></result>
<result property="productSellingPrice" column="product_selling_price"></result>
</resultMap>
<select id="selectShoppingCartByIds" resultMap="shoppingCartProduct">
select
s.shopping_cart_id,
s.num,
s.product_id,
p.product_name,
p.product_title,
p.product_intro,
p.product_picture,
p.product_price,
p.product_selling_price
FROM
shopping_cart AS s
left JOIN
product AS p
ON s.product_id = p.product_id
WHERE
s.shopping_cart_id
in (<foreach collection="list" index="id" separator=",">
#{id}
</foreach>)
</select>
02 嘗試解決問題的過程
1.事務問題
- 一開始,我以為是事務問題,于是在service層加上了@Transactional開啟事務
@Override
@Transactional
public GetData postOrders(List<Long> shoppingCartIds, Long userId) {
//1.判斷用戶是否存在
if (msUserMapper.FindUser(userId) == null) {
GetData getData=new GetData(500,"無此賬號",null);
return getData;
}
//2.生成訂單
Orders orders=new Orders();
orders.setOrderNum(UUID.randomUUID().toString());
orders.setUserId(userId);
orders.setOrderTime(new Date());
orderProductMapper.addOrders(orders);
System.out.println(orders.getOrderId());
System.out.println(orders.getOrderId().getClass().getTypeName());
System.out.println(shoppingCartIds);
//3.查詢購物車商品數據
List<ShoppingCartProductVo> shoppingCartProductVos = productMapper.selectShoppingCartByIds(shoppingCartIds);
System.out.println(shoppingCartProductVos.size());
System.out.println(shoppingCartProductVos);
List<OrdersDtl> ordersDtls = new ArrayList<>();
for (ShoppingCartProductVo vo : shoppingCartProductVos) {
OrdersDtl ordersDtl = new OrdersDtl();
ordersDtl.setOrderId(orders.getOrderId());
ordersDtl.setProductId(vo.getProductId());
ordersDtl.setProductIntro(vo.getProductIntro());
ordersDtl.setProductName(vo.getProductName());
ordersDtl.setProductPicture(vo.getProductPicture());
ordersDtl.setProductPrice(vo.getProductPrice());
ordersDtl.setProductSellingPrice(vo.getProductSellingPrice());
ordersDtl.setProductTitle(vo.getProductTitle());
ordersDtl.setNum(vo.getNum());
ordersDtls.add(ordersDtl);
}
System.out.println(ordersDtls);
orderProductMapper.addBatchOrderDtlsInt(ordersDtls);
System.out.println(1);
int rs =shoppingCartMapper.deleteShoppingCarts(shoppingCartIds);
if (rs>0){
GetData getData=new GetData(200,"操作成功",null);
return getData;
}else {
GetData getData=new GetData(500,"操作成功",rs);
return getData;
}
}
- 現在想想,真是沒抓住重點,看錯了代碼的報錯信息
2.MyBatis一級緩存問題
- 接著排查發現發現查詢出的數據與同樣的代碼在數據庫里不一樣,人當場傻了
- 面向百度編程后認為是出現了MyBatis一級緩存問題
- 于是在yml文件中關閉關閉了MyBatis一級緩存
# 配置mybatis
mybatis:
# mapper配置文件
mapper-locations: classpath:mapper/*.xml
# resultType別名,沒有這個配置resultType包名要寫全,配置后只要寫類名
type-aliases-package: com.example.demo.com.mashang.dao
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
local-cache-scope: statement # 設置一級緩存關閉,mybatis默認開啟
- 當然還是不對,無可奈何之下,我只能回歸最初的報錯信息,意思大概是文件映射有問題
03 問題的產生及其原因
- 沒辦法,如果真是映射出了錯,那就只能一個一個排查過去了
- 終于在結合了springboot的報錯日志
- log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
select
s.num, s.product_id, p.product_name, p.product_title, p.product_intro, p.product_picture, p.product_price, p.product_selling_price
FROM shopping_cart AS s
INNER JOIN product AS p
ON s.product_id = p.product_id
WHERE s.shopping_cart_id
in ( ? , ? , ? )
- 終于,我發現mybatis執行的語句中,三個問號插入的值是固定的0,1,2
- 也就是循環插入出了問題
- 果然,我錯誤的使用了標簽index
04 解決方式
- 只要認真檢查mybatis的映射文件,我的話是把標簽換成即可,以下是修改后的mybatis映射文件
<resultMap id="shoppingCartProduct" type="shoppingCartProductVo">
<id property="shoppingCartId" column="shopping_cart_id"></id>
<result property="productId" column="product_id"></result>
<result property="num" column="num"></result>
<result property="productName" column="product_name"></result>
<result property="productTitle" column="product_title"></result>
<result property="productIntro" column="product_intro"></result>
<result property="productPicture" column="product_picture"></result>
<result property="productPrice" column="product_price"></result>
<result property="productSellingPrice" column="product_selling_price"></result>
</resultMap>
<select id="selectShoppingCartByIds" resultMap="shoppingCartProduct">
select
s.shopping_cart_id,
s.num,
s.product_id,
p.product_name,
p.product_title,
p.product_intro,
p.product_picture,
p.product_price,
p.product_selling_price
FROM
shopping_cart AS s
left JOIN
product AS p
ON s.product_id = p.product_id
WHERE
s.shopping_cart_id
in (<foreach collection="list" item="id" separator=",">
#{id}
</foreach>)
</select>
原文鏈接:https://blog.csdn.net/2302_77182979/article/details/134674756
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-05-13 Django-認證-權限控制-節流-分頁-過濾
- 2022-10-11 Systemtap BPF/BCC bpftrace 實踐對比
- 2022-06-28 python神經網絡Keras構建CNN網絡訓練_python
- 2022-09-04 C/C++?引用作為函數的返回值方式_C 語言
- 2022-06-09 python?Tkinter模塊使用方法詳解_python
- 2022-09-17 Go語言學習筆記之錯誤和異常詳解_Golang
- 2022-08-26 Redis哨兵模式實現一主二從三哨兵_Redis
- 2022-08-18 C/C++?extern和static的使用詳解_C 語言
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支