springBoot 数据库表新增修改通用判断字段数据重复

让数据库表新增修改判断重复不再繁琐


前言

写后台程序我们主要就是增删改查,而增改的时候就要进行判断重复,重复的代码写起来也是很烦的,想到这里我决定思考一下解决这个问题,起码要用少量的代码去判断重复,那么如何实现了,于是乎我想到了用java反射去实现。

一、主要实现思路

我们知道springBoot 使用的mybatis-plus按标准的模板封装好的,每次我们的mapper层都继承了BaseMapper,而service层则继承了IService,那么我们就可以从这里下手,利用反射实现我们要传入的类当作泛型T,在工具里接受各种service实现类就行了下面看代码:

package com.home.lh.util.sysutil;

import java.lang.reflect.Field;
import java.util.List;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;

@Component
@Order(4)
public class ClassUtil<T> {

	/**
	 * 新增时排重
	 * 
	 * @param <T>
	 * @param u
	 * @return
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 */
	public boolean addIsHave(T o, IService<T> service) throws IllegalArgumentException, IllegalAccessException {
		QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
		Boolean result = false;

		for (Field field : o.getClass().getDeclaredFields()) {
			field.setAccessible(true);
			// 获取字段的值
			// System.out.println(field.getName() + ":" + field.get(o) );
			String value = field.getType().toString();
			// System.out.println(value);
			if (!field.getName().equals("serialVersionUID") && field.get(o) != null && !value.equals("boolean")) {
				boolean isTableField = field.isAnnotationPresent(TableField.class);
				if (isTableField) {
					TableField tableField = field.getAnnotation(TableField.class);

					String fieldValue = tableField.value();
					System.out.println(fieldValue + "&&&&&&" + field.getName() + "&&&&&&&&&" + field.get(o));

					queryWrapper.eq("" + fieldValue + "", field.get(o));
				}
			}
		}
		List<T> list = service.list(queryWrapper);
		if (list.size() > 0) {
			result = true;
		}
		return result;

	}

