使用 MyBatis 调用 Oracle 存储过程

新手上路,请多包涵

我正在将我们的数据库从 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 服务器过程

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'

原文由 snoozy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 579
2 个回答

结果图如下所示:

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

原文由 clav 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

我希望这对您有所帮助。

原文由 Rahul Mishra 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题