我在到甲骨文,从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