未使用mycat调用存储过程时的写法
<select id="test" parameterType="com.thinkgem.jeesite.modules.sys.entity.UserVo"
statementType="CALLABLE" resultType="com.thinkgem.jeesite.modules.sys.entity.UserVo">
<![CDATA[
{call test(
#{beginDate,mode=IN,jdbcType=VARCHAR},
#{endDate,mode=IN,jdbcType=VARCHAR},
#{userId,mode=IN,jdbcType=VARCHAR},
#{officeId,mode=IN,jdbcType=VARCHAR},
#{overdueNum,mode=OUT,jdbcType=INTEGER},
#{handleNum,mode=OUT,jdbcType=INTEGER},
#{claimNum,mode=OUT,jdbcType=INTEGER},
#{alreadyHandleNum,mode=OUT,jdbcType=INTEGER},
#{createWkstNum,mode=OUT,jdbcType=INTEGER},
#{backNum,mode=OUT,jdbcType=INTEGER},
#{visitNum,mode=OUT,jdbcType=INTEGER},
#{registNum,mode=OUT,jdbcType=INTEGER}
)}
]]>
</select>
使用了mycat之后还这样写的话会报错
应该这样写
<select id="test" parameterType="com.thinkgem.jeesite.modules.sys.entity.UserVo"
resultType="com.thinkgem.jeesite.modules.sys.entity.UserVo">
<![CDATA[
/*!mycat:sql=SELECT 1 FROM crm_worksheet WHERE user_id = ${userId} */
call test(
#{beginDate,mode=IN,jdbcType=VARCHAR},
#{endDate,mode=IN,jdbcType=VARCHAR},
#{userId,mode=IN,jdbcType=VARCHAR},
#{officeId,mode=IN,jdbcType=VARCHAR},
@overdueNum,
@handleNum,
@claimNum,
@alreadyHandleNum,
@createWkstNum,
@backNum,
@visitNum,
@registNum
);
select
@overdueNum as overdueNum,
@handleNum as handleNum,
@claimNum as claimNum,
@alreadyHandleNum as alreadyHandleNum,
@createWkstNum as createWkstNum,
@backNum as backNum,
@visitNum as visitNum,
@registNum as registNum;
]]>
</select>
注意点:
1.没有callable
2.前面的 /*!mycat:sql=SELECT 1 FROM tb_day_transaction WHERE user_id = ${userId}*/
参考mycat的注解,官网的学习文档里就有,
3.mycat 的注解就是告诉 mycat 后面的语句是在哪个 db 数据库进行执行,所以要求存储过程的内容一定得是同一个数据库里的数据进行的操作, 其实写成这样也行 /*!mycat:sql=SELECT 1 =1 */
4.mycat 有些语句是不支持的,比如 insert into …… select ……,具体可以网上找。使用存储过程可以避免这点
跳坑,关于mycat的自动映射问题,
之前没用mycat的时候为了少写点代码我的输入和输出参数全部用的是同一个实体,得到结果的时候的没有接受而是自动映射到这个UserVo实体上去了,但用了mycat就不行了,输出结果本来是8个,结果就出来一个
左边是我没用mycat时候service层的写法,
右边是我用了mycat之后又重新接收重新赋值的写法。
按照右边的写法就出来了,mycat的自动映射还是有点问题的