1. 程式人生 > >mybatis批量修改 (update的值也是動態的)

mybatis批量修改 (update的值也是動態的)

最近公司有個業務:統計裝置app的線上狀態,寫了個心跳,每分鐘獲取app的狀態,主要是分為: (1)內網線上  (2)外網線上  (3)第三方網路 (4)離線。放在集合裡,然後我在批量修改每個裝置的onlineState的標識狀態。這就要動態的批量修改onlineState中的值,但是mybatis並不支援  set  onlineState = ? 的修改(onlineState是動態的)。然後通過查閱相關資料,通過mysql的case when then 來實現的。具體的實現如下:

一:mySql Case函式

SELECT  SUM(population), 
        CASE country 
                WHEN '中國'     THEN '亞洲' 
                WHEN '印度'     THEN '亞洲' 
                WHEN '日本'     THEN '亞洲' 
                WHEN '美國'     THEN '北美洲' 
                WHEN '加拿大'  THEN '北美洲' 
                WHEN '墨西哥'  THEN '北美洲' 
        ELSE '其他' END 
FROM    Table_A 

二:動態批量修改:DeviceMapper.xml

<!-- 批量修改裝置線上狀態 -->
   <update id="updateBatchOnlineState" parameterType="java.util.List">
  	 update t_device 
     	set online_state = case device_no
     		<foreach collection="list" item="item">  
       			 WHEN #{item.deviceNo} THEN #{item.onlineState}  
    		</foreach>
	     END 
	 	 where 
	 	 	device_no in 
		<foreach collection="list" open="(" separator="," close=")" item="device">
			#{device.deviceNo}
		</foreach>
  </update>

三:動態批量修改:DeviceMapper.java

int updateBatchOnlineState(List<Device> list);

四:控制層(xxxxController)

//線上裝置編號  前端300秒呼叫一次 ,服務端640秒認為過期
		List<String> deviceNos = DeviceCache.getDeviceNo(640);
		List<Device> list = new ArrayList<Device>();
		if (CollectionUtils.isNotEmpty(deviceNos)) {
			for (String str : deviceNos) {
				Device device = new Device();
				int indexOf = str.lastIndexOf("-");
				String deviceNo = str.substring(0, indexOf);
				String type = str.substring(indexOf+1, str.length());
				device.setDeviceNo(deviceNo);
				device.setOnlineState(Integer.valueOf(type));
				list.add(device);
			}
			int row = deviceService.updateBatchOnlineState(list);
			if (row < 1) {
				logger.debug("批量修改失敗!");
			} else {
				logger.debug("批量修改成功,已實時獲取裝置線上狀態!");
			}
		} else {
			logger.debug("目前沒有裝置線上!");
			deviceService.modifyAllNotOnline();
		}

五、最後,歡迎大家關注【碼農新銳】公眾號,加入我們一起來進階Java。