6

データベースを 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 プロシージャと同じ名前と列を持つ) を呼び出し、User クラスに 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'
4

4 に答える 4

9

結果マップは次のようになります。

<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"));
}
于 2013-03-27T18:54:07.447 に答える
1

MyBatis/iBATIS 3 を使用して Oracle 11 から結果セットを取得するのは、実に奇妙なプロセスです。私には意味がありませんが、うまくいきました。私の例は異なりますが、あなたはアイデアを得るでしょう:

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>
于 2013-06-06T10:59:10.547 に答える