当前位置: 首页 > news >正文

学生管理系统

一、登录

用户类:属性:用户名、密码、身份证号码、手机号码

1、欢迎页面

System.out.println("欢迎来到学生管理系统");
System.out.println("请选择操作1登录 2注册 3忘记密码");

代码实现: 

    //欢迎页面public static void welcome(ArrayList<User> list){while (true) {System.out.println("欢迎来到学生管理系统");System.out.println("请选择操作:1登录 2注册 3忘记密码");//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);//获取输入的信息System.out.println("请输入操作:");String operation = sc.next();switch (operation){case "1" -> login(list);case "2" -> register(list);case "3" -> forgetPassword(list);default -> System.out.println("请输入1-3数字中的一个!");}}}

2、注册功能

①变量的作用范围只在所属的大括号范围内有效。

要想在外面也有效,就要提升作用范围,可以将变量定义在大括号外面。

②如果同时要满足很多条件时怎么做?

正向考虑:即满足条件时一步步往下,但是这样有一个弊端,就是if-else可能会嵌套过深,当增加新的条件时代码不易维护。

反向考虑:即什么时候不满足条件return false;,直接结束方法的运行。 

(1)用户名

满足以下3个条件:

①用户名唯一;

②用户名长度必须在3~15位之间;

③只能是字母加数字的组合,但是不能是纯数字。

对于用户名的判断:先验证格式,再验证唯一性。因为验证唯一性需要连接数据库,比较耗费资源。

对于要求3,我写的这个方法是判断是否存在大小写字母,以此来说明不是纯数字,这是因为我知道输入的时候会是字母和数字的组合,但是实际过程中是有可能会输入其他字符的,所以要加入输入的字符串只能是字母和数字的组合这个要求的实现。

    //判断用户名是否满足要求3public static boolean check3(String username){for (int i = 0; i < username.length(); i++) {char c = username.charAt(i);if((c > 'a') && (c < 'z')){return true;}if((c > 'A') && (c < 'Z')){return true;}}return false;}

