实列一:
需求:可以有多选框选择多个设备,分配给同一个责任人管理。(多对一,前端传来的数据是用,隔开的 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>