	/**
	 * 更新时排重
	 * @param o
	 * @param service
	 * @param id
	 * @return
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public boolean updateIsHave(T o, IService<T> service, String id)
			throws IllegalArgumentException, IllegalAccessException {
		QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
		Boolean result = false;

		for (Field field : o.getClass().getDeclaredFields()) {
			field.setAccessible(true);
			// 获取字段的值
			// System.out.println(field.getName() + ":" + field.get(o) );
			String value = field.getType().toString();
			// System.out.println(value);
			if (!field.getName().equals("serialVersionUID") && field.get(o) != null && !value.equals("boolean")) {
				boolean isTableField = field.isAnnotationPresent(TableField.class);
				if (isTableField) {
					TableField tableField = field.getAnnotation(TableField.class);

					String fieldValue = tableField.value();
					System.out.println(fieldValue + "&&&&&&" + field.getName() + "&&&&&&&&&" + field.get(o));
					queryWrapper.eq("" + fieldValue + "", field.get(o));
				}
			}
		}
		List<T> list = service.list(queryWrapper);
		if (list.size() == 1) {
			T g = list.get(0);
			for (Field field : g.getClass().getDeclaredFields()) {
				field.setAccessible(true);
				
				boolean isIdField = field.isAnnotationPresent(TableId.class);
				if (isIdField) {
					System.out.println(field.get(g));
					if (!field.get(g).equals(id)) {
						result = true;
					}
				}
			}
		} else if (list.size() > 1) {
			result = true;
		}
		return result;
	}

}

当然有一点我必须要说明一下,实体类不能缺少 @TableField("name")的注解,具体实体类参考如下:

package com.home.lh.system.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
 * <p>
 * 系统角色
 * </p>
 *
 * @author 刘浩
 * @since 2021-05-20
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_role")
@ApiModel(value="SysRole对象", description="系统角色")
public class SysRole extends Model<SysRole> {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "角色id")
    @TableId(value = "rid", type = IdType.ASSIGN_UUID)
    private String rid;

    @ApiModelProperty(value = "角色名称")
    @TableField("rname")
    private String rname;

    @ApiModelProperty(value = "角色描述")
    @TableField("remake")
    private String remake;

    @ApiModelProperty(value = "权限集")
    @TableField("moduleId")
    private String moduleId;

    @ApiModelProperty(value = "菜单集")
    @TableField("menuId")
    private String menuId;

    @ApiModelProperty(value = "创建时间")
    @TableField(value = "createTime", fill = FieldFill.INSERT)
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private LocalDateTime createTime;

    @ApiModelProperty(value = "修改时间")
    @TableField(value = "updateTime", fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private LocalDateTime updateTime;

    @ApiModelProperty(value = "是否删除  0 未 1 已")
    @TableField("isdel")
    @TableLogic
    private String isdel;

    @ApiModelProperty(value = "是否禁用 0 未 1 已")
    @TableField("isdisable")
    private String isdisable;
    
    @ApiModelProperty(value = "级别")
    @TableField("level")
    private Integer level;


    @Override
    protected Serializable pkVal() {
        return this.rid;
    }

}

首先说明@TableField中必须 要放入表字段名称,因为查询字段时要用到,如果不加入这个注解或没有写字段名称就无法查询。

二、使用步骤

具体使用示例如下:

@Api(value = "SysRoleController", tags = "")
@RestController
@RequestMapping("/system/sys-role")
public class SysRoleController {

	@Autowired
	private ISysRoleService sysRoleService;

	@Autowired
	private ClassUtil<SysRole> classUtil;

    /**
	 * 新增
	 */
	@ApiOperation(value = "新增数据")
	@RequestMapping(value = "/add", method = RequestMethod.POST)
	public ReturnMap add(SysRole sysRole) {
		ReturnMap rm = new ReturnMap();
		SysRole role = new SysRole();
		role.setRname(sysRole.getRname());
		try {
			boolean result = classUtil.addIsHave(role, sysRoleService);
			if (!result) {
				// 判断新增角色的等级不能大于本身的角色
				SysRole r = SimpleUtils.getRole();
				if (sysRole.getLevel() <= r.getLevel()) {
					rm.setCode(-1);
					rm.setMsg("角色等级权限不能高于自己");
				} else {
					Boolean flag = sysRoleService.save(sysRole);
					if (flag) {
						rm.setCode(1);
						rm.setMsg("操作成功");
					} else {
						rm.setCode(1);
						rm.setMsg("操作失败");
					}

				}
			} else {
				rm.setCode(-1);
				rm.setMsg("角色已存在");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		return rm;
	}

/**
	 * 修改
	 */
	@ApiOperation(value = "更新数据")
	@RequestMapping(value = "/update", method = RequestMethod.POST)
	public ReturnMap update(SysRole sysRole) {
		ReturnMap rm = new ReturnMap();
		SysRole role = new SysRole();
		role.setRname(sysRole.getRname());
		try {
			boolean result = classUtil.updateIsHave(role, sysRoleService, sysRole.getRid());
			if(!result) {
				// 判断新增角色的等级不能大于本身的角色
				SysRole r = SimpleUtils.getRole();
				if (sysRole.getLevel() <= r.getLevel()) {
					rm.setCode(-1);
					rm.setMsg("角色等级权限不能高于自己");
				} else {
					Boolean flag = sysRoleService.updateById(sysRole);
					if (flag) {
						rm.setCode(1);
						rm.setMsg("操作成功");
					} else {
						rm.setCode(1);
						rm.setMsg("操作失败");
					}
				}
			}else {
				rm.setCode(-1);
				rm.setMsg("角色已存在");
				return rm;
			}			
		} catch (Exception e) {
			
			e.printStackTrace();
		} 
		return rm;
	}



}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