我之前已经问过这个问题 - 并没有真正找到一个有效的解决方案,而这可能是我自己的问题,因为当时并不知道,我到底想做什么。
请不要将此标记为副本,因为我打算在其中包含更好的信息。
这是我的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
答案 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>
在语义上意图是删除,即使没有技术影响,也可以更好地使用关键字。如果没有要映射的结果,则不需要结果映射。