Mybatis-Plus中逻辑删除与唯一索引冲突的解决方案

1、背景

用户删除后时重复添加同名用户报错,原因是因为删除用户时使用的是逻辑删除,并未从数据库中真实删除,由于用户信息还是比较重要的。

2、关键代码片段

Controller

/**
* 新增用户
*/
@PreAuthorize("@ss.hasPermi('system:user:add')")
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysUser user) {
if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) {
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
} else if (StringUtils.isNotEmpty(user.getPhonenumber())
&& UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) {
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
} else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) {
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
user.setCreateBy(getUsername());
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
return toAjax(userService.insertUser(user));
}

Service

/**
* 校验用户名称是否唯一
*
* @param userName 用户名称
* @return 结果
*/
String checkUserNameUnique(String userName);
/**
* 校验手机号码是否唯一
*
* @param user 用户信息
* @return 结果
*/
String checkPhoneUnique(SysUser user);
/**
* 校验email是否唯一
*
* @param user 用户信息
* @return 结果
*/
String checkEmailUnique(SysUser user);

Impl

/**
* 校验用户名称是否唯一
*
* @param userName 用户名称
* @return 结果
*/
@Override
public String checkUserNameUnique(String userName) {
int count = baseMapper.checkUserNameUnique(userName);
if (count > 0) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 校验手机号码是否唯一
*
* @param user 用户信息
* @return
*/
@Override
public String checkPhoneUnique(SysUser user) {
String userId = StringUtils.isNull(user.getUserId()) ? "" : user.getUserId();
SysUser info = baseMapper.checkPhoneUnique(user.getPhonenumber());
if (StringUtils.isNotNull(info) && !info.getUserId().equals(userId)) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 校验email是否唯一
*
* @param user 用户信息
* @return
*/
@Override
public String checkEmailUnique(SysUser user) {
String userId = StringUtils.isEmpty(user.getUserId()) ? "" : user.getUserId();
SysUser info = baseMapper.checkEmailUnique(user.getEmail());
if (StringUtils.isNotNull(info) && !info.getUserId().equals(userId)) {
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}

mapper

public interface SysUserMapper extends BaseMapper<SysUser> {
/**
* 校验用户名称是否唯一
*
* @param userName 用户名称
* @return 结果
*/
int checkUserNameUnique(String userName);
}

下文修改了此处 checkxxxUnique 的查询条件 del_flag = '0'

<select id="checkUserNameUnique" parameterType="String" resultType="int">
select count(1) from sys_user where user_name = #{userName} limit 1
</select>
<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
select user_id, phonenumber from sys_user where phonenumber = #{phonenumber} limit 1
</select>
<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
select user_id, email from sys_user where email = #{email} limit 1
</select>

灵活拙见:修改后代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysUserMapper">
<select id="checkUserNameUnique" parameterType="String" resultType="int">
select count(1) from sys_user where del_flag = '0' and user_name = #{userName} limit 1
</select>
<select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
select user_id, phonenumber from sys_user where del_flag = '0' and phonenumber = #{phonenumber} limit 1
</select>
<select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
select user_id, email from sys_user where del_flag = '0' and email = #{email} limit 1
</select>
</mapper>

3、其他思考

实际最简单的方式是直接修改删除逻辑为物理删除,但是思考了一下后,由此不由得想到现如今好多系统,注销账户后会提示一周保留账号信息,软删除还是很有必要的,思考了如下参考方案。

Mybatis-Plus中逻辑删除与唯一索引冲突的解决方案

逻辑删除与唯一约束冲突问题的一个解决方案

posted @   Code7Rain  阅读(730)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示