1. 程式人生 > >ssm框架-批量修改的實現方式

ssm框架-批量修改的實現方式

實列一:

需求:可以有多選框選擇多個裝置,分配給同一個責任人管理。(多對一,前端傳來的資料是用,隔開的   eg:1,2,3    8)

分析:因為是多選,裝置需要封裝成List集合再將資料傳入到Controller層,然後進行業務處理

單表操作

第一步:編寫實體類,用於controller接受資料(專案中用到了tkmybatis所以不用寫get/set),將裝置id封裝成list

@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
public class HWChangeUser {
	
	private List<Integer> devid;

        private Integer moduleid;
	
	private Integer ownid;
	
}
第二步:編寫controller層(ApiResult公司專案統一要求返回的自定義型別,讀者可根據需求修改返回型別)
	//批量修改責任人
		@PostMapping("/hw/LKTHWChangeDevOwn")
		@Permissions("item:hw:update:LKTHWUpdateDev")
		public ApiResult LKTHWChangeUsersDev(HWChangeUser hWChangeUser) throws MyException {
			
			return ApiResult.resultInfo("1", "成功", lktService.changeDevOwn(hWChangeUser));

		}

第三步:編寫service層,返回Integer型別

Integer changeDevOwn(HWChangeUser hWChangeUser);

第四步:編寫serviceimpl層

@Override
	public Integer changeDevOwn(HWChangeUser hWChangeUser) {
		
		return lKTMapper.changeDevOwn(hWChangeUser);
	}

第五步:編寫Mapper層 @Param一定要加不然Mapper.xml會找不到傳來的屬性值,呼叫該介面會報錯

Integer changeDevOwn(@Param("hWChangeUser") HWChangeUser hWChangeUser);

第六步:編寫Mapper.xml寫SQL語句(重點) hWChangeUser要與Mapper層@Param(hWChangeUser)一致

另外parameterType="java.util.List可以不寫。因為在mapper介面中採用註解@Param(hWChangeUser)的方式將引數註解進去

<update id="changeDevOwn" parameterType="java.util.List">
		UPDATE t_device_hw SET
		own_id=#{hWChangeUser.ownid} WHERE id in
		<foreach collection="hWChangeUser.devid" index="index" item="item"
			open="(" separator="," close=")">
			#{item}
		</foreach>
	</update>

實列二:

需求:選擇多個裝置關聯上多個視訊(多對多,前端傳來的資料是用,隔開的   eg:1,2,3    4,5,6)

分析:因為是多選,裝置和視訊需要封裝成List集合再將資料傳入到Controller層,然後進行業務處理

多表操作

第一步:編寫實體類,用於controller接受資料(專案中用到了tkmybatis所以不用寫get/set),將裝置id和視訊封裝成list
@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
public class DevRelationVideoParam{
	
	private List<Integer> devId;

	private Integer moduleid;
	
	private List<Integer> videoId;
	
	private Integer ownid;
	
}
第二步:編寫controller層(ApiResult公司專案統一要求返回的自定義型別,讀者可根據需求修改返回型別)
	// 裝置關聯攝像頭
	@PostMapping("/video/devConectVideo")
	@Permissions("video:devConectVideo")
	public ApiResult devConectVideo(DevRelationVideoParam param) throws MyException {
		Integer result = videoService.devConectVideo(param);
		return ApiResult.resultInfo("1", "成功", result);
	}
第三步:編寫service層,返回Integer型別
	//裝置分配到攝像機
	Integer devConectVideo(DevRelationVideoParam param) throws MyException;
	
第四步:編寫serviceimpl層
	// 多個裝置分配到多個攝像頭
	@Override
	public Integer devConectVideo(DevRelationVideoParam param) throws MyException {
		for (int i = 0; i < param.getDevId().size(); i++) {
			for (int j = 0; j < param.getVideoId().size(); j++) {
				tDevVideoRelationMapper.delDevVideorelationship(param); //刪除傳入進來的視訊和表中的資料一樣了
				TDevVideoRelation tDevVideoRelation = new TDevVideoRelation();
				tDevVideoRelation.setDeviceid(param.getDevId().get(i));
				tDevVideoRelation.setVideoid(param.getVideoId().get(j));
				tDevVideoRelation.setIsdelete(0);
				tDevVideoRelation.setModuleid(param.getModuleid());
				tDevVideoRelationMapper.insert(tDevVideoRelation); //直接呼叫tkmybatis的insert方法(傳入實體類)
			}
		}
		return 1;
	}
第五步:編寫Mapper層 @Param一定要加不然Mapper.xml會找不到傳來的屬性值,呼叫該介面會報錯
public interface TDevVideoRelationMapper extends Mapper<TDevVideoRelation>{

	//把重複分配的攝像頭從攝像頭裝置關聯表中刪除
	Integer delDevVideorelationship(@Param("param") DevRelationVideoParam param);

public interface InsertMapper<T> {

    /**
     * 儲存一個實體,null的屬性也會儲存,不會使用資料庫預設值
     *
     * @param record
     * @return
     */
    @InsertProvider(type = BaseInsertProvider.class, method = "dynamicSQL")
    int insert(T record);//直接呼叫tkmybatis的insert方法  不用寫xml檔案了

}

第六步:編寫Mapper.xml寫SQL語句(重點) param要與Mapper層@Param(param)一致(刪除和資料庫表中一樣的資料,避免重複)

<mapper namespace="com.hot.manage.db.video.TDevVideoRelationMapper">
    <delete id="delDevVideorelationship">
        DELETE FROM t_dev_video_relation WHERE
        deviceid=#{param.devId} AND videoid=#{param.videoId} AND
        moduleid=#{param.moduleid}
    </delete>
</mapper>