昨天在项目经理那里得到了一个需求,所有业务逻辑都写在存储过程里面。
理由是:
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; }
语言组织的不太好,请谅解。转载请注明出处