关于插入或更新之前进行检查的问题

tandy 2018-11-25 06:36:11
项目使用 spring+springMVC+mybatis3 框架。
最近遇到一个问题:

如何在更新或者插入之前,检查这条记录是否已经被更新或者插入????
各位是通过什么方式来解决这个问题的呢?

如果一个批量插入或者更新操作,没执行一次都要查询一次,性能上会有很大问题吧!
...全文
128 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
maradona1984 2018-11-26
  • 打赏
  • 举报
回复
唯一约束最简单
乐观锁就不能用mybatis的BatchExecutor,如果要用就单独写sqlSession去搞,用到spring的事务管理即可
或者你可以批量查询,比如用in or先查询出状态,然后再批量插入/更新,你只增加了一次查询
a_b_a_b_a_b_a_b 2018-11-26
  • 打赏
  • 举报
回复
试试数据库中写触发器呢?A表中的b_uuid插入值时,触发B表的插入操作?
maradona1984 2018-11-26
  • 打赏
  • 举报
回复
引用 6 楼 tandy 的回复:
[quote=引用 5 楼 maradona1984 的回复:]
唯一约束最简单
乐观锁就不能用mybatis的BatchExecutor,如果要用就单独写sqlSession去搞,用到spring的事务管理即可
或者你可以批量查询,比如用in or先查询出状态,然后再批量插入/更新,你只增加了一次查询


我使用了 SqlSession 作为批量执行器,但是我配置了这个以后,即便我不使用它进行批量执行,更新返回影响的行数依然是一个巨大的负数值

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"></property>
</bean>

<!-- 配置批量执行的 SqlSession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
<constructor-arg name="executorType" value="BATCH"></constructor-arg>
</bean>

[/quote]
我的意思是不用配置文件的方式来配置,而是直接代码中用sqlSession,毕竟批量操作比较少,单独拎出来
或者为批量操作单独写个配置
tandy 2018-11-26
  • 打赏
  • 举报
回复
引用 5 楼 maradona1984 的回复:
唯一约束最简单 乐观锁就不能用mybatis的BatchExecutor,如果要用就单独写sqlSession去搞,用到spring的事务管理即可 或者你可以批量查询,比如用in or先查询出状态,然后再批量插入/更新,你只增加了一次查询
我使用了 SqlSession 作为批量执行器,但是我配置了这个以后,即便我不使用它进行批量执行,更新返回影响的行数依然是一个巨大的负数值

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>
		<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"></property>
	</bean>
	
	<!-- 配置批量执行的 SqlSession -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
		<constructor-arg name="executorType" value="BATCH"></constructor-arg>
	</bean>

tandy 2018-11-25
  • 打赏
  • 举报
回复
引用 2 楼 00fly 的回复:
version 乐观锁
我的那个 b_uuid 其实就是一个乐观锁啦 但是我想通过判断这个字段是否为 NULL 去决定是不是要 进行后续的B表插入,我现在就是卡在不知道怎么获取 A 表的记录是否被更新。 通过查看影响行数,但是我用了批量操作,所以mybatis 给我返回的值是一个 巨大的负数。职能取消批量操作,但是我又不想这样做,因为我这个功能就是连续的批量执行。 总不能保留批量在插入一条前去查询一下吧 = =
爱码少年 2018-11-25
  • 打赏
  • 举报
回复
version 乐观锁
tandy 2018-11-25
  • 打赏
  • 举报
回复
我在项目中 有这样一个需要, 一张表 A 和一张表 B, 表 A 中有一个字段叫 b_uuid 初始值为 NULL, 如果这个 字段为 NULL 就将 表A 的部分内容插入到 表B,同时更新这个字段为表B的 UUID 代码逻辑实现大致为: 我首先更新表A 的 b_uuid 为 生成的UUID 值,更新条件带上了 AND b_uuid IS NULL; 也就是说更新时 如果这条记录 已经为NULL 了,就不能再更新了。 我想通过 mybatis 返回的影响行数 来判断是否有更新,然后再决定是否向 B 表插入值。 但是由于使用mybatis3 的 批量操作,这个返回值永远都是 -2147482646,
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
		<constructor-arg name="executorType" value="BATCH"></constructor-arg>
	</bean>
那么问题就来了,放弃使用 <constructor-arg name="executorType" value="BATCH"></constructor-arg>可以得到正确的影响行数的值, 但是这个功能 每次最多可能有几十条记录进行更新和插入,如果频繁的进行则性能上肯定会出现问题。 如果要想保留<constructor-arg name="executorType" value="BATCH"></constructor-arg>,则只能在更新和插入前先查询一下这条记录, 我也觉得这种方法甚为不妥。 这种情况该怎么处理?

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