调用带有MyBatis的Oracle存储过程(Calling Oracle stored proce

2019-08-18 01:44发布

我在到甲骨文,从SQL Server 2008中移动我们的数据库的过程,但不能得到MyBatis的工作。

考虑下面的例子:

UserMapper.xml(实施例)

<resultMap type="User" id="UserResult">
    <id property="userId" column="userId"/>
    <result property="firstName" column="firstName"/>
    <result property="lastName" column="lastName"/>
</resultMap>

<select id="getUsers" statementType="CALLABLE" resultMap="UserResult">
    {CALL GetUsers()}
</select>

UserDAO.java

public interface UserDAO {
    public List<User> 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游标?

这是我的尝试:

<resultMap type="User" id="UserResult">
    <id property="userId" column="userId"/>
    <result property="firstName" column="firstName"/>
    <result property="lastName" column="lastName"/>
</resultMap>

<select id="getUsers" statementType="CALLABLE" resultMap="UserResult">
    {CALL GetUsers(#{resultSet,mode=OUT,jdbcType=CURSOR,resultMap=UserResult})}
</select>

我得到这个错误:

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'

Answer 1:

结果地图上看起来是这样的:

<resultMap id="UserResult" type="User">
    <id property="userId" column="userId"/>
    <result property="firstName" column="firstName"/>
    <result property="lastName" column="lastName"/>     
</resultMap>

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

<select id="getUsers" statementType="CALLABLE" parameterType="java.util.Map"> 
    {call GetUsers(#{users, jdbcType=CURSOR, javaType=java.sql.ResultSet, mode=OUT, resultMap=UserResult})} 
</select>

你的映射器接口看起来是这样的,它看起来像您正在调用这个DAO。 我已经在过去做了它的方式是使被注入DAO一个映射器接口和DAO就是呼吁映射器的方法。 下面是一个例子映射器接口:

public interface UserMapper {
    public Object getUsers(Map<String, Object> params);
}

然后,该映射类将得到注入到DAO类,并作出这样的呼吁:

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


Answer 2:

获得使用的MyBatis从Oracle 11一个结果/ iBATIS的3是一个真正的古怪过程。 这是没有意义的我,但它的工作。 我的例子是不同的,但你会得到的想法:

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");

<resultMap id="productResultMap" type="test.Product">
</resultMap>

<select id="selectProductAllOracleStoredProc" parameterType="java.util.Map" statementType="CALLABLE">
    {call SP_GET_ALL_STORED_PROC(#{key, jdbcType=CURSOR, mode=OUT, javaType=java.sql.ResultSet,resultMap=productResultMap})}
</select>


Answer 3:

只是除了CLAV的评论,Snoozy,您需要从删除的resultSet

<select id="getUsers" statementType="CALLABLE" resultMap="UserResult">
    {CALL GetUsers(#    {resultSet,mode=OUT,jdbcType=CURSOR,resultMap=UserResult})}

并更改为“关键”,如:

<select id="getUsers" statementType="CALLABLE" resultMap="UserResult">
    {CALL GetUsers(#{key,mode=OUT,jdbcType=CURSOR,resultMap=UserResult})}
</select>

我希望是有益的。



Answer 4:

我也得到了同样的错误。

org.apache.ibatis.reflection.ReflectionException:由造成有在“类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被定义为

<resultMap type="java.util.LinkedHashMap" id="inquiryResult">
<result property="name" jdbcType="VARCHAR" javaType="String" column="name"/>

挣扎了一天,但,当我调试,它是一个简单的错误,我做了。 我的价值目标是通过为空到我的映射类。 查询得到了执行,甚至我的VO是零,因为MyBatis的值传递为空。 但是,当MyBatis的努力结果设置为我的VO,既然是空,它被扔在上面的错误。

希望这是有用的信息



文章来源: Calling Oracle stored procedures with MyBatis