批量或单个 删除主表的同时也删除子表业务处理

##场景:一个消防栓对应多个硬件设备,
##所以需要删除主表数据的同时,也要把子表的数据全部删除

	@Autowired
	private DevicesMapper devicesMapper;
	@Autowired
	private UserMapper userMapper;
	@Autowired
	private OnenetDeviceMapper onenetDeviceMapper;
	
	/**
	 * 批量或单个
	 * 逻辑删除消防设备表和硬件设备表的数据
	 * 先根据消防设备ID查询出所有硬件设备ID
	 */
	@Override
	@Transactional
	public int delete(String[] devicesId){
		for(String str:devicesId){
			String devicesID=str;
			List<OnenetDevice> list=onenetDeviceMapper.findAllDevice(devicesID);
			//创建一个字符串数组,用于存放硬件设备表的所有id
			String [] ids=new String [list.size()];
			//取出集合中的所有id存到数组中
			for(int i=0;i<ids.length; i++){
				ids[i]=list.get(i).getId();
			}
			//逻辑删除硬件表的所有数据
			int result=onenetDeviceMapper.deleteOnenetDevice(ids);
			//物理删除oneNet平台上的数据
			for(OnenetDevice od:list){
				String onenetDevicesId=od.getOnenetDevicesId();
				DeleteDeviceApi api = new DeleteDeviceApi(onenetDevicesId, CommonUtil.key);
				BasicResponse<Void> response = api.executeApi();
				System.out.println("errno:"+response.errno+" error:"+response.error);		
			}	
		}
		//最后逻辑删除消防设备表中的数据
		int iden=devicesMapper.delete(devicesId);
		return iden;
	}
 /**
  * 逻辑删除,可以批量
  */
 int delete(@Param("devicesId")String[] devicesId);
      <!--逻辑删除 可批量  -->
  <update id="delete">
  	update sys_devices 
  	<set>
  		status = 1
  	</set>
  	where devices_id in 
  		 <foreach item="devicesId" index="index"  collection="devicesId"  open="(" separator="," close=")">
	            #{devicesId}
       	 </foreach>
  </update>
	/**
	 * 批量删除
	 * @param onenetDevicesId
	 * @return
	 */
	public Integer deleteOnenetDevice(@Param("id")String[] id);
	
	<!-- 删除 -->
	<delete id="deleteOnenetDevice">
		update sys_onenet_device
		<set>
			status = 1
		</set>
			where id in
		<foreach item="id" index="index" collection="id" open="(" separator="," close=")">
  			#{id}
  		</foreach>
	</delete> 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是示例代码: ```java import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import javax.sql.DataSource; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; public class DataSourceSwitcher { private static final ThreadLocal<String> dataSourceKey = new ThreadLocal<>(); public static void setDataSourceKey(String dataSource) { dataSourceKey.set(dataSource); } public static String getDataSourceKey() { return dataSourceKey.get(); } public static void clearDataSourceKey() { dataSourceKey.remove(); } public static void executeWithDataSource(DataSource dataSource, Runnable runnable) { DataSourceSwitcher.setDataSourceKey(dataSource.getKey()); try { runnable.run(); } finally { DataSourceSwitcher.clearDataSourceKey(); } } public void deleteAndInsert(List<User> userList) { String dataSourceKey = DataSourceSwitcher.getDataSourceKey(); JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(DataSourceRegistry.getDataSource(dataSourceKey)); DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(DataSourceRegistry.getDataSource(dataSourceKey)); DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition); try { // delete jdbcTemplate.update("DELETE FROM user"); // batch insert jdbcTemplate.batchUpdate("INSERT INTO user (id, name, age) VALUES (?, ?, ?)", new BatchPreparedStatementSetter() { @Override public void setValues(PreparedStatement ps, int i) throws SQLException { User user = userList.get(i); ps.setString(1, user.getId()); ps.setString(2, user.getName()); ps.setInt(3, user.getAge()); } @Override public int getBatchSize() { return userList.size(); } }); transactionManager.commit(transactionStatus); } catch (Exception e) { transactionManager.rollback(transactionStatus); throw e; } } } ``` 在上面的代码中,我们使用了若依框架的事务管理器来控制多个 SQL 语句的执行过程。同时,我们通过 `DataSourceSwitcher` 类来切换数据源,并在执行 SQL 语句时使用预编译语句,以提高执行效率。 需要注意的是,`DataSourceSwitcher` 类中的 `setDataSourceKey()` 方法需要在切换数据源时调用,`executeWithDataSource()` 方法用于执行需要切换数据源的操作。在具体的业务代码中,我们可以这样使用: ```java DataSourceRegistry.registerDataSource("dataSource1", dataSource1); DataSourceRegistry.registerDataSource("dataSource2", dataSource2); // 切换到 dataSource1 数据源执行删除和插入操作 DataSourceSwitcher.executeWithDataSource(dataSource1, () -> { List<User> userList = getUserList(); // 获取需要插入的用户列 dataSourceSwitcher.deleteAndInsert(userList); }); // 切换到 dataSource2 数据源执行查询操作 DataSourceSwitcher.executeWithDataSource(dataSource2, () -> { List<User> userList = jdbcTemplate.query("SELECT * FROM user", new BeanPropertyRowMapper<>(User.class)); // do something with userList }); ``` 在具体的业务代码中,我们可以根据需要切换不同的数据源,并执行相应的 SQL 语句。同时,我们也可以使用 `jdbcTemplate` 来执行单个 SQL 语句,以便更好地控制数据源的切换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值