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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix