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();
mit();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.toString());
} finally {
if (sqlSession != null)
sqlSession.close();
}
}