java - 使用 MyBatis 调用 Oracle 存储过程

标签 java oracle mybatis ibatis database-cursor

我正在将我们的数据库从 SQL Server 2008 迁移到 Oracle,但无法让 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'

最佳答案

结果图如下所示:

<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。我过去的做法是制作一个映射器接口(interface),该接口(interface)被注入(inject)到 DAO 中,DAO 调用映射器上的方法。这是一个示例映射器接口(interface):

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

然后映射器类将被注入(inject)到 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"));
}

关于java - 使用 MyBatis 调用 Oracle 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15666856/

相关文章:

oracle - Oracle 中的假脱机会在列中添加空格...我该如何避免呢?

java - 使用@secured方法时为"An Authentication object was not found in the SecurityContext"

java - 使用 Play 2.0.4 设置 oracle 数据库

java - 使用 Oracle SQL Developer 调用存储过程

java - 连接表并将结果保存在 ArrayList-Attribute 中

java - 在服务中调用 DAO 时出现 AbstractMethodError 和 null maper

用于版本控制外部 API 的 Java 包命名

java - 复选框对齐 3 行

java - 如何使用jooq来表达mysql REGEXP?

java - Valgrind 和 Java