前端传输某条数据给后端时,用Java验证该数据在数据库中是否存在(手机号码、其他唯一编号等适用)

下面我将分享验证某条数据在数据库中存在问题的解决方法。

一、使用场景

比如对某一模块中的用户信息进行基本管理(CRUD),其中包含“手机号”字段。

手机号唯一,且一般也会用手机号进行登录,这时如果对某一条用户信息进行修改,将手机号修改成该系统中另一个账户的手机号,那么很显然,登录时就会出现问题。所以在前端提交表单时,就要对该条数据进行验证。

二、解决方法

这里实现的是将 新增修改 写在一个方法中的情况下,验证某数据在数据库中是否存在。

(当然,新增 和 修改 分开写也行)

以手机号为例。

先说一下从上到下的验证流程(思路),再进行代码展示。

  1. 系统从前端接收到当前提交的用户信息,提取出手机号并查询当前数据库中能匹配到的记录条数(为了确认数据库中是否已经存在 此时前端提交的 这个手机号,值为 1 或 0)
  2. 根据前端提交的手机号查询出数据库中和该手机号匹配的结果(如果结果为空,那么 用户id 也为空;如果能查到数据,那么 用户id 不为空。这里的 用户id 为数据库表中的主键,自增)
  3. 此时,该方法不仅得到 从前端提交来的 一条用户信息,还得到 从数据库中查出来的 结果,接下来只要进行匹配、判断就行了(以下 4、5 讲添加,6、7、8 讲修改)
  4. 添加数据时,数据库中的 用户id 会自动生成,前端在 新增 时,不需要给 id 赋值,所以 从前端提交来的信息 中, 用户id 为空。只要为空,说明是新增用户信息,再执行下一步验证
  5. 如果 第1步 中返回的值为 1,说明手机号重复,直接返回一个数字给前端;否则调用 新增 的接口
  6. 修改数据时,用户id 已经生成,这时 从前端提交来的信息 中, 用户id 不为空。只要不为空,说明是 修改,再执行下一步验证
  7. 如果 第1步 中返回的值不为 1,说明手机号不重复,直接调用 修改 的接口;如果返回的值为 1,说明手机号重复,接下来还要进行一次验证
  8. 这一步要确认 从前端提交来的 这条用户信息和 从后端查到的用户信息 是否为同一个用户,那就直接把这两条数据的 用户id 进行匹配就可以了。不匹配,直接返回一个数字给前端;否则调用 修改 的接口

关于第 8 步,是为了避免以下两种情况的出现:

1、对用户信息修改时,我不去修改手机号,而是修改其他信息后再提交

2、对用户信息修改时,我修改了手机号,但修改后的手机号和数据库中其他用户的手机号重复了,这时再提交


以下是代码展示:

/**
 * 账户 service 层
 */
@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public int save(User user) {

        //根据前端提交的账户电话号码查询数据库中能匹配到的记录数
        int forUserPhone = userMapper.selectUserPhoneTotal(user.getUser_phone());
        //根据前端提交的账户电话号码查询数据库中能匹配到的账户信息
        User forUserPhoneMessage = userMapper.selectForUserPhone(user.getUser_phone());

        if (user.getUser_id() == null) {
            // user_id 为空,说明该条记录未曾在数据库中,则进行下一步校验
            if (forUserPhone == 1) {
                //返回记录数为 1,说明电话号码存在重复,直接返回一个值交给前端处理
                return 114514;
            } else {
                //返回值为 1 交给前端处理
                return userMapper.insert(user);
            }
        } else {
            // user_id 不为空,那么将进行修改操作,则进行下一步校验
            if (forUserPhone == 1) {
            //返回记录数为 1,说明电话号码存在重复,接下来验证重复的电话号码所在账户 ID 是不是前端提交的这一条
                if (!user.getUser_id().equals(forUserPhoneMessage.getUser_id())) {
                    //不是,说明存在其他账户的手机号码和前端提交的账户信息的手机号码存在重复,直接返回一个值交给前端处理
                    return 114514;
                } else {
                    //是,则执行更新操作
                    return userMapper.update(user);
                }
            }
            //返回记录数不为 1,说明电话号码是唯一的,则直接进行更新操作
            return userMapper.update(user);
        }

    }

}


//查询数据库中能匹配到的记录数对应的 SQL 语句
select count(*) from user where user_phone = #{user_phone}

这里调用接口返回给前端的值为 1。

也就是说,前端通过这个方法接收到的只有两种结果:1 和 114514

前端对这两个值用 js 做区分就行了。

如果各位大佬还有其他更好的解决方法,欢迎在评论区分享。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值