首页 > 其他分享 >1Mybatis-Plus中逻辑删除与唯一索引冲突的解决方案

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

时间:2022-08-31 22:56:27浏览次数:83  
标签:return String 用户 索引 Plus user UserConstants 1Mybatis UNIQUE

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中逻辑删除与唯一索引冲突的解决方案

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

标签:return,String,用户,索引,Plus,user,UserConstants,1Mybatis,UNIQUE
From: https://www.cnblogs.com/Code-Rain/p/16547551.html

相关文章

  • Python中None作为索引的作用
    None的作用主要是在使用None的位置新增一个维度。a=np.arange(25).reshape(5,5)print(a)'''[[01234][56789][1011121314][1516171819]......
  • 面试高频,屡试不爽的mysql索引特性总结
    (1)FROM子句组装来自不同数据源的数据(2)WHERE子句基于指定的条件对记录进行筛选(3)GROUPBY子句将数据划分为多个分组(4)使用聚合函数进行计算(5)......
  • Oracle索引问题汇总
    一、oracle时间条件值范围越大就不走索引问题解决oracle时间条件值范围越大就不走索引问题解决:使用强制索引在写一个比较复杂的统计语句的时候,其中涉及到了时间的条件。......
  • MybatisPlus拦截器打印完整SQL、分页、自动填充处理
    MybatisPlus拦截器打印完整SQLMybatisPlus虽然也自带了一个打印SQL的配置,但是不方便查看,也没有时间统计mybatis-plus:configuration:log-impl:org.apache.ib......
  • MySQL 覆盖索引详解
    1.什么是索引?索引(在MySQL中也叫“键key”)是存储引擎快速找到记录的一种数据结构,通俗来说类似书本的目录,这个比方虽然被用的最多但是也是最恰如其当的,在查询书本中的某......
  • 索引
    索引MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。索引的分类在一个表中,主键索引只能有......
  • 索引原则
    索引原则索引不是越多越好不要对经常变动数据加索引小数据量的表不需要加索引索引一般加在常用来查询的字段上!索引的数据结构Hash类型的索引Btree:InnoD......
  • 索引的种类
    索引的种类索引有哪几种类型?主键索引:数据列不允许重复,不允许为NULL,一个表只有一个主键。唯一索引:数据列不允许重复,允许为NULL,一个表允许多个列创建唯一索引。普通索引:基本......
  • C Primer Plus pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1L__aDQdV2SBGoodpCb4cmg点击这里获取提取码CPrimerPlus全面讲述了C语言编程的相关概念和知识。CPrimerPlus共17章。第1......
  • 学习随笔——codeforces题目Plus and Multiply解答
    摘要:构造算法与数论的结合,巧妙之处在于我们要自己模拟一遍计算过程然后从中找出特殊点。题目原地址如下:https://codeforces.com/problemset/problem/1542/B题目截图如下:......