mysql 儲存過程,以及mybatis如何呼叫

weixin_33816946發表於2016-08-30

說道儲存過程,很多人都知道,但是真正用的人其實很少,但是在某些必要的場景,是必須使用的,雖然可以使用java程式碼解決,但是效率效能遠不及儲存過程

曾經在sqlserver 以及pgadmin上用過,mysql還真沒使用過,今天遇到這樣的場景那就使用一次吧

場景:訂單自動失效,定時任務跑批的時候會查詢出失效的訂單,根據失效的訂單中的相關item的id,再做相應的處理

begin
     declare cargoSourceId varchar(20);
    
     declare done int;
     declare cur_test CURSOR for select cargo_source_id from orders where order_status = '10' and datediff(NOW(),update_time)>=3;
     declare continue handler FOR SQLSTATE '02000' SET done = 1;
     
         open cur_test;
         repeat
             fetch cur_test into cargoSourceId;
                         # 將要取消的失效對於的貨源全部更新為“未下單”狀態
             update cargo_source set is_ordered=0,update_time=now() where id=cargoSourceId;
         until done end repeat;
         close cur_test;
            # 失效訂單
            update orders set order_status='50', update_time=now() where order_status = '10' and datediff(NOW(),update_time)>=3;

 end

mybatis呼叫:

<!-- 呼叫儲存過程 -->
    <update id="updateOrderInvalidAfter3Days" statementType="CALLABLE">
         CALL updateOrderInvalidAfter3Days
     </update>

service呼叫:

@Autowired
    private OrdersMapper ordersMapper;
    
    @Override
    public void updateOrderInvalidAfter3Days() {
        int result = ordersMapper.updateOrderInvalidAfter3Days();
        System.out.println(result);
    }

tips:同樣的結果不同的手段,使用更優的手段來解決問題,幾年前我會選擇方便自己的做法,而現在要更多的考慮專案。

 

相關文章