很多初學者習慣把所有SQL寫在MyBatis的XML映射文件中,但存儲過程的定義必須在資料庫端創建,應用層僅保留調用語句。
-- 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;/
<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>
User queryUser(@Param("id") Long id);
| 錯誤做法 | 正確做法 |
|---|---|
| 把CREATE PROCEDURE寫在XML裡 | 資料庫工具執行DDL腳本 |
XML用<select>不指定statementType="CALLABLE" | 必須聲明CALLABLE類型 |
OUT參數未配置jdbcType | 游標類型需jdbcType=CURSOR |
pkg_業務域.動作_對象