Java+JDBC用户信息管理:添加DOB与手机号验证需求
解决方案:添加DOB与手机号验证逻辑
针对你的需求,我们需要对DOB日期范围和手机号格式添加验证,同时修复现有代码中手机号用double存储的精度问题(10位手机号可能超出double精确范围,建议用Long对应数据库的BIGINT)。以下是修改后的完整代码及关键说明:
关键验证逻辑说明
1. DOB日期验证
- 使用Java 8+的
LocalDateAPI处理日期,便于范围判断 - 限定日期范围为
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 } }
额外优化点
- 将
Scanner对象移到循环外,避免重复创建资源 - 添加了输入选项时的非数字校验,防止程序崩溃
- 修复了SQL表名:原代码插入表名为
UserDetails,但建表语句是UserDetails1,已统一为UserDetails1 - 手机号转为
Long类型存入数据库,对应建表语句的BIGINT类型,避免精度问题
内容的提问来源于stack exchange,提问作者Abdullaah
相关产品推荐
相关产品推荐

