• 《苍穹外卖》Day08部分知识点记录


    一、useGeneratedKeys和keyProperty

    useGeneratedKeys和keyProperty是标签中的两个属性,用于处理自动生成的主键值。

    1. useGeneratedKeys

    • userGeneratedKeys="true"表示启用自动生成主键功能;
    • 当useGeneratedKeys设置为true时,MyBatis会告诉数据库生成主键,并将生成的主键值返回给Java对象;
    • 通常用于自增主键或序列主键的情况。

    2. keyProperty

    keyProperty属性用于指定将生成的主键值赋值给Java对象的哪个属性;

    标签中,可以通过keyProperty属性指定一个Java对象的属性,用于接收生成的主键值;

    生成的主键值会自动设置到指定的属性中,方便后续操作。

    1. <insert id="insert" useGeneratedKeys="true" keyProperty="id">
    2. INSERT INTO user (name, age) VALUES (#{name}, #{age})
    3. insert>

    二、Transactional注解

    介绍

    @Transactional注解是Spring框架中用于声明事务管理的注解,它的作用是告诉Spring容器该方法需要在事务管理下运行。当一个方法被@Transactional注解修饰时,Spring会在方法执行前开启一个事务,在方法执行后根据方法的执行情况决定是提交事务还是回滚事务。

    作用

    • 开启事务:@Transactional注解可以在方法上声明事务,告诉Spring容器该方法需要在事务管理下运行;
    • 提交事务:如果方法执行成功(没有抛出异常),Spring会提交事务,将数据库操作持久化;
    • 回滚事务:如果方法执行失败(抛出异常),Spring会回滚事务,撤销之前的数据库操作,保持数据的一致性;
    • 控制事务传播行为:@Transactional注解还可以配置事务的传播行为、隔离级别、超时时间等属性,以满足不同业务场景下的事务需求。

    示例

    1. @Service
    2. public class UserService {
    3. @Autowired
    4. private UserRepository userRepository;
    5. @Transactional
    6. public void createUser(User user) {
    7. userRepository.save(user);
    8. }
    9. }

            在上面的实例中,createUser方法被@Transactional注解修饰,表示该方法需要在事务管理下运行。如果userRepository.save(user)方法执行成功,则事务会被提交;如果执行过程出现异常,则事务会被回滚。

    三、微信支付

    个人无法开通支付功能的解决:

    此处参考:《苍穹外卖》电商实战项目实操笔记系列(P66~P122)【中】__166d96f876f45c7d07ce98952a96ec980368acfc-CSDN博客

    步骤:

    1. 在小程序用户端代码中,把pages/pay/index.js文件中下图所示的代码注释掉

    2. 接着把原先注释掉的重定向代码取消注释,如下图

    3. 在IDEA中后端代码中,把service/serviceImpl/OrderServiceImpl.java如下图的代码注释掉

    4. 在OrderServiceImpl中,写入如下代码,用于设置参数

    1. /**
    2. * 订单支付
    3. *
    4. * @param ordersPaymentDTO
    5. * @return
    6. */
    7. public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {
    8. // 当前登录用户id
    9. Long userId = BaseContext.getCurrentId();
    10. User user = userMapper.getById(userId);
    11. //调用微信支付接口,生成预支付交易单
    12. /* JSONObject jsonObject = weChatPayUtil.pay(
    13. ordersPaymentDTO.getOrderNumber(), //商户订单号
    14. new BigDecimal(0.01), //支付金额,单位 元
    15. "苍穹外卖订单", //商品描述
    16. user.getOpenid() //微信用户的openid
    17. );
    18. if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) {
    19. throw new OrderBusinessException("该订单已支付");
    20. }*/
    21. JSONObject jsonObject = new JSONObject();
    22. jsonObject.put("code", "ORDERPAID");
    23. OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
    24. vo.setPackageStr(jsonObject.getString("package"));
    25. Integer OrderPaidStatus = Orders.PAID; // 支付状态,已支付
    26. Integer OrderStatus = Orders.TO_BE_CONFIRMED; // 订单状态,待接单
    27. LocalDateTime check_out_time = LocalDateTime.now(); // 更新支付时间
    28. orderMapper.updateStatus(OrderStatus, OrderPaidStatus, check_out_time, this.orders.getId());
    29. return vo;
    30. }

    5. 在OrderMapper添加如下

    1. /**
    2. * 更新订单状态
    3. * @param orderStatus
    4. * @param orderPaidStatus
    5. * @param check_out_time
    6. * @param id
    7. */
    8. @Update("update orders set status = #{orderStatus}, pay_status = #{orderPaidStatus}, checkout_time = #{check_out_time} where id = #{id}")
    9. void updateStatus(Integer orderStatus, Integer orderPaidStatus, LocalDateTime check_out_time, Long id);

    6. 在OrderServiceImpl定义全局变量orders

    7. 在OrderServiceImpl的submitOrder方法中初始化orders变量,同时补充设置订单数据的几行代码,如下图

    8. 结果

    四、注意小事项

    1. 测试临时域名的之前要先运行后端项目

    网址:cpolar - secure introspectable tunnels to localhost

  • 相关阅读:
    MySQL事务管理
    一文学会Set与Map以及集合类的使用选取,HashMap底层源码解析
    基于TextRank算法生成文本摘要有代码+数据+可直接运行
    Java运算符和表达式
    Windows环境将SpringBoot程序注册成为服务实现开机自启和后台运行
    Nuxt3环境变量配置
    java生产消费kafka消息
    C2_W3_Assignment_吴恩达_中英_Pytorch
    Git引起的 gitlab-runner 报错
    visual studio 2017创建Cmake项目,并修改默认工作目录
  • 原文地址:https://blog.csdn.net/ltt159264/article/details/138175129