mybatis3.0调用oracle存储过程

昨天在项目经理那里得到了一个需求,所有业务逻辑都写在存储过程里面。

理由是:

1.以后出现业务上的变更,直接修改存储过程,而不用动项目。

2.在java中做业务逻辑判断需要与数据库交互多次,而用存储过程则可减少至一次,而且好的存储过程,执行效率高。

但是我个人觉得如果用存储功能,那就于数据库的依赖就太强了,提高了项目与数据库之间的耦合度,如果项目一旦换了数据库,那所有存储过程将重写。我层看过一个项目,所有的业务逻辑都用存储过程代替,包括登录校验返回的提示信息。

好像有点跑题了,言归正传:

mybatis3.0调用oracle存储过程,这里只说应该注意的,

<select id="isMember" statementType="CALLABLE" parameterType="com.sf.emp.web.services.InterfaceEntity">
	 {call emp_is_member.emp_isMember(#{mobileNumber,mode=IN,jdbcType=DECIMAL},#{mobileUserId,mode=OUT,jdbcType=DECIMAL},#{yys,mode=OUT,jdbcType=DECIMAL},#{areaId,mode=OUT,jdbcType=DECIMAL},#{memberGrade,mode=OUT,jdbcType=DECIMAL},#{isMember,mode=OUT,jdbcType=INTEGER})}
	</select>

 statementType里的CALLABLE是标注此sql为存储过程 parameterType是标注要传的参数,看了一些资料,有些同志在这里并没有写parameterType,但是也成功了,不过他们传的是map,这里咱先不管,严谨一点总是好的,还是加上。原来以为有传参,就应该有resultMap回参,但是当我在java中这样写时:

/**
	 * 判断是否是会员并返回会员等级
	 * @param iphone 电话号
	 */
	public InterfaceEntity isMember(String mobileUser){
		InterfaceEntity ie = new InterfaceEntity();
		ie.setMobileNumber(mobileUser);
		return  skToEmpDao.getSqlSession().selectOne("SkToEmpMapper.isMember",ie);
			}

 返回的是null,后来仔细一想,存储过程是只传值不返回的,返回的那个是函数,所以我们要接受的返回的东西,应该在我们传给他的参数里,也就是说调用存储过程后,所以可以写成:

/**
	 * 判断是否是会员并返回会员等级
	 * @param iphone 电话号
	 */
	public InterfaceEntity isMember(String mobileUser){
		InterfaceEntity ie = new InterfaceEntity();
		ie.setMobileNumber(mobileUser);
		skToEmpDao.getSqlSession().selectOne("SkToEmpMapper.isMember",ie);
		return ie;
	}

 语言组织的不太好,请谅解。转载请注明出处

 http://shen84121062.iteye.com/blog/1213857

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值