学生管理系统
一、登录
用户类:属性:用户名、密码、身份证号码、手机号码
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;}
这里是修改后的代码,应用了视频中的反向考虑思想:
Ⅱ、用户名的输入
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后面的语句。
由于嵌套的比较深,进行修改:
可以看到减少了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("账号信息不匹配,修改失败!");}}}
这是应用反向考虑的思想修改后的代码:
二、增删改查
初始菜单
"-------------欢迎来到黑马学生管理系统----------------" "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。
相关文章:
![](https://img-blog.csdnimg.cn/direct/bde78cce68824d00baa25232127d5f88.png)
学生管理系统
一、登录 用户类:属性:用户名、密码、身份证号码、手机号码 1、欢迎页面 System.out.println("欢迎来到学生管理系统"); System.out.println("请选择操作1登录 2注册 3忘记密码"); 代码实现: //欢迎页面public static…...
![](https://img-blog.csdnimg.cn/direct/a4cd108e50f14e27a2f9014ae3050739.png)
【linux】网络基础(3)——tcp协议
文章目录 TCP协议概括TCP头部格式TCP连接管理建立连接(三次握手)数据传输确认应答机制捎带应答 滑动窗口丢包问题 拥塞控制延时应达 终止连接(四次挥手) TCP协议概括 TCP是一个面向连接的协议,在传输数据之前需要建立连…...
![](https://www.ngui.cc/images/no-images.jpg)
[Day 21] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
區塊鏈的智能合約運行機制 區塊鏈技術自比特幣誕生以來,便以其去中心化、安全性和透明性等特點引起了廣泛的關注和應用。而智能合約作為區塊鏈技術的一大創新,進一步擴展了區塊鏈的應用場景,使其不僅僅局限於數字貨幣,還可以應用…...
![](https://img-blog.csdnimg.cn/direct/4bb980869b014bae97dbbadc3d2eeaa1.png)
使用ps给gif动图抠图
目录 导入gif图片 打开时间轴 选择图片 魔棒抠图-初步抠图 套索抠图-精准抠图 导入gif图片 打开时间轴 因为gif动图实际上多张图片实现的效果,所以如果要给gif抠图,就得挨个给每个时间线的图片抠图 点击窗口->时间轴 选择图片 在时间轴上选择要…...
![](https://img-blog.csdnimg.cn/direct/4843bef000bd455981d730e0525f036f.png)
pmp顺利通关总结
目录 一、背景二、总结三、过程 一、背景 人活着总是想去做一些事情,通过这些事情来证明自己还活着。 而我证明自己还会活着并且活得很好的方式和途径,是通过这些东西去让自己有一个明确的边界节点;借此知识来验证自己的学习能力。 我坚定认…...
![](https://img-blog.csdnimg.cn/direct/aa9c163bf22a4ed8b3b538c7fce1c509.png)
未来的钥匙在于过去:学历史的真正意义,震惊!历史竟然是偶然的?从历史中寻找未来的方向!
我们自幼接受的教育是,学历史是为了相信历史是必然的。中国人民必然战胜日寇的侵略,解放思想和改革开放必定会发生,和平和发展必定是世界的主题,中国经济必定是高速增长…… 然而,在真正的历史学家眼中,历史…...
![](https://www.ngui.cc/images/no-images.jpg)
ES6自定义模块
在ES6中,我们可以使用 export 和 import 关键字来定义和使用自定义模块。 定义模块 导出(export) 命名导出(Named Exports): 使用 export 关键字来导出模块中的变量、函数、类等。例如: // ma…...
![](https://www.ngui.cc/images/no-images.jpg)
Windows页面错误(Page Fault)写几种c++会导致,此问题的例子
在C中,直接导致Windows页面错误(Page Fault)的情景较少直接由编程错误引发,页面错误更多是由操作系统在内存管理和虚拟内存机制中处理的。不过,某些编程错误可能导致访问违规,进而间接引起操作系统报告页面…...
![](https://img-blog.csdnimg.cn/direct/b09fdb5594854717ad02a82439f7d44f.png)
AC7801时钟配置流程
一 默认配置 在启动文件中,已经对时钟进行了初始化,默认按外部8M晶振,配置系统时钟为48MHZ,APB为系统时钟的2分频,为24MHZ。在system_ac780x.c文件中,可以找到下面这个系统初始化函数,里面有Se…...
![](https://i-blog.csdnimg.cn/direct/3ea2edde7baf47b2990c5ad5b60df895.jpeg#pic_center)
加密与安全_Java 加密体系 (JCA) 和 常用的开源密码库
文章目录 Java Cryptography Architecture (JCA)开源国密库国密算法对称加密(DES/AES⇒SM4)非对称加密(RSA/ECC⇒SM2)散列(摘要/哈希)算法(MD5/SHA⇒SM3) 在线生成公钥私钥对,RSA公私钥生成参考…...
![](https://img-blog.csdnimg.cn/direct/86da5bfb956f462c9e8fd9352832fb3d.jpeg)
读书笔记-《Spring技术内幕》(三)MVC与Web环境
前面我们学习了 Spring 最核心的 IoC 与 AOP 模块(读书笔记-《Spring技术内幕》(一)IoC容器的实现、读书笔记-《Spring技术内幕》(二)AOP的实现),接下来继续学习 MVC,其同样也是经典…...
![](https://www.ngui.cc/images/no-images.jpg)
k8s及常用对象简介
文章目录 一、k8s是什么应用程序早期部署形式容器的引入k8s的作用 二、k8s中的常用对象1、Node获取node信息 2、Namespacenamespace的使用 3、Pod生命周期pod的使用 4、DaemonSetDaemonSet的使用 5、Deployment创建deploy 6、ReplicaSet7、StatefulSet创建StatefulSet 8、更新操…...
![](https://img-blog.csdnimg.cn/direct/65bd1abb97b14ef5b8e2a3c7b3277333.png)
HTTPS数字证书验证论述
1 概述 网络请求方式通常分为两种,分别是HTTP请求和HTTPS请求,其中HTTP的传输属于明文传输,在传输的过程中容易被人截取并且偷窥其中的内容,而HTTPS是一种在HTTP的基础上加了SSL/TLS层(安全套接层)的安全的…...
![](https://www.ngui.cc/images/no-images.jpg)
【高考志愿】地质资源与地质工程
目录 一、专业概述 1.1 专业定义 1.2 主要课程 1.3 专业培养目标 二、就业前景和考研方向 三、工作特点和挑战 四、如何培养核心竞争力 五、 地质资源与地质工程专业排名 六、结语 关于高考志愿选择地质资源与地质工程专业,以下是一些详细的介绍和参考信息…...
![](https://img-blog.csdnimg.cn/direct/6813bbf53b504f9eb53f8d962266903c.png)
全网最佳硕士研究生复试简历模板
硕士研究生复试简历模板 ✨ 简介 提供了一个适用于国内硕士研究生复试的个人简历模板。该模板通过统一的“样式”形成规范的Word格式,是目前研究生复试的最佳简历模板之一。模板使用“华文中宋”字体,如您的电脑中未安装此字体,请提前安装。…...
![](https://img-blog.csdnimg.cn/direct/43a91889a6d5429e92c1ae86f7f660bd.png)
Rocky Linux 9 系统OpenSSH CVE-2024-6387 漏洞修复
Rocky Linux 9系统 OpenSSH CVE-2024-6387 漏洞修复 1、漏洞修复2、修复思路3、修复方案3.1、方案一3.2、方案二 4、总结5、参考 1、漏洞修复 CVE-2024-6387:regreSSHion:OpenSSH 服务器中的远程代码执行(RCE),至少在…...
![](https://img-blog.csdnimg.cn/direct/362cf63b53354b409a141d4e287e8d90.png)
Sping源码(九)—— Bean的初始化(非懒加载)—mergeBeanDefinitionPostProcessor
序言 前几篇文章详细介绍了Spring中实例化Bean的各种方式,其中包括采用FactoryBean的方式创建对象、使用反射创建对象、自定义BeanFactoryPostProcessor以及构造器方式创建对象。 创建对象 这里再来简单回顾一下对象的创建,不知道大家有没有这样一个疑…...
![](https://img-blog.csdnimg.cn/direct/8fbf4b746c9a4e6c85b880b66926bed4.png)
labview技巧——AMC框架安装
AMC工具包的核心概念是队列,队列是一种先进先出(FIFO,First In First Out)的数据结构,适用于处理并发和异步任务。在LabVIEW中,队列可以用于在不同VI之间传递数据,确保消息的有序处理࿰…...
![](https://img-blog.csdnimg.cn/img_convert/216b2e32c89f0adea7e7d686cdd85eb0.webp?x-oss-process=image/format,png)
解锁分布式云多集群统一监控的云上最佳实践
作者:在峰 引言 在当今数字化转型加速的时代,随着混合云、多云多集群环境等技术被众多企业广泛应用,分布式云架构已成为众多企业和组织推动业务创新、实现弹性扩展的首选,分布式云容器平台 ACK One(Distributed Clou…...
![](https://www.ngui.cc/images/no-images.jpg)
学会拥抱Python六剑客,提高编程效率
在Python语言中,有六个强大的工具,它们被称为"Python六剑客"。而Python六剑客指的是Python中常用的六种功能强大且灵活的工具,它们分别是“切片(Slicing),推导列表(List Comprehensio…...
![](https://www.ngui.cc/images/no-images.jpg)
mysql 根据当前时间筛选某个时间范围内的数据
1.根据天数筛选 SELECT * FROM coupons WHERE NOW() BETWEEN start_time AND end_time; 在这个查询中,NOW()函数返回当前的日期和时间。BETWEEN操作符用于检查NOW()返回的当前时间是否在start_time和end_time之间(包括这两个时间)。 注意&a…...
![](https://www.ngui.cc/images/no-images.jpg)
Linux 常用指令详解
Linux 是一个强大而灵活的操作系统,掌握常用的 Linux 指令是使用和管理 Linux 系统的基础。本文将介绍一些常用的 Linux 指令,并附上 Vim 和 g 的常用指令说明,帮助你更好地进行开发和操作。 1. 基本文件操作指令 1.1 显示目录内容 ls常用…...
![](https://img-blog.csdnimg.cn/direct/c21469203bcd4578b6bdf5b10e1c3252.jpeg#pic_center)
【简单讲解下npm常用命令】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
![](https://www.ngui.cc/images/no-images.jpg)
Header Location重定向机制解析与应用
Header Location重定向机制解析与应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨HTTP中的Header Location重定向机制,以及在…...
![](https://img-blog.csdnimg.cn/img_convert/8241f0100d0307cece79818d21a1e657.png)
硅纪元AI应用推荐 | 国产创作引擎即梦AI助力创作者探索创作新境界
“硅纪元AI应用推荐”栏目,为您精选最新、最实用的人工智能应用,无论您是AI发烧友还是新手,都能在这里找到提升生活和工作的利器。与我们一起探索AI的无限可能,开启智慧新时代! 在人工智能快速发展的今天,各…...
![](https://www.ngui.cc/images/no-images.jpg)
使用TableGeneration生成已标注的表格数据用于表格识别
利用 TableGeneration 生成多样化表格数据 TableGeneration 简介环境准备chrome浏览器(Linux下推荐)火狐浏览器(Mac下推荐) 生成表格生成表格 参数说明结论 在数据生成和处理领域,表格数据的生成是一个常见需求,尤其是在机器学习和数据分析领域。今天&am…...
![](https://img-blog.csdnimg.cn/img_convert/31f964b40e10e781878085a310ec05b3.png)
赛目科技三度递表:净利率及资产回报率不断下滑,经营成本越来越高
《港湾商业观察》施子夫 5月29日,北京赛目科技股份有限公司(以下简称,赛目科技)第三次递表港交所,公司拟主板上市,独家保荐机构为光银国际。 公开信息显示,赛目科技此前曾于2022年12月&#x…...
![](https://img-blog.csdnimg.cn/direct/95ed46010e3b4fd3958377a87c5e7597.gif)
【QT】概述|对象树模型|两种控件模式|信号和槽|lambda
目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…...
![](https://www.ngui.cc/images/no-images.jpg)
Java中的安全编码实践与防御技巧
Java中的安全编码实践与防御技巧 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨Java中的安全编码实践与防御技巧,这对于开发人员来说…...
![](https://www.ngui.cc/images/no-images.jpg)
linux 常用的命令、文件路径、其他工具或软件包
命令 sudo apt dist-upgrade 解决显示 暂不升级、未被升级dd if/dev/zero of./rootfs.img bs1G count6 制作一个 6G 的空白镜像。bs 是块字节数,count 是 bs 的个数。dd if./rootfs.img of/dev/sdc2 bs512 烧录 rootfs.img 镜像到 /dev/sdc2。bs 是 512 个字节&…...
![](https://img-blog.csdnimg.cn/direct/1fe08f8316d5442ca2c6f8f91001e388.png)
00 如何根据规律在变化中求发展?
你好,我是周大壮。目前,我已在搜索推荐等算法技术领域从事研发近 10 年,做过诸多流量分发领域的算法技术工作。 如今任 58 同城的算法架构师、技术委员会人工智能分会委员、58 本地服务事业群算法策略部负责人,我主要负责 58 集团…...
![](https://www.ngui.cc/images/no-images.jpg)
UUID和自增ID做主键到底哪个好?
UUID(通用唯一识别码) 优点: 全局唯一性:由不同算法生成,确保全球范围内的唯一性,避免主键冲突。不可预测性:随机生成,难以被猜测,适合保密性应用。分布式应用࿱…...
![](https://www.ngui.cc/images/no-images.jpg)
FW SystemUI Keyguard解析(二)
文章目录 CTS之Keyguard Menu事件处理 CTS之Keyguard Menu事件处理 事件触发点: NotificationShadeWindowViewController.dispatchKeyEvent 设置setInteractionEventHandler回调之后通过NotificationShadeWindowView 触发 调用到return mService.onMenuPressed(); public cla…...
![](https://img-blog.csdnimg.cn/direct/0ff5c55848cd45a6ac07c041a1f96746.png)
MySQL之备份与恢复(二)
备份与恢复 定义恢复需求 如果一切正常,那么永远也不需要考虑恢复。但是,一旦需要恢复,只有世界上最好的备份系统是没用的,还需要一个强大的恢复系统。 不幸的是,让备份系统平滑工作比构造良好的恢复过程和工具更容易…...
![](https://img-blog.csdnimg.cn/direct/ae0d26ed3e2e4e3aa79719da49dcbb48.png)
MySQL:保护数据库
保护数据库 1. 用户1.1 创建用户1.2 查看用户1.3 删除用户1.4 修改密码 2. 权限2.1 授予权限2.2 查看权限2.3 撤销权限 之前都是介绍本地数据库而你自己就是数据库的唯一用户,所以不必考虑安全问题。但实际业务中数据库大多放在服务器里,你必须妥善处理好…...
![](https://img-blog.csdnimg.cn/direct/39ff065f5d164957ad8dde048c1dffb7.png)
不是大厂云用不起,而是五洛云更有性价比
明月代维的一个客户的大厂云境外云服务器再有几天就到期了,续费提醒那是提前一周准时到来,但是看到客户发来的续费价格截图,我是真的没忍住。这不就是在杀熟吗?就这配置续费竟然如此昂贵?说实话这个客户的服务器代维是…...
![](https://img-blog.csdnimg.cn/direct/ef57f3e9042341e0aac95ce7259ae303.png#pic_center)
C++初学者指南-3.自定义类型(第一部分)-异常
C初学者指南-3.自定义类型(第一部分)-异常 文章目录 C初学者指南-3.自定义类型(第一部分)-异常简介什么是异常?第一个示例用途:报告违反规则的行为异常的替代方案标准库异常处理 问题和保证资源泄露使用 RAII 避免内存泄漏!析构函数:不要让异…...
![](https://img-blog.csdnimg.cn/direct/5174965946b749c298784753fb3b00ba.png)
学会python——用python编写一个电子时钟(python实例十七)
目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.电子时钟程序 3.1 代码构思 3.2代码实例 3.3运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性…...
![](https://img-blog.csdnimg.cn/direct/c6c3668ee1ee46bba67a9cc6c3f8098b.png)
elementui中@click短时间内多次触发,@click重复点击,做不允许重复点击处理
click快速点击,发生多次触发 2.代码示例: //html<el-button :loading"submitLoading" type"primary" click"submitForm">确 定</el-button>data() {return {submitLoading:false,}}//方法/** 提交按钮 */sub…...
![](https://img-blog.csdnimg.cn/direct/bed8463545f84d0190cd4a0950181358.png#pic_center)
助力游戏实现应用内运营闭环,融云游戏社交方案升级!
通信能力在所有应用场景都是必备组件,这源于社交属性带给应用的增长神话。 在游戏场景,玩家从少数核心向大众用户泛化扩展的过程,就是游戏深度融合社交能力的过程。 从单机到联机,游戏乐趣的升级 1996 年,游戏界顶流…...
![](https://img-blog.csdnimg.cn/direct/5dbad955894b41cb85bbf30484b58463.png)
守护创新之魂:源代码防泄漏的终极策略
在信息化快速发展的今天,企业的核心机密数据,尤其是源代码,成为了企业竞争力的关键所在。然而,源代码的泄露风险也随之增加,给企业的安全和发展带来了巨大威胁。在这样的背景下,SDC沙盒作为一种创新的源代码…...
![](https://img-blog.csdnimg.cn/direct/2263f759e4004780a6d4f5bf8c428355.png)
Halcon 基于分水岭的目标分割
一 分水岭 1 分水岭介绍 传统的分水岭分割方法,是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是地质学上的拓扑地貌,图像中每一像素的灰度值表示该点的海拔高度,每一个局部极小值及其周边区域称为集水盆地&…...
![](https://img-blog.csdnimg.cn/direct/e9d24ba0fc5c41b7a71f569f1bc63ad9.png)
PHP 面向对象编程(OOP)入门指南
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,通过使用对象来设计和组织代码。PHP作为一种广泛使用的服务器端脚本语言,支持面向对象编程。本文将介绍PHP面向对象编程的基本概念和用法࿰…...
![](https://img-blog.csdnimg.cn/direct/11c060aedac0418f88377863a7fde057.png)
Django学习第三天
python manage.py runserver 使用以上的命令启动项目 实现新建用户数据功能 views.py文件代码 from django.shortcuts import render, redirect from app01 import models# Create your views here. def depart_list(request):""" 部门列表 ""&qu…...
![](https://img-blog.csdnimg.cn/direct/6b467c3227b64bf0915d9dbbe465c8b9.png)
Vue3实现点击按钮实现文字变色
1.动态样式实现 1.1核心代码解释: class"power-station-perspective-item-text": 为这个 span 元素添加了一个 CSS 类,以便对其样式进行定义。 click"clickItem(item.id)": 这是一个 Vue 事件绑定。当用户点…...
![](https://www.ngui.cc/images/no-images.jpg)
深入理解Vue生命周期钩子函数
深入理解Vue生命周期钩子函数 Vue.js 是一款流行的前端框架,通过其强大的响应式数据绑定和组件化的开发方式,使得前端开发变得更加简单和高效。在Vue应用中,每个组件都有其生命周期,这些生命周期钩子函数允许开发者在不同阶段执行…...
![](https://img-blog.csdnimg.cn/direct/35fc72bda897410c9eaec5e3320e7b8a.png)
Linux-gdb
目录 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 4.快速跳出函数体 5.其他 1.-g 生成含有debug信息的可执行文件 2.gdb开始以及gdb中的常用执行指令 3.断点的本质用法 断点的本质是帮助我们缩小出问题的范围 比如,…...
![](https://www.ngui.cc/images/no-images.jpg)
Oracle分析表和索引(analyze)
分析表 analyze table tablename compute statistics; 分析索引 analyze index indexname compute statistics; 该语句生成的统计信息会更新user_tables这个视图的统计信息,分析的结果被Oracle用于基于成本的优化生成更好的查询计划 对于使用CBO(Cost-Base Optimization)很有好…...
![](https://img-blog.csdnimg.cn/direct/22619bf763704fbaa9490e435b81ec3a.png)
MyBatis踩坑记录-多表关联字段相同,字段数据覆盖问题
MyBatis踩坑记录-多表关联字段相同,字段数据覆盖问题 1. 背景描述2. 实体记录3. 错误映射3.1 造成的影响 4. 解决办法4.1 修改映射文件 5. 修复后的效果5.1 返回的数据5.2 正确展示 7. end ~ 1. 背景描述 现有一下业务,单个任务下可能会有多个子任务&am…...
![](https://img-blog.csdnimg.cn/direct/0a5bdf0564754f119ee3a8eadee65dbc.png)
昇思25天学习打卡营第6天|数据变换 Transforms
学习目标:熟练掌握数据变换操作 熟悉mindspore.dataset.transforms接口 实践掌握常用变换 昇思大模型平台学习心得记录: 一、关于mindspore.dataset.transforms 1.1 变换 mindspore.dataset.transforms.Compose将多个数据增强操作组合使用。 mindspo…...
![](https://www.ngui.cc/images/no-images.jpg)
flask-apscheduler 定时任务被执行两次
定时任务没有被多次调用,事实上如果多次调用的话,flask-apscheduler会抛出异常。 但一开始任务还是按时执行一次,重启flask或者修改部分代码后,就发送定时任务一次执行两次了。 之所以会发生这种情况,是因为在debug模…...
归并排序详解(递归与非递归)
归并排序是建立在归并操作上的一种有效算法。该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列间断有序。若将两个有序表合并成一个有序表,成为二路归并。 一…...
![](https://img-blog.csdnimg.cn/direct/63a16ecc99c54775bc8f68a19b9bd848.png)
RabbitMQ入门教程(精细版二带图)
目录 六 RabbitMQ工作模式 6.1Hello World简单模式 6.1.1 什么是简单模式 6.1.2 RabbitMQ管理界面操作 6.1.3 生产者代码 6.1.4 消费者代码 6.2 Work queues工作队列模式 6.2.1 什么是工作队列模式 6.2.2 RabbitMQ管理界面操作 6.2.3 生产者代码 6.2.4 消费者代码 …...
![](https://www.ngui.cc/images/no-images.jpg)
大数据开发语言 Scala(三):控制流程和函数
目录 1. Scala的控制流程 1.1 条件语句 1.2 循环语句 1.3 模式匹配 2. Scala的函数 2.1 函数定义 2.2 匿名函数 2.3 高阶函数 2.4 柯里化 3. 实践中的Scala控制流程与函数 3.1 使用模式匹配实现简单的命令解析器 3.2 使用高阶函数实现数据处理流水线 3.3 使用柯里…...
![](https://www.ngui.cc/images/no-images.jpg)
C++利用常量来防止形参误修改 函数被定义两次是不允许的
#include<iostream> using namespace std;void displayInfo(const int& num) {// 函数体内不能修改num的值cout << "num " << num << endl; }int main() {int myNumber 5;displayInfo(myNumber);// 传递myNumber的引用,但不…...
![](https://i-blog.csdnimg.cn/direct/77bfbafc02474cff93a18592825f3bff.png)
用requirements.txt配置环境
1. 在anaconda创建环境 创建Python版本为3.8的环境,与yolov5所需的包适配。 2. 在Anaconda Prompt中激活环境 (base) C:\Users\吴伊晴>conda activate yolov5 3. 配置环境 用指定路径中的requirements.txt配置环境。 (yolov5) C:\Users\吴伊晴>pip insta…...
![](https://www.ngui.cc/images/no-images.jpg)
伊莱克斯可持续发展副总裁SarahSchaefer:可持续发展是伊莱克斯
“联合国可持续发展气候目标中有范围一和范围二的碳排放目标。在范围一及范围二(运营过程)中,我们在2022年提前三年实现了阶段性目标,与2015年相比减少了80%以上的绝对碳排放量。伊莱克斯集团运营里60%的能源是可再生能源、71%的工厂已经实现了零填埋的目标。”伊莱克斯集团欧…...
![](https://www.ngui.cc/images/no-images.jpg)
未来三年雷军和他的小米汽车首先不得不为生存而战
小米SU7正式上市,可谓红透了汽车界。雷军及小米汽车多个话题登上热搜,而大定的数据也映衬出小米SU7的热度。然而,在一片喧嚣声中,我倒觉得,未来三年雷军和他的小米汽车首先不得不为生存而战。未来三年小米汽车大概率将是亏损运营。从这次小米SU7的定价就可以看出端倪。小米…...
![](https://img-blog.csdnimg.cn/img_convert/ca6aae702de3501e44ab05becfef3c81.png)
开源工具专题-04 Atlassian Crowd部署备份及迁移
开源工具专题-04 Atlassian Crowd部署备份及迁移 注: 本教程由羞涩梦整理同步发布,本人技术分享站点:blog.hukanfa.com转发本文请备注原文链接,本文内容整理日期:2024-05-29csdn 博客名称:五维空间-影子&…...
![](https://www.ngui.cc/images/no-images.jpg)
transformer的特点
Transformers是一种用于处理序列数据的神经网络架构,最初由Vaswani等人在2017年提出,主要用于自然语言处理任务。与传统的循环神经网络(RNN)和卷积神经网络(CNN)不同,Transformers采用了一种全新…...
![](https://img-blog.csdnimg.cn/direct/63afc629914c4a569a295ce18f68f37d.jpeg)
线上自由DIY预约小程序源码系统 自由DIY你的界面 带完整的的安装代码包以及搭建教程
系统概述 在当今数字化时代,移动应用成为人们生活和工作中不可或缺的一部分。预约小程序作为一种便捷的工具,为用户提供了高效的预约服务体验。而线上自由 DIY 预约小程序源码系统则为开发者和企业提供了更大的自由度和创造力,让他们能够根据…...
![](https://www.ngui.cc/images/no-images.jpg)
【Python-openslide】openslide.open_slide()
作用: 打开图片 wsi openslide.open_slide(path)注: path: 图片所在路径,需要具体到图片名称(包含扩展名) 我的实验中采用的是svs格式的图像...