Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过mybatis向SQL存储过程发送java对象列表?_Java_Stored Procedures_Mybatis - Fatal编程技术网

通过mybatis向SQL存储过程发送java对象列表?

通过mybatis向SQL存储过程发送java对象列表?,java,stored-procedures,mybatis,Java,Stored Procedures,Mybatis,我以前问过这个问题——最终没有找到有效的解决方案,这可能是我自己的问题,因为当时我不知道自己到底想做什么 请不要将此标记为重复,因为我打算在其中包含更好的信息 以下是我的映射器xml: <select id="deleteItems" resultMap="BaseResultMap"> exec [dbo].[PR_ItemsForDeletion_Delete] </select> 现在,我们可以忽略这里的结果图,我相信-因为我不关心我会得到什么 现在,看到

我以前问过这个问题——最终没有找到有效的解决方案,这可能是我自己的问题,因为当时我不知道自己到底想做什么

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

以下是我的映射器xml:

<select id="deleteItems" resultMap="BaseResultMap">
    exec [dbo].[PR_ItemsForDeletion_Delete]
</select>
现在,我们可以忽略这里的结果图,我相信-因为我不关心我会得到什么

现在,看到那个存储过程了吗?我没有写它——我也没有访问代码的权限——但我确实知道它是有效的

存储过程获取项目列表。我需要通过以下考试:

List<CustomDeletableObject>
相信存储过程是有效的,使用映射器,我只想执行映射XML,并向它传递一个列表,但我完全不知道从哪里开始

非常感谢你,我已经用我的头撞了这个好几个小时了

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

私人长id-这只是我们使用的id。私有标记-我们实际存储的数据

存储过程,我没有访问查询本身的权限,但本质上它是删除表中与我们希望通过myBatis提供给它的列表中的项目相匹配的每个项目

这就是我计划给地图绘制者打电话的方式

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

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

    return false;
}
以下是我试图使用的存储过程:为了安全起见,表名已被无意义的表标记替换

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
您需要扩展BaseTypeHandler,特别是setNonNullParameter方法,还不算太坏,但要多看看

看来你所需要的已经很接近了

这是要放入类型处理程序方法中的特定于驱动程序的JDBC代码

在调用中的参数绑定中引用类型处理程序

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

从语义上讲,意图是删除,最好使用关键字,即使没有技术影响。如果没有要映射的结果,则不需要使用结果映射。

谢谢您提供的信息-因此没有真正的方法将实际列表传递给存储过程?我需要传递一个数组?第一个例子是关于为Oracle数组编写一个类型处理程序,这只是为了说明如何实现,不要把重点放在这一点上,而是泛化。在您的情况下,您可能会从列表中构建SQLServerDataTable第二个链接,在类型处理程序实现中复制/粘贴,然后再进行几次修改就足够了。谢谢-我会调查的。这是有史以来最难开始工作的事情。我已经做了14个星期了