Mybatis基于注解方式調用Mysql的存儲過程

jopen 10年前發布 | 62K 次閱讀 MyBatis3 持久層框架 MyBatis

1,構建一個存儲過程

PROCEDURE qiyi_ma2.gen_ci_property_value ()
BEGIN
SET
SESSION group_concat_max_len = 10240
; DROP
    VIEW IF EXISTS v_ci_property_value
; SELECT
    GROUP_CONCAT(
        'ifnull(MAX(CASE WHEN property_id=' ,
        id ,
        ' THEN VALUE END), '') AS ' ,
        '' '' ,
        id ,
        'FIX' ,
        '' ''
    )
FROM
    PROPERTY_POOL INTO
        @s1
;
SET
@sql = CONCAT( 'CREATE VIEW v_ci_property_value AS SELECT CPV.ID AS id, 
        MAX(CI.CLASS_ID) AS CLASS_ID, 
        MAX(CI.EN_NAME) AS enName, ' ,@s1 ,'
        FROM CI_PROPERTY_VALUE CPV INNER JOIN CONFIG_ITEM CI ON CPV.ID = CI.ID 
        GROUP BY CPV.ID 
        ORDER BY CI.CLASS_ID' )
; SELECT
    @sql
; PREPARE stmt
FROM
@sql
; EXECUTE stmt
;
END
這個只是我自己的sql,沒有IO參數,應根據實際情況來處理。

2,DAO中,基于注解的調用接口

/**
     * 執行存儲過程gen_ci_property_value
     */
    @SuppressWarnings("rawtypes")
    @Select("call gen_ci_property_value()")
    @Options(statementType= StatementType.CALLABLE )
    public HashMap callGenCiPropertyValue();

本例中實際上不需要返回值,但是mybatis會有返回值,使用void會報錯,這里用HashMap兼容了。

使用的注解和查詢一樣,但是要指定statementType為CALLABLE。

3,Service層中的調用

public void save(ClassTree ct) throws RuntimeException {
        SqlSession sqlSession = null;
        try {
            sqlSession = sqlSessionFactory.openSession();
            sqlSession.getMapper(ClassTreeDao.class).callGenCiPropertyValue();          
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.toString());
        } finally {
            if (sqlSession != null)
                sqlSession.close();
        }
    }

來自:http://my.oschina.net/yygh/blog/288587

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!