日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

MyBatisSystemException異常產(chǎn)生原因及解決方案

作者:宣布無人罪 更新時(shí)間: 2023-12-18 編程語言

MyBatisSystemException異常產(chǎn)生原因及解決方案

01 異常發(fā)生場(chǎng)景

  • 當(dāng)我使用mybatis對(duì)數(shù)據(jù)庫操作時(shí)報(bào)的錯(cuò)誤
<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.事務(wù)問題

  • 一開始,我以為是事務(wù)問題,于是在service層加上了@Transactional開啟事務(wù)
@Override
@Transactional
public GetData postOrders(List<Long> shoppingCartIds, Long userId) {
    //1.判斷用戶是否存在
    if (msUserMapper.FindUser(userId) == null) {
        GetData getData=new GetData(500,"無此賬號(hào)",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.查詢購(gòu)物車商品數(shù)據(jù)
    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;
    }

}
  • 現(xiàn)在想想,真是沒抓住重點(diǎn),看錯(cuò)了代碼的報(bào)錯(cuò)信息

2.MyBatis一級(jí)緩存問題

  • 接著排查發(fā)現(xiàn)發(fā)現(xiàn)查詢出的數(shù)據(jù)與同樣的代碼在數(shù)據(jù)庫里不一樣,人當(dāng)場(chǎng)傻了
  • 面向百度編程后認(rèn)為是出現(xiàn)了MyBatis一級(jí)緩存問題
  • 于是在yml文件中關(guān)閉關(guān)閉了MyBatis一級(jí)緩存
# 配置mybatis
mybatis:
  # mapper配置文件
  mapper-locations: classpath:mapper/*.xml
  # resultType別名,沒有這個(gè)配置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 # 設(shè)置一級(jí)緩存關(guān)閉,mybatis默認(rèn)開啟
  • 當(dāng)然還是不對(duì),無可奈何之下,我只能回歸最初的報(bào)錯(cuò)信息,意思大概是文件映射有問題

03 問題的產(chǎn)生及其原因

  • 沒辦法,如果真是映射出了錯(cuò),那就只能一個(gè)一個(gè)排查過去了
  • 終于在結(jié)合了springboot的報(bào)錯(cuò)日志
  • 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 ( ? , ? , ? )
  • 終于,我發(fā)現(xiàn)mybatis執(zhí)行的語句中,三個(gè)問號(hào)插入的值是固定的0,1,2
  • 也就是循環(huán)插入出了問題
  • 果然,我錯(cuò)誤的使用了標(biāo)簽index

04 解決方式

  • 只要認(rèn)真檢查mybatis的映射文件,我的話是把標(biāo)簽換成即可,以下是修改后的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

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新