You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java+JDBC用户信息管理:添加DOB与手机号验证需求

解决方案:添加DOB与手机号验证逻辑

针对你的需求,我们需要对DOB日期范围和手机号格式添加验证,同时修复现有代码中手机号用double存储的精度问题(10位手机号可能超出double精确范围,建议用Long对应数据库的BIGINT)。以下是修改后的完整代码及关键说明:

关键验证逻辑说明

1. DOB日期验证

  • 使用Java 8+的LocalDate API处理日期,便于范围判断
  • 限定日期范围为 1940-01-01 至 2000-01-01
  • 循环接收输入,直到用户输入符合要求的日期

2. 手机号验证

  • 改用String接收手机号输入,避免精度丢失
  • 验证规则:必须是恰好10位数字,通过正则表达式^\d{10}$校验
  • 循环接收输入,直到用户输入符合格式要求

修改后的完整代码

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Scanner;
import java.util.regex.Pattern;

public class UserData {
    // 日期范围常量
    private static final LocalDate MIN_DOB = LocalDate.of(1940, 1, 1);
    private static final LocalDate MAX_DOB = LocalDate.of(2000, 1, 1);
    // 手机号正则:10位数字
    private static final Pattern PHONE_PATTERN = Pattern.compile("^\\d{10}$");
    // 日期格式化器
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    public static void main(String[] args) throws Exception {
        int option = 0;
        Scanner sc = new Scanner(System.in); // 把Scanner移到循环外,避免重复创建
        Class.forName("com.mysql.cj.jdbc.Driver");

        do {
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "root");
            System.out.println("Select from the following options to interact with the user data :" + '\n');
            System.out.println("1. Insert user data in database");
            System.out.println("2. Display all users data");
            System.out.println("3. Delete specific user by Userid");
            System.out.println("4. Display specific user data as per their Userid");
            System.out.println("5. Exit " + '\n');

            // 处理输入非数字的情况
            while (!sc.hasNextInt()) {
                System.out.println("请输入有效数字选项!");
                sc.next();
            }
            option = sc.nextInt();
            sc.nextLine(); // 消费换行符

            switch (option) {
                case 1:
                    String insertSql = "INSERT INTO UserDetails1(userid,name,DOB,address,phone,UserRole) VALUES(?,?,?,?,?,?)";
                    PreparedStatement st1 = con.prepareStatement(insertSql);

                    // 输入Userid
                    System.out.println("Enter Userid");
                    int id1 = sc.nextInt();
                    sc.nextLine();

                    // 输入Name
                    System.out.println("Enter name");
                    String name1 = sc.nextLine();

                    // DOB输入与验证
                    LocalDate dob = null;
                    while (dob == null) {
                        System.out.println("Enter DOB in YYYY-MM-DD format (必须介于1940-01-01至2000-01-01之间)");
                        String dateInput = sc.nextLine().trim();
                        try {
                            dob = LocalDate.parse(dateInput, DATE_FORMATTER);
                            if (dob.isBefore(MIN_DOB) || dob.isAfter(MAX_DOB)) {
                                System.out.println("错误:日期必须在1940-01-01到2000-01-01之间,请重新输入!");
                                dob = null;
                            }
                        } catch (DateTimeParseException e) {
                            System.out.println("错误:日期格式不正确,请按照YYYY-MM-DD格式输入!");
                        }
                    }

                    // 输入Address
                    System.out.println("Enter address ");
                    String address1 = sc.nextLine();

                    // 手机号输入与验证
                    String phoneStr = null;
                    while (phoneStr == null) {
                        System.out.println("Enter 10 digit phone number");
                        phoneStr = sc.nextLine().trim();
                        if (!PHONE_PATTERN.matcher(phoneStr).matches()) {
                            System.out.println("错误:手机号必须是恰好10位数字,请重新输入!");
                            phoneStr = null;
                        }
                    }
                    long phone1 = Long.parseLong(phoneStr); // 转为Long对应数据库的BIGINT

                    // 输入UserRole
                    System.out.println("Enter user role:");
                    String userrole1 = sc.nextLine();

                    // 设置参数
                    st1.setInt(1, id1);
                    st1.setString(2, name1);
                    st1.setDate(3, java.sql.Date.valueOf(dob));
                    st1.setString(4, address1);
                    st1.setLong(5, phone1);
                    st1.setString(6, userrole1);

                    st1.executeUpdate();
                    System.out.println("数据插入成功");
                    con.close();
                    break;

                case 2:
                    // 补充查询所有用户的逻辑(示例)
                    System.out.println("显示所有用户数据");
                    // 此处可添加查询代码
                    con.close();
                    break;

                case 3:
                    // 补充删除用户的逻辑(示例)
                    System.out.println("删除指定用户");
                    // 此处可添加删除代码
                    con.close();
                    break;

                case 4:
                    // 补充查询指定用户的逻辑(示例)
                    System.out.println("显示指定用户数据");
                    // 此处可添加查询代码
                    con.close();
                    break;

                case 5:
                    System.out.println("Exiting...." + '\n');
                    con.close();
                    break;

                default:
                    System.out.println('\n' + "请选择有效选项!" + '\n');
            }
        } while (option != 5);
        sc.close(); // 关闭Scanner
    }
}

额外优化点

  1. 将Scanner对象移到循环外,避免重复创建资源
  2. 添加了输入选项时的非数字校验,防止程序崩溃
  3. 修复了SQL表名:原代码插入表名为UserDetails,但建表语句是UserDetails1,已统一为UserDetails1
  4. 手机号转为Long类型存入数据库,对应建表语句的BIGINT类型,避免精度问题

内容的提问来源于stack exchange,提问作者Abdullaah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:30:57