首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MyBatis項目中存儲過程的正確放置與調用姿勢

     編輯:程式設計疑難解答

存儲過程屬於資料庫層,而非應用層

很多初學者習慣把所有SQL寫在MyBatis的XML映射文件中,但存儲過程的定義必須在資料庫端創建,應用層僅保留調用語句。

標準部署流程

  1. 資料庫端創建:
    -- Oracle 範例
    CREATE OR REPLACE PACKAGE pkg_user AS
      PROCEDURE query_user(p_id IN NUMBER, p_cursor OUT SYS_REFCURSOR);
    END pkg_user;
    /
    
    CREATE OR REPLACE PACKAGE BODY pkg_user AS
      PROCEDURE query_user(p_id IN NUMBER, p_cursor OUT SYS_REFCURSOR) IS
      BEGIN
        OPEN p_cursor FOR SELECT * FROM users WHERE id = p_id;
      END;
    END pkg_user;/
  2. MyBatis XML中調用:
    <select id="queryUser" statementType="CALLABLE" resultMap="userMap">
      {call pkg_user.query_user(#{id, mode=IN}, #{cursor, mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet})}
    </select>
  3. Mapper接口定義:
    User queryUser(@Param("id") Long id);

常見誤區

錯誤做法正確做法
把CREATE PROCEDURE寫在XML裡資料庫工具執行DDL腳本
XML用<select>不指定statementType="CALLABLE"必須聲明CALLABLE類型
OUT參數未配置jdbcType游標類型需jdbcType=CURSOR

最佳實踐建議

  • 存儲過程命名規範:pkg_業務域.動作_對象
  • 複雜業務邏輯優先考慮Service層實現,存儲過程僅用於極高性能/跨應用共享場景
  • 版本控制:DDL腳本納入Flyway/Liquibase管理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved