Mybatis基于注解方式调用Mysql的存储过程
jopen
10年前
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