Mybatis基于注解方式调用Mysql的存储过程

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();
		}
	}


你可能感兴趣的:(Mybatis基于注解方式调用Mysql的存储过程)