mycat mybatis 调用带输出参数的存储过程,及跳坑说明

本文探讨了在未使用Mycat与使用Mycat环境下调用存储过程的差异,重点介绍了Mycat环境下存储过程的正确写法,以及如何避免自动映射问题,确保输出结果正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

未使用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的自动映射还是有点问题的


 

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你好龙卷风!!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值