mycat结合mybatis调用存储过程
mycat调用存储过程,项目示例,已经测试通过的。
<select id="callArchiveData" parameterType="com.hundsun.cloudtrade.match.dto.req.CallArivateDataReq"
resultType="com.hundsun.cloudtrade.match.dto.req.CallArivateDataReq">
<![CDATA[
/*!mycat:sql=SELECT 1 FROM tb_day_transaction WHERE firm_account = ${firm_account} */
{CALL ARCHIVE_DATA(
#{firm_account,mode=IN,jdbcType=INTEGER},
#{hold_date,mode=IN,jdbcType=INTEGER},
@p_error_no,
@p_error_info
)};
SELECT @p_error_no as p_error_no,@p_error_info as p_error_info;
]]>
</select>
注意点:
1.没有callable
2.前面的 /*!mycat:sql=SELECT 1 FROM tb_day_transaction WHERE firm_account = ${firm_account} */ 参考mycat的注解,官网的学习文档里就有
3.mycat 有些语句是不支持的,比如 insert into …… select ……,具体可以网上找。使用存储过程可以避免这点
4.mycat 的注解就是告诉 mycat 后面的语句是在哪个 db 数据库进行执行,所以要求存储过程的内容一定得是同一个数据库里的数据进行的操作
mycat多语句操作
无意间测试发现的问题:mybatis 支持多语句同时操作数据库,比如:
<update id="clearData" parameterType="com.hundsun.cloudtrade.match.dto.req.ClearDataReq">
<![CDATA[
DELETE FROM tb_day_transaction WHERE firm_account = #{firm_account};
UPDATE tb_conf_tradedays SET init_flag=0,clear_flag=0 WHERE firm_account = 0;
]]>
</update>
但是,如果使用 mycat ,在实际的项目中表 tb_day_transaction 和表 tb_conf_tradedays 不在同一个数据库的话,会出现问题
在执行了第一条语句 DELETE FROM tb_day_transaction WHERE firm_account = #{firm_account}; 后,
mycat 还是会在同一个数据库下,执行 UPDATE tb_conf_tradedays SET init_flag=0,clear_flag=0 WHERE firm_account = 0;
可以拆开,分成两个 id 的 sql 来写