实现验证用户名只能是字母和数字的组合的方法check31:当出现除字母和数字以外的字符时return false;遍历完所有字符都没有return false说明只有数字和字母。

   public static boolean check31(String username) {for (int i = 0; i < username.length(); i++) {//依次获取每一个字符char c = username.charAt(i);//取反说明当条件为假时return false//((c >= 'a') && (c <= 'z'))表示c是字符a-z之间的一个//而条件什么时候为假,即字符不是大小写英文字母和数字中的任意一个if (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9')))) {return false;}return true;}

然后加上是否有大小写字母的的方法check32:与刚开始的实现是一样的,只不过将判断大写和小写合并到一起了。 

    //判断是否有大小写字母存在public static boolean check32(String username){for (int i = 0; i < username.length(); i++) {char c = username.charAt(i);if ((((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')))) {return true;}}return false;}

Ⅰ、输入用户名的判断

①在判断用户名的长度时,可以将username.length()提取处理赋给一个变量,提高效率。

在下面这个代码中应用的正向考虑:

    //判断用户名是否合法public static boolean checkUsername(ArrayList<User> list, String username) {int length = username.length();if ((3 <= length) && (length <= 15)) {if (check31(username)) {if (check32(username)){return true;}}}return false;}

这里是修改后的代码,应用了视频中的反向考虑思想: 

681a5b30466a47f7841b3adfe5f34a25.png

Ⅱ、用户名的输入 

        while (true) {//获取输入的用户名System.out.println("请输入用户名:");String username = sc.next();//首先验证用户名的格式if (checkUsername(list, username)) {//满足条件时进行用户唯一性的判断if (contains(list, username)) {//将输入的用户名与用户对象进行绑定user.setUsername(username);break;} else {System.out.println("输入的用户名已存在!");}} else {System.out.println("用户名不合法!请重新输入");}}

这里if有两层嵌套,其实还可以,但是也可以修改为反向考虑的代码,这里就不写了。

关于后面的密码、身份证号和手机号等代码的反向考虑的修改就不赘述了。 

(2)密码

密码键盘输入两次,两次一致才可以进行注册。

Ⅰ、密码的输入和判断

        while (true) {//获取输入的密码System.out.println("请输入密码:");String password1 = sc.next();System.out.println("请再次输入密码:");String password2 = sc.next();//将输入的密码与用户对象进行绑定if (password1.equals(password2)) {user.setPassword(password1);break;} else {System.out.println("两次输入的密码不一致!请重新输入");}}

(3)身份证号

身份证号码验证要求:

①长度为18位;

②不能以0为开头;

③前17位,必须都是数字;

④最为一位可以是数字,也可以是大写X或小写x。

Ⅰ、输入身份证号的判断

public static boolean checkID(String ID) {//获取ID的长度int length = ID.length();//判断长度是否为18if (length == 18) {//判断开头是否为0if (ID.charAt(0) != '0') {//获取最后一位char c1 = ID.charAt(length - 1);if (((c1 > '0') && (c1 < '9')) || (c1 == 'X') || (c1 == 'x')) {//循环遍历前17位for (int i = 0; i < length - 1; i++) {char c2 = ID.charAt(i);if ((c2 > '0') && (c2 < '9')) {return true;}}}}}return false;}

Ⅱ、身份证号的输入 

       while (true) {//获取输入的身份证号System.out.println("请输入身份证号:");String ID = sc.next();//将输入的密码与用户对象进行绑定if (checkID(ID)) {user.setID(ID);break;} else {System.out.println("输入的身份证号不合法!请重新输入");}}

(4)手机号

验证要求:

①长度为11位

②不能以0为开头

③必须都是数字

Ⅰ、输入手机号的判断

 public static boolean checkPhoneNumber(String phoneNumber) {//获取手机号的长度int length = phoneNumber.length();//判断长度是否为11if (length == 11) {//判断开头是否为0if (phoneNumber.charAt(0) != '0') {//循环遍历前11位for (int i = 0; i < length; i++) {char c2 = phoneNumber.charAt(i);if ((c2 > '0') && (c2 < '9')) {return true;}}}}return false;}

对于要求②, 不仅可以使用phoneNumber.charAt(0)获取0位置的索引,还可以使用startWith方法验证是否以0开头。

Ⅱ、手机号的输入

        while (true) {//获取输入的手机号System.out.println("请输入手机号:");String phoneNumber = sc.next();//将输入的密码与用户对象进行绑定if (checkPhoneNumber(phoneNumber)) {user.setID(phoneNumber);break;} else {System.out.println("输入的手机号不合法!请重新输入");}}

然后将数据添加到集合中,并提示添加成功:

        list.add(user);System.out.println("添加成功!");

3、登录

(1)键盘录入用户名;

(2)键盘录入密码;

(3)键盘录入验证码。

验证要求:

用户名如果未注册,直接结束方法,并提示:用户名未注册,请先注册;

判断验证码是否正确,如不正确,重新输入;

再判断用户名和密码是否正确,有3次机会。

验证码要求:

(1)长度为5;

(2)由4位大写或者小写字母和1位数字组成,同一个字母可重复;

(3)数字可以出现在任意位置。

比如:

aQa1K

(1)生成验证码

刚开始我是把把52个大小写英文字母存到数组中,一个一个打出来的,很傻。

    // 生成验证码public static String createCaptcha() {//首先把52个大小写英文字母存到数组中String[] s = {"A", "B", "C", "D", "E", "F", "G","H", "I", "J", "K", "L", "M", "N","O", "P", "Q", "R", "S", "T","U", "V", "W", "X", "Y", "Z","a", "b", "c", "d", "e", "f", "g","h", "i", "j", "k", "l", "m", "n","o", "p", "q", "r", "s", "t","u", "v", "w", "x", "y", "z"};//创建一个sb对象用来存字符串StringBuilder sb = new StringBuilder();//随机选择数组中的字母,循环4次生成4个Random r = new Random();for (int i = 0; i < 4; i++) {int index = r.nextInt(s.length);sb.append(s[index]);}//生成数字int number = r.nextInt(10);//生成数字插入的位置int position = r.nextInt(5);sb.insert(position, number);String captcha = sb.toString();return captcha;}

利用ASCII码添加大小写英文字母,这是修改了的代码: 

    // 生成验证码public static String createCaptcha() {//创建一个sb对象用来存52个大小写英文字母StringBuilder sb1 = new StringBuilder();for (int i = 0; i < 26; i++) {char c1 = (char) ('a' + i);sb1.append(c1);char c2 = (char) ('A' + i);sb1.append(c2);}String string = sb1.toString();//创建一个sb对象用来存字符串StringBuilder sb2 = new StringBuilder();//随机选择数组中的字母,循环4次生成4个Random r = new Random();for (int i = 0; i < 4; i++) {int index = r.nextInt(string.length());sb2.append(string.charAt(index));}//生成数字int number = r.nextInt(10);//生成数字插入的位置int position = r.nextInt(5);sb2.insert(position, number);String captcha = sb2.toString();return captcha;}

(2)判断用户名和密码是否正确

    //判断用户名和密码是否正确public static boolean checkUsername_Password(ArrayList<User> list, String username, String password){for (int i = 0; i < list.size(); i++) {User user = list.get(i);if ((username.equals(user.getUsername())) && (password.equals(user.getPassword()))){return true;}}return false;}

由于这个方法传递的参数比较多,提供一种封装的思想,可以将属性封装到一个对象中进行传递。

    //判断用户名和密码是否正确public static boolean checkUserInfo(ArrayList<User> list, User user1){String username = user1.getUsername();String password = user1.getPassword();for (int i = 0; i < list.size(); i++) {User user2 = list.get(i);if ((username.equals(user2.getUsername())) && (password.equals(user2.getPassword()))){return true;}}return false;}

 这个整个登录代码的实现:

1、首先输入用户名、密码、验证码;

2、判断用户名是否存在,不存在则提示用户名未注册,请先注册;

3、进行验证码的校验;

4、用户名和密码的判断;

    //登录public static void login(ArrayList<User> list) {//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {//获取输入的信息System.out.println("请输入用户名:");String username = sc.next();System.out.println("请输入密码:");String password = sc.next();//生成验证码String captcha1 = createCaptcha();System.out.println("生成的验证码为:" + captcha1);System.out.println("请输入验证码:");String captcha2 = sc.next();//将此对象的username与集合中所有对象的username进行判断boolean flag = contains(list, username);if (!flag) {System.out.println("用户名未注册,请先注册");break;} else {if (captcha1.equals(captcha2)) {if (checkUername_Password(list, username, password)) {System.out.println("登录成功!");break;} else {System.out.println("用户名和密码输入错误!");}} else {System.out.println("验证码不正确!");}}}}

关于这段代码:

if (!flag) {
                System.out.println("用户名未注册,请先注册");
                break;
 }

取反说明flag为假时执行if后面的语句。 

由于嵌套的比较深,进行修改:

e153fbdf521b4deeafb405b4ccb62a40.png

可以看到减少了else语句的存在。 

4、修改密码

(1)键盘录入用户名,判断当前用户名是否存在,如不存在,直接结束方法,并提示:未注册

(2)键盘录入身份证号码和手机号码

(3)判断当前用户的身份证号码和手机号码是否一致,

如果一致,则提示输入密码,进行修改。

如果不一致,则提示:账号信息不匹配,修改失败。

思路如下:

1、首先判断用户是否存在;

2、然后判断身份证号和手机号是否正确;

3、如果正确则修改密码。

    //忘记密码public static void forgetPassword(ArrayList<User> list) {//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);//获取输入的用户名System.out.println("请输入用户名:");String username = sc.next();boolean flag = contains(list, username);if (!flag) {System.out.println("请先注册!");return;} else {//获取输入的身份证号System.out.println("请输入身份证号:");String ID = sc.next();//获取输入的手机号System.out.println("请输入手机号:");String phoneNumber = sc.next();//获取当前用户对象int index = getIndex(list, username);User user = list.get(index);//当用户的身份证号和手机号一致时if ((ID.equals(user.getID())) && (phoneNumber.equals(user.getPhonenumber()))) {while (true) {//获取输入的密码System.out.println("请输入密码:");String password1 = sc.next();System.out.println("请再次输入密码:");String password2 = sc.next();//将输入的密码与用户对象进行绑定if (password1.equals(password2)) {user.setPassword(password1);break;} else {System.out.println("两次输入的密码不一致!请重新输入");}}} else {System.out.println("账号信息不匹配,修改失败!");}}}

这是应用反向考虑的思想修改后的代码: 

bde78cce68824d00baa25232127d5f88.png

二、增删改查

初始菜单

"-------------欢迎来到黑马学生管理系统----------------"
"1:添加学生"
"2:删除学生"
"3:修改学生"
"4:查询学生"
"5:退出"
"请输入您的选择:"

学生类

属性:id、姓名、年龄、家庭住址

分析:

1、创建一个mainOrder方法

2、键盘录入用户的选择

3、用switch语句进行判断

    //初始菜单public static void mainOrder(ArrayList<Student> list){System.out.println("-------------欢迎来到黑马学生管理系统----------------\n" +"1:添加学生\n" +"2:删除学生\n" +"3:修改学生\n" +"4:查询学生\n" +"5:退出");//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);//获取输入的信息System.out.println("请输入您的选择:");int num = sc.nextInt();switch (num){case 1 -> add(list);case 2 -> remove(list);case 3 -> update(list);case 4 -> select(list);case 5 -> exit();default -> System.out.println("请输入1-5中的一个!");}//当操作完成后再次回到mainOrder(list);}

当操作完成之后再次希望再次回到操作,这里使用递归实现的,视频中是用while(true)循环实现的。

break和continue用法区别:

(1)break:跳出for或者while循环;

(2)continue:跳出第i次遍历,进行第i+1次遍历;

对于退出,有两种方法:

①使用System.exit(0);结束虚拟机的运行进行退出;

②跳出最外层循环:break loop;

break一般是跳出离得最近的循环,当有多层循环而我们想指定跳出某个循环时,可以给这个循环起一个别名,然后break 别名就可以跳出这个循环了。

代码如下:

    //初始菜单public static void mainOrder(ArrayList<Student> list){//给外层的while循环起一个别名looploop:while (true) {System.out.println("-------------欢迎来到黑马学生管理系统----------------\n" +"1:添加学生\n" +"2:删除学生\n" +"3:修改学生\n" +"4:查询学生\n" +"5:退出");//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);//获取输入的信息System.out.println("请输入您的选择:");int num = sc.nextInt();switch (num){case 1 -> add(list);case 2 -> remove(list);case 3 -> update(list);case 4 -> select(list);case 5 -> {System.out.println("已退出学生管理系统!");//break loop指跳出while循环//break loop;System.exit(0);}default -> System.out.println("请输入1-5中的一个!");}}}

添加功能

键盘录入每一个学生信息并添加,需要满足以下要求:

  • id唯一

    //添加public static void add(ArrayList<Student> list) {//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);while (true) {//获取输入的信息System.out.println("请输入id:");String id = sc.next();System.out.println("请输入姓名:");String name = sc.next();System.out.println("请输入年龄:");int age = sc.nextInt();System.out.println("请输入家庭住址:");String address = sc.next();//将输入的信息与学生对象进行绑定Student student = new Student();student.setId(id);student.setName(name);student.setAge(age);student.setAddress(address);//将此对象的id与集合中所有对象的id进行判断boolean flag = contains(list, id);if (flag) {System.out.println("此id已存在!,请重新输入id");} else {list.add(student);System.out.println("添加成功!");break;}}}

查询功能

打印所有的学生信息,需要满足以下要求

  • 如果没有学生信息,提示:当前无学生信息,请添加后再查询

  • 如果有学生信息,需要按照以下格式输出。(不用过于纠结对齐的问题)

    //查询public static void select(ArrayList<Student> list){if(list.size() == 0){System.out.println("当前无学生信息,请添加后再查询");}else {System.out.println("id\t姓名\t年龄\t家庭住址");for (int i = 0; i < list.size(); i++) {Student student = list.get(i);System.out.println(student.getId() + "\t" + student.getName() + "\t" + student.getAge() + "\t" + student.getAddress());}}}

删除功能

键盘录入要删除的学生id,需要满足以下要求:

  • id存在删除

  • id不存在,需要提示不存在,并回到初始菜单

    //删除public static void remove(ArrayList<Student> list) {//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);while (true) {//获取输入的信息System.out.println("请输入id:");String id1 = sc.next();//是否包含boolean flag = contains(list, id1);if (flag) {int index = getIndex(list,id1);list.remove(index);System.out.println("删除成功!");break;}else {System.out.println("此id不存在!,请重新输入id");}}}

修改功能

键盘录入要修改的学生id,需要满足以下要求

  • id存在,继续录入其他信息

  • id不存在,需要提示不存在,并回到初始菜单

    //修改public static void update(ArrayList<Student> list){//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);String id1 = null;String id2 = null;while (true) {//获取输入的信息System.out.println("请输入要修改学生的id:");id1 = sc.next();System.out.println("请输入修改后学生的id:");id2 = sc.next();if(!id1.equals(id2)){break;} else {System.out.println("修改后的id与修改之前的重复,请重新输入!");}}//是否包含boolean flag = contains(list, id1);if (flag) {int index = getIndex(list,id1);Student student = list.get(index);student.setId(id2);System.out.println("修改成功!");}else {System.out.println("此id不存在!,请重新输入id");}}

这是完整的登录代码: 

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;public class test03 {public static void main(String[] args) {ArrayList<User> list = new ArrayList<>();welcome(list);}//欢迎页面public static void welcome(ArrayList<User> list) {while (true) {System.out.println("欢迎来到学生管理系统");System.out.println("请选择操作:1登录 2注册 3忘记密码");//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);//获取输入的信息System.out.println("请输入操作:");String operation = sc.next();switch (operation) {case "1" -> login(list);case "2" -> register(list);case "3" -> forgetPassword(list);default -> System.out.println("请输入1-3数字中的一个!");}}}//注册public static void register(ArrayList<User> list) {//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);User user = new User();while (true) {//获取输入的用户名System.out.println("请输入用户名:");String username = sc.next();//首先验证用户名的格式if (checkUsername(list, username)) {//满足条件时进行用户唯一性的判断if (!contains(list, username)) {//将输入的用户名与用户对象进行绑定user.setUsername(username);break;} else {System.out.println("输入的用户名已存在!");}} else {System.out.println("用户名不合法!请重新输入");}}while (true) {//获取输入的密码System.out.println("请输入密码:");String password1 = sc.next();System.out.println("请再次输入密码:");String password2 = sc.next();//将输入的密码与用户对象进行绑定if (password1.equals(password2)) {user.setPassword(password1);break;} else {System.out.println("两次输入的密码不一致!请重新输入");}}while (true) {//获取输入的身份证号System.out.println("请输入身份证号:");String ID = sc.next();//将输入的密码与用户对象进行绑定if (checkID(ID)) {user.setID(ID);break;} else {System.out.println("输入的身份证号不合法!请重新输入");}}while (true) {//获取输入的手机号System.out.println("请输入手机号:");String phoneNumber = sc.next();//将输入的密码与用户对象进行绑定if (checkPhoneNumber(phoneNumber)) {user.setPhonenumber(phoneNumber);break;} else {System.out.println("输入的手机号不合法!请重新输入");}}list.add(user);System.out.println("添加成功!");}//登录public static void login(ArrayList<User> list) {//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {//获取输入的信息//输入可以从用户名开始//这里我希望在信息输入完成之后再进行判断System.out.println("请输入用户名:");String username = sc.next();System.out.println("请输入密码:");String password = sc.next();//生成验证码String captcha1 = createCaptcha();System.out.println("生成的验证码为:" + captcha1);System.out.println("请输入验证码:");String captcha2 = sc.next();// 先验证验证码,再进行用户名和密码的判断// 1、验证码只给一次的验证机会if (!(captcha1.equalsIgnoreCase(captcha2))){System.out.println("验证码不正确!");continue;}//走到这里说明没有结束这次循环,也就是验证码验证正确//2、然后将此对象的username与集合中所有对象的username进行判断boolean flag = contains(list, username);// 不存在if (!flag) {System.out.println("用户名未注册,请先注册");break;}// 走到这一步说明用户名存在// 将username和password封装到对象中进行传递User user = new User(username, password, null, null);// 检查用户名和密码是否正确if (checkUserInfo(list, user)) {System.out.println("登录成功!");Test02.studentSystem();break;} else {System.out.println("用户名和密码输入错误!");}}}//忘记密码public static void forgetPassword(ArrayList<User> list) {//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);//获取输入的用户名System.out.println("请输入用户名:");String username = sc.next();boolean flag = contains(list, username);if (!flag) {System.out.println("请先注册!");return;}//获取输入的身份证号System.out.println("请输入身份证号:");String ID = sc.next();//获取输入的手机号System.out.println("请输入手机号:");String phoneNumber = sc.next();//获取当前用户对象int index = getIndex(list, username);User user = list.get(index);//当用户的身份证号和手机号不一致时if (!((ID.equals(user.getID())) && (phoneNumber.equals(user.getPhonenumber())))) {System.out.println("账号信息不匹配,修改失败!");//通过return结束方法return;}//走到这一步说明用户的身份证号和手机号一致while (true) {//获取输入的密码System.out.println("请输入新的密码:");String password1 = sc.next();System.out.println("请再次输入密码:");String password2 = sc.next();//将输入的密码与用户对象进行绑定if (password1.equals(password2)) {user.setPassword(password1);break;} else {System.out.println("两次输入的密码不一致!请重新输入");}}}//根据username判断此用户是否存在public static boolean contains(ArrayList<User> list, String username) {return getIndex(list, username) >= 0;}//返回id的索引public static int getIndex(ArrayList<User> list, String username) {for (int i = 0; i < list.size(); i++) {User user = list.get(i);if (username.equals(user.getUsername())) {return i;}}return -1;}//判断用户名是否合法public static boolean checkUsername(ArrayList<User> list, String username) {int length = username.length();if ((3 > length) || (length > 15)) {return false;}if (!check31(username)) {return false;}if (!check32(username)) {return false;}return true;}//检查是否是数字和字母的组合public static boolean check31(String username) {for (int i = 0; i < username.length(); i++) {//依次获取每一个字符char c = username.charAt(i);//((c >= 'a') && (c <= 'z'))表示c是字符a-z之间的一个if (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9')))) {return false;}}return true;}//判断是否有大小写字母存在public static boolean check32(String username) {for (int i = 0; i < username.length(); i++) {char c = username.charAt(i);if ((((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')))) {return true;}}return false;}public static boolean checkID(String ID) {//获取ID的长度int length = ID.length();//判断长度是否为18if (length == 18) {//判断开头是否为0if (ID.charAt(0) != '0') {//获取最后一位char c1 = ID.charAt(length - 1);if (((c1 > '0') && (c1 < '9')) || (c1 == 'X') || (c1 == 'x')) {//循环遍历前17位for (int i = 0; i < length - 1; i++) {char c2 = ID.charAt(i);if ((c2 > '0') && (c2 < '9')) {return true;}}}}}return false;}public static boolean checkPhoneNumber(String phoneNumber) {//获取手机号的长度int length = phoneNumber.length();//判断长度是否为11if (length == 11) {//判断开头是否为0if (phoneNumber.charAt(0) != '0') {//循环遍历前11位for (int i = 0; i < length; i++) {char c2 = phoneNumber.charAt(i);if ((c2 > '0') && (c2 < '9')) {return true;}}}}return false;}// 生成验证码public static String createCaptcha() {//创建一个sb对象用来存52个大小写英文字母StringBuilder sb1 = new StringBuilder();for (int i = 0; i < 26; i++) {char c1 = (char) ('a' + i);sb1.append(c1);char c2 = (char) ('A' + i);sb1.append(c2);}String string = sb1.toString();//创建一个sb对象用来存字符串StringBuilder sb2 = new StringBuilder();//随机选择数组中的字母,循环4次生成4个Random r = new Random();for (int i = 0; i < 4; i++) {int index = r.nextInt(string.length());sb2.append(string.charAt(index));}//生成数字int number = r.nextInt(10);//生成数字插入的位置int position = r.nextInt(5);sb2.insert(position, number);String captcha = sb2.toString();return captcha;}//判断用户名和密码是否正确public static boolean checkUserInfo(ArrayList<User> list, User user1) {String username = user1.getUsername();String password = user1.getPassword();for (int i = 0; i < list.size(); i++) {User user2 = list.get(i);if ((username.equals(user2.getUsername())) && (password.equals(user2.getPassword()))) {return true;}}return false;}
}

这是完整的增删改查代码: 

import java.util.ArrayList;
import java.util.Scanner;public class Test02 {public static void studentSystem() {//创建一个容器ArrayList<Student> list = new ArrayList<>();mainOrder(list);}//当这些操作成功的时候希望可以给出提示//添加public static void add(ArrayList<Student> list) {//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);while (true) {//获取输入的信息System.out.println("请输入id:");String id = sc.next();System.out.println("请输入姓名:");String name = sc.next();System.out.println("请输入年龄:");int age = sc.nextInt();System.out.println("请输入家庭住址:");String address = sc.next();//将输入的信息与学生对象进行绑定Student student = new Student();student.setId(id);student.setName(name);student.setAge(age);student.setAddress(address);//将此对象的id与集合中所有对象的id进行判断boolean flag = contains(list, id);if (flag) {System.out.println("此id已存在!,请重新输入id");} else {list.add(student);System.out.println("添加成功!");break;}}}//删除public static void remove(ArrayList<Student> list) {//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);while (true) {//获取输入的信息System.out.println("请输入id:");String id1 = sc.next();//是否包含boolean flag = contains(list, id1);if (flag) {int index = getIndex(list,id1);list.remove(index);System.out.println("删除成功!");break;}else {System.out.println("此id不存在!,请重新输入id");}}}//修改public static void update(ArrayList<Student> list){//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);String id1 = null;String id2 = null;while (true) {//获取输入的信息System.out.println("请输入要修改学生的id:");id1 = sc.next();System.out.println("请输入修改后学生的id:");id2 = sc.next();if(!id1.equals(id2)){break;} else {System.out.println("修改后的id与修改之前的重复,请重新输入!");}}//是否包含boolean flag = contains(list, id1);if (flag) {int index = getIndex(list,id1);Student student = list.get(index);student.setId(id2);System.out.println("修改成功!");}else {System.out.println("此id不存在!,请重新输入id");}}//查询public static void select(ArrayList<Student> list){if(list.size() == 0){System.out.println("当前无学生信息,请添加后再查询");}else {System.out.println("id\t姓名\t年龄\t家庭住址");for (int i = 0; i < list.size(); i++) {Student student = list.get(i);System.out.println(student.getId() + "\t" + student.getName() + "\t" + student.getAge() + "\t" + student.getAddress());}}}//根据id判断容器是否包含public static boolean contains(ArrayList<Student> list, String id) {return getIndex(list,id) >= 0;}//返回id的索引public static int getIndex(ArrayList<Student> list, String id) {for (int i = 0; i < list.size(); i++) {Student s = list.get(i);if (id.equals(s.getId())) {return i;}}return -1;}//初始菜单public static void mainOrder(ArrayList<Student> list){//给外层的while循环起一个别名looploop:while (true) {System.out.println("-------------欢迎来到黑马学生管理系统----------------\n" +"1:添加学生\n" +"2:删除学生\n" +"3:修改学生\n" +"4:查询学生\n" +"5:退出");//1.创建一个Scanner对象Scanner sc = new Scanner(System.in);//获取输入的信息System.out.println("请输入您的选择:");int num = sc.nextInt();switch (num){case 1 -> add(list);case 2 -> remove(list);case 3 -> update(list);case 4 -> select(list);case 5 -> {System.out.println("已退出学生管理系统!");//break loop指跳出while循环//break loop;System.exit(0);}default -> System.out.println("请输入1-5中的一个!");}}}
}

 经过上述功能的实现,有一点感悟:

1、首先是数据的永久化存储是放到数据库中的,例如MySQL;

2、取出数据库中的数据之后要封装到对象中,这就用到了之后的框架,例如Mybatis。

 

相关文章:

  • Langchain-实战篇-搭建本地问答机器人-01
  • Linux下QT程序启动失败问题排查方法
  • 生产环境 CentOS 7 k8s v1.28.0离线部署
  • 人工智能 (AI) 进阶【C#】版
  • pom.xml文件加载后没有变成maven图标
  • mysql 连接出现 Public Key Retrieval is not allowed
  • Android自动化测试实践:uiautomator2 核心功能与应用指南
  • 学习伦敦金技术分析的具体步骤是什么?
  • 第10天:字典和集合任务
  • 阿里云 CosyVoice 语音合成大模型 API 实践
  • HNU电子测试平台与工具2_《计算机串口使用与测量》
  • 视频监控汇聚平台LntonCVS视频监控业务平台具体有哪些功能?
  • 20240702在vmware17.5虚拟机中让ubuntu22.04使用主机的代理上网
  • [图解]SysML和EA建模住宅安全系统-07-to be块定义图
  • 【UML用户指南】-26-对高级行为建模-状态图
  • 2017前端实习生面试总结
  • CSS 三角实现
  • ECMAScript6(0):ES6简明参考手册
  • Git同步原始仓库到Fork仓库中
  • Linux链接文件
  • socket.io+express实现聊天室的思考(三)
  • SpiderData 2019年2月25日 DApp数据排行榜
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Vue 2.3、2.4 知识点小结
  • Vue2 SSR 的优化之旅
  • 闭包,sync使用细节
  • 给github项目添加CI badge
  • 记一次用 NodeJs 实现模拟登录的思路
  • 深入浅出webpack学习(1)--核心概念
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1) caustics\
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (39)STM32——FLASH闪存
  • (十三)Flask之特殊装饰器详解
  • .NET Core WebAPI中封装Swagger配置
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • [1]-基于图搜索的路径规划基础
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [C++基础]-初识模板
  • [C进阶] 数据在内存中的存储——浮点型篇
  • [C语言]——柔性数组
  • [FZSZOJ 1223] 上海红茶馆
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [iOS]随机生成UUID通用唯一识别码
  • [mysql] mysqldump 导出数据库表
  • [noip模拟]计蒜姬BFS
  • [one_demo_15]模拟交通灯管理系统
  • [PHP] 算法-顺时针打印矩阵的PHP实现
  • [SystemVerilog]常见设计模式/实践
  • [uniapp生命周期]详细讲解uniapp中那些属于vue生命周期,那些属于uniapp独有的生命周期,以及这中间的区别 相关的内容和api 代码注释
  • [USACO16FEB]负载平衡Load Balancing_Silver(NlogNlogN解法)
  • [VUE]1-创建vue工程