最近开始接触Oracle了接触的越多越感受到自己的渺小!(oracleg Ibatis)
昨天需要通过数据库查询一组数据数据中包含一个表中的一条数据个String类型的字符串想通过Oralce的存储过程实现
ibatis映射配置
<parameterMap id=parameterDJRYID class=javautilHashMap >
<parameter property=v_ryid jdbcType=INTEGER javaType=javalangInteger mode=IN/> //存储过程传入参数
<parameter property=PYR_IDS jdbcType=VARCHAR javaType=javalangString mode=OUT /> //存储过程传出参数
<parameter property=PYR_XMS jdbcType=VARCHAR javaType=javalangString mode=OUT/> //存储过程传出参数
<parameter property=MY_CUR jdbcType=ORACLECURSOR javaType=javasqlResultSet mode=OUT/> //存储过程传出参数
</parameterMap>
<procedure id=P_DJ_GETRYANDPYRBYRYID parameterMap=parameterDJRYID resultClass=javautilHashMap>
{call P_DJ_GETRYANDPYRBYRYID(?)} //我的存储过程
</procedure>
Service类调用Ibatis的代码
Map paramMap = new HashMap();
paramMapput(v_ryid primaryKey);
List <DjRy> list = DBUtilgetObjectList(T_Dj_RyP_DJ_GETRYANDPYRBYRYID paramMap); //这个是我们自己封装的工具主要操作Ibatis这里可以看成Ibatis查询并返回List结果
Map<String Object> map = new HashMap<String Object>();
mapput(PYR_IDS paramMapget(PYR_IDS)); //传回的两个参数
mapput(PYR_XMS paramMapget(PYR_XMS));
mapput(MY_CUR list);
至于我的存储过程就不写出来了没什么需要特殊写明的只是数据库的一些关联查询比较麻烦就不贴出来了
运行起来后没成功
提示的错误信息要求检查输出类型
Check the output parameters (register output parameters failed)
Cause: javasqlSQLException: 无效的列类型
在Google上百度了一下大部分的人问题的原因都是在Ibatis映射配置时传入传出的参数中jdbcType与JavaType的类型不正确可是我多番验证我的类型是正确的同时我将传出的参数一个个的减少直到没有传出参数才能正常运行真的郁闷了
经过几个小时的纠结终于发现问题的所在了
在Ibatis映射配置中当我调用存储过程中需要使用?进行参数的占位符而这个参数不能只写入参还要写出参
也就是说我的Ibatis映射配置中调用存储过程的代码应该这样写
{call P_DJ_GETRYANDPYRBYRYID(????)}
欲哭无泪啊!!!!
这样程序终于运行起来了生活还要继续问题还要继续产生啊!
现在是能够在数据库端将数据返回了返回的结果是个String类型的字符串一个结果集现在我要实现的效果是将结果集给一个list<DjRy>(DjRy是我的Javabean类)那个字符串就不用理会了
可是我怎么给DjRy这个类都不接受!出错了
纠结一番明白了
原来我在Ibatis映射配置中定义的存储过程的返回值为HashMap(下面红色的字体)
<procedure id=P_DJ_GETRYANDPYRBYRYID parameterMap=parameterDJRYID resultClass=javautilHashMap>
{call P_DJ_GETRYANDPYRBYRYID(????)} //我的存储过程
</procedure>
而这个返回值只是指我个返回值中结果集的返回值所以说我返回的结果集是以Hashmap的类型存在的当我将list中的每一个元素给javabean时就会发生类型转换错误
此处需要将定义存储过程的代码改为
<procedure id=P_DJ_GETRYANDPYRBYRYID parameterMap=parameterDJRYID resultMap=DjRyResult>
{call P_DJ_GETRYANDPYRBYRYID(????)}
</procedure>
DjRyResult就是我的Ibatis中针对DjRy定义的resultMap这样我就可以将返回的结果集传递给DjRy的List中进行遍历了
还有我的paramMap中在数据库操作之前需要将参数存入在操作数据库之后paramMap中会存放返回值中非结果集的参数(包括入参出参)而在ibatis中定义的出参MY_CUR其实在paramMap中是null值而list中存放的却是我的结果集返回值所以在获取返回的参数时才会按照下面的方式进行
mapput(PYR_IDS paramMapget(PYR_IDS)); //传回的两个参数
mapput(PYR_XMS paramMapget(PYR_XMS));
mapput(MY_CUR list);
这样也产生了新的问题当我们在开发过程中如果要返回个结果集(或者说存储过程中要返回个游标)又要怎么处理呢?这个还真没想到!谁要是知道互相交流一下啊!
真不容易啊就这些弄了一天落后就要折腾啊!