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