使用MyBatis调用Oracle存储过程

我正在从SQL Server 2008将数据库移动到Oracle,但无法使MyBatis工作。

给出以下示例:

UserMapper.xml (示例)

      {CALL GetUsers()}  

UserDAO.java

 public interface UserDAO { public List getUsers(); } 

SQL Server过程

 CREATE PROCEDURE [dbo].[GetUsers] AS BEGIN SET NOCOUNT ON; SELECT userId, firstName, lastName FROM Users END 

…适用于SQL Server 2008.有人可以向我解释如何从UserMapper.xml调用Oracle过程(与上面的SQL Server过程具有相同的名称和列)并使用Oracle游标填充我的User类?

这是我试过的:

       {CALL GetUsers(#{resultSet,mode=OUT,jdbcType=CURSOR,resultMap=UserResult})}  

我收到此错误:

 Caused by: org.apache.ibatis.reflection.ReflectionException: Could not set property 'resultSet' of 'class java.lang.Class' with value 'oracle.jdbc.driver.OracleResultSetImpl@476d05dc' Cause: org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'resultSet' in 'class java.lang.Class' 

结果映射如下所示:

      

在select语句中,将参数类型更改为java.util.Map。

  

你的mapper界面看起来像这样,看起来你现在称之为DAO。 我过去做的方式是创建一个映射到DAO的映射器接口,DAO调用映射器上的方法。 这是一个示例映射器接口:

 public interface UserMapper { public Object getUsers(Map params); } 

然后将该映射器类注入DAO类并进行如下调用:

 public List getUsers() { Map params = new HashMap(); ResultSet rs = null; params.put("users", rs); userMapper.getUsers(params); return ((ArrayList)params.get("users")); } 

使用MyBatis / iBATIS 3从Oracle 11获取结果集是一个非常古怪的过程。 这对我来说毫无意义,但它确实奏效了。 我的例子不同,但你会明白这个想法:

 create or replace PROCEDURE SP_GET_ALL_STORED_PROC (l_cursor out SYS_REFCURSOR) IS BEGIN open l_cursor for select account_id, totalLegs, born, weight, mammal, animal from copybittest; END SP_GET_ALL_STORED_PROC; Map map = new HashMap(); session.selectList("ibatis_3_test.selectProductAllOracleStoredProc", map); List productList = (List) map.get("key");    

只是对clav的评论,Snoozy的补充,你需要从中删除resultSet

  

并将其更改为“key”,如:

  

我希望这很有帮助。

我也有同样的错误。

引起:org.apache.ibatis.reflection.ReflectionException:’class java.lang.Class’中没有名为’columnNames’的属性的setter

在mapper.java中getSearchResult(searchCriteriaVO vo)

在mapper.xml中

  #{userId, mode=IN, jdbcType=VARCHAR}, #{resultList, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=inquiryResult}, 

其中inquiryResult定义为

   

苦苦挣扎了一天但是当我调试时,我犯了一个简单的错误。 我的Value Object作为null传递给我的mapper类。 即使我的VO为null,查询也会被执行,因为mybatis将值传递为null。 但是当mybatis试图将结果设置为我的VO时,因为它是null,所以它抛出了上述错误。

希望这是有用的信息