我正在将我们的数据库从 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/