MyBatisSystemException异常产生原因及解决方案

淩亂°似流年 2024-02-17 11:46 206阅读 0赞

MyBatisSystemException异常产生原因及解决方案

01 异常发生场景

  • 当我使用mybatis对数据库操作时报的错误

    1. <id property="shoppingCartId" column="shopping_cart_id"></id>
    2. <result property="productId" column="product_id"></result>
    3. <result property="num" column="num"></result>
    4. <result property="productName" column="product_name"></result>
    5. <result property="productTitle" column="product_title"></result>
    6. <result property="productIntro" column="product_intro"></result>
    7. <result property="productPicture" column="product_picture"></result>
    8. <result property="productPrice" column="product_price"></result>
    9. <result property="productSellingPrice" column="product_selling_price"></result>
    10. </resultMap>
    11. <select id="selectShoppingCartByIds" resultMap="shoppingCartProduct">
    12. select
    13. s.shopping_cart_id,
    14. s.num,
    15. s.product_id,
    16. p.product_name,
    17. p.product_title,
    18. p.product_intro,
    19. p.product_picture,
    20. p.product_price,
    21. p.product_selling_price
    22. FROM
    23. shopping_cart AS s
    24. left JOIN
    25. product AS p
    26. ON s.product_id = p.product_id
    27. WHERE
    28. s.shopping_cart_id
    29. in (<foreach collection="list" index="id" separator=",">
    30. #{id}
    31. </foreach>)
    32. </select>

02 尝试解决问题的过程

1.事务问题

  • 一开始,我以为是事务问题,于是在service层加上了@Transactional开启事务

    @Override
    @Transactional
    public GetData postOrders(List shoppingCartIds, Long userId) {

    1. //1.判断用户是否存在
    2. if (msUserMapper.FindUser(userId) == null) {
    3. GetData getData=new GetData(500,"无此账号",null);
    4. return getData;
    5. }
    6. //2.生成订单
    7. Orders orders=new Orders();
    8. orders.setOrderNum(UUID.randomUUID().toString());
    9. orders.setUserId(userId);
    10. orders.setOrderTime(new Date());
    11. orderProductMapper.addOrders(orders);
    12. System.out.println(orders.getOrderId());
    13. System.out.println(orders.getOrderId().getClass().getTypeName());
    14. System.out.println(shoppingCartIds);
    15. //3.查询购物车商品数据
    16. List<ShoppingCartProductVo> shoppingCartProductVos = productMapper.selectShoppingCartByIds(shoppingCartIds);
    17. System.out.println(shoppingCartProductVos.size());
    18. System.out.println(shoppingCartProductVos);
    19. List<OrdersDtl> ordersDtls = new ArrayList<>();
    20. for (ShoppingCartProductVo vo : shoppingCartProductVos) {
    21. OrdersDtl ordersDtl = new OrdersDtl();
    22. ordersDtl.setOrderId(orders.getOrderId());
    23. ordersDtl.setProductId(vo.getProductId());
    24. ordersDtl.setProductIntro(vo.getProductIntro());
    25. ordersDtl.setProductName(vo.getProductName());
    26. ordersDtl.setProductPicture(vo.getProductPicture());
    27. ordersDtl.setProductPrice(vo.getProductPrice());
    28. ordersDtl.setProductSellingPrice(vo.getProductSellingPrice());
    29. ordersDtl.setProductTitle(vo.getProductTitle());
    30. ordersDtl.setNum(vo.getNum());
    31. ordersDtls.add(ordersDtl);
    32. }
    33. System.out.println(ordersDtls);
    34. orderProductMapper.addBatchOrderDtlsInt(ordersDtls);
    35. System.out.println(1);
    36. int rs =shoppingCartMapper.deleteShoppingCarts(shoppingCartIds);
    37. if (rs>0){
    38. GetData getData=new GetData(200,"操作成功",null);
    39. return getData;
    40. }else {
    41. GetData getData=new GetData(500,"操作成功",rs);
    42. return getData;
    43. }

    }

  • 现在想想,真是没抓住重点,看错了代码的报错信息

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:

    1. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    2. map-underscore-to-camel-case: true
    3. 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映射文件

    1. <id property="shoppingCartId" column="shopping_cart_id"></id>
    2. <result property="productId" column="product_id"></result>
    3. <result property="num" column="num"></result>
    4. <result property="productName" column="product_name"></result>
    5. <result property="productTitle" column="product_title"></result>
    6. <result property="productIntro" column="product_intro"></result>
    7. <result property="productPicture" column="product_picture"></result>
    8. <result property="productPrice" column="product_price"></result>
    9. <result property="productSellingPrice" column="product_selling_price"></result>

发表评论

表情:
评论列表 (有 0 条评论,206人围观)

还没有评论,来说两句吧...

相关阅读