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