通过mybatis将SQL对象列表发送到SQL存储过程?

时间:2017-03-28 19:24:17

标签: java stored-procedures mybatis

我之前已经问过这个问题 - 并没有真正找到一个有效的解决方案,而这可能是我自己的问题,因为当时并不知道,我到底想做什么。

请不要将此标记为副本,因为我打算在其中包含更好的信息。

这是我的mapper xml:

<select id="deleteItems" resultMap="BaseResultMap">
    exec [dbo].[PR_ItemsForDeletion_Delete]
</select>

现在,我们可以忽略这里的结果图 - 因为我并不关心我要回来的东西(还是!)

现在,看看那个存储过程?我没有写它 - 我也无法访问代码 - 但我确实知道它有效。

存储过程采用项目列表。我需要传递以下内容:

List<CustomDeletableObject>

相信sproc工作,并且我只想用映射器执行映射XML - 并将列表传递给它,但我绝对不知道从哪里开始。

提前大声谢谢,我一直在敲打这个对我好几个小时。

自定义可删除对象类型包含两个属性:

private long id - 这只是我们使用的id。 private Sting token - 我们实际存储的数据。

存储过程,我无权访问查询本身 - 但实际上它的作用是删除表中的每个项目,这些项目与我们希望通过myBatis提供给它的列表中的项目匹配。

这就是我计划调用mapper的方式......

@Override 
public boolean deleteItems(List<CustomDeletableObject> tokens){

    // This method handles the deletion.
    jobMapper.deleteItems();

    return false;
}

以下是我尝试使用的存储过程:为了安全起见,表名已被替换为无意义的TABLE标记。

CREATE PROCEDURE [dbo].[PR_ItemsForDeletion_Delete]
    @pTokenList dbo.UDT_TokenDeletion READONLY
AS

BEGIN
    BEGIN TRY    
        IF EXISTS (SELECT TOP 1 1 FROM @pTokenList)
            BEGIN
                INSERT INTO <TABLE> (Token)
                SELECT
                    Token
                FROM @pTokenList tl
                WHERE NOT EXISTS
                (
                    SELECT TOP 1 1
                    FROM <TABLE> tp
                    WHERE tp.Token = tl.Token
                )
            END
    END TRY
    BEGIN CATCH
    ;THROW
    END CATCH
END

1 个答案:

答案 0 :(得分:0)

您需要扩展BaseTypeHandler和特殊setNonNullParameter方法。 Here is example,不是那么糟糕,但要注意更多。

您需要的是(接近)Table-Valued Parameter

这是驱动程序特定的JDBC代码,放在类型处理程序方法中。

在call。参数绑定中引用类型处理程序。

<delete id="deleteItems">
    exec dbo.PR_ItemsForDeletion_Delete #{list, typeHandler=com.fully.qualified.name.TokenListTypeHandler}
</delete>

在语义上意图是删除,即使没有技术影响,也可以更好地使用关键字。如果没有要映射的结果,则不需要结果映射。