`

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

分享到:
评论
4 楼 shen84121062 2014-10-29  
Qin_Tianxiang 写道
谢谢,博文没有具体看,只是看了最后解决的几句话,最终帮助我解决了问题。
oracle存储过程没有直接回传,直接写入了你入参的对象中;
mysql存储过程,则会回传;

有帮助就好
3 楼 Qin_Tianxiang 2014-09-30  
谢谢,博文没有具体看,只是看了最后解决的几句话,最终帮助我解决了问题。
oracle存储过程没有直接回传,直接写入了你入参的对象中;
mysql存储过程,则会回传;
2 楼 yesewenrou 2014-03-19  
1 楼 java苏打粉 2011-12-31  
试了,报错呢~~

相关推荐

Global site tag (gtag.js) - Google Analytics