package information;
import java.sql.Connection;
import java.util.*;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
class User{
String name;
String password;
void setName(String s){
name=s;
}
void setPassword(String s){
password=s;
}
String getName() {
return name;
}
String getPassword() {
return password;
}
}
class DBUtil{
private static final String URL = "jdbc:mysql://localhost:3306/Information?"+
"useSSL=false&serverTimezone=GMT&characterEncoding=utf-8";
private static final String USER="root";
private static final String PASSWORD="dbqyyl276151.";
private static Connection conn=null;
//connetcDB方法:连接数据库
public static void connetcDB() {
try{ //加载JDBC-MySQL8.0连接器:
Class.forName("com.mysql.cj.jdbc.Driver");
}
catch(Exception e){}
try{
conn=DriverManager.getConnection(URL,USER,PASSWORD);
}
catch(SQLException e){
System.out.println(e);
}
}
public static Connection getConnection(){
return conn;
}//getConnection方法:返回所建立的数据库连接,即:Connection对象
}
class UserDao{
User user;
DBUtil a=new DBUtil();
boolean find(String s) {
boolean flag=false;
try {
a.connetcDB();
Connection con=a.getConnection();
Statement sql=con.createStatement();
String record="name";
String findRecord="select * from userinfo where "+record+"='"+s+"'";
ResultSet rs=sql.executeQuery(findRecord);
if(rs.next())
flag=true;
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
return flag;
}
void addStudent(User user) {
try {
a.connetcDB();
Connection con=a.getConnection();
Statement sql=con.createStatement();
String record=user.name;
String record1=user.password;
String addRecord="insert into userInfo values "+"('"+record+"','"+record1+"')";
int ok=sql.executeUpdate(addRecord);
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
void query(String s) {
try {
a.connetcDB();
Connection con=a.getConnection();
Statement sql=con.createStatement();
String record="name";
String findRecord="select * from userinfo where "+record+"='"+s+"'";
ResultSet rs=sql.executeQuery(findRecord);
if(rs.next())
System.out.println(rs.getString(1)+" "+rs.getString(2));
else System.out.println("不存在该用户!");
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
void delete(String s){
try {
a.connetcDB();
Connection con=a.getConnection();
Statement sql=con.createStatement();
String deleteRecord="delete from userinfo where name = '"+s+"'";
int ok=sql.executeUpdate(deleteRecord);
System.out.println("删除成功!");
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
void update() {
try {
a.connetcDB();
Connection con=a.getConnection();
Statement sql=con.createStatement();
String name=new String();
Scanner reader = new Scanner(System.in);
System.out.println("请输入想要修改的用户姓名:");
name=reader.next();
String record=new String();
System.out.println("请输入想要修改的信息(name/password):");
record=reader.next();
String xinxi=new String();
System.out.println("请输入想把信息修改为:");
xinxi=reader.next();
String newrecord="update userinfo set "+record+"='"+xinxi+"'where name='"+name+"'";
sql.executeUpdate(newrecord);
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
void queryAll() {
try {
a.connetcDB();
Connection con=a.getConnection();
Statement sql=con.createStatement();
String allRecord="select * from userinfo ";
ResultSet rs;
rs=sql.executeQuery(allRecord);
while(rs.next()) {
String name=rs.getString(1);
String password=rs.getString(2);
System.out.println(name+" "+password);
}
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
}
public class information{
public static void main(String []args) {
Scanner read = new Scanner(System.in);
UserDao userDao=new UserDao();
User user=new User();
String a=new String();
// user.setName("张三");
// user.setPassword("12345")
// userDao.addStudent(user);
String flag=new String();
while(true) {
System.out.println("欢迎来到yyl的数据库管理系统");
System.out.println("请选择你想要的操作");
System.out.println("1.添加用户(输入数字1):");
System.out.println("2.查询用户(输入数字2):");
System.out.println("3.更新用户信息(输入数字3):");
System.out.println("4.删除用户信息(输入数字4):");
System.out.println("5.查询表内所有用户信息(输入数字5):");
System.out.print("0.完成操作(输入数字0):");
flag=read.next();
if(flag.equals("1"))
while(true) {
System.out.println("是否添加一个用户信息?(是,输入1;否,输入0)");
a=read.next();
if(a.equals("0")) break;
else if(!a.equals("1")) {System.out.println("输入信息错误!"); continue;}
String name,password;
name=new String();
password=new String();
System.out.print("请输入用户姓名:");
name=read.next();
while(userDao.find(name)==true) {
System.out.print("用户名重复!请重新输入用户姓名:");
name=read.next();}
user.setName(name);
System.out.print("请设置用户密码:");
password=read.next();
user.setPassword(password);
userDao.addStudent(user);
System.out.println("设置成功!");
}
else if(flag.equals("2"))
while(true) {
System.out.println("是否查询用户信息?(是,输入1;否,输入0)");
a=read.next();
if(a.equals("0")) break;
else if(!a.equals("1")) {System.out.println("输入信息错误!"); continue;}
String name;
name=new String();
System.out.print("请输入待查询的用户姓名:");
name=read.next();
userDao.query(name);
}
else if(flag.equals("3"))
while(true) {
System.out.println("是否更新用户信息?(是,输入1;否,输入0)");
a=read.next();
if(a.equals("0")) break;
else if(!a.equals("1")) {System.out.println("输入信息错误!"); continue;}
userDao.update();
}
else if(flag.equals("4"))
while(true) {
System.out.println("是否删除用户信息?(是,输入1;否,输入0)");
a=read.next();
if(a.equals("0")) break;
else if(!a.equals("1")) {System.out.println("输入信息错误!"); continue;}
String name;
name=new String();
System.out.print("请输入待删除的用户姓名:");
name=read.next();
if(userDao.find(name)==false) {
System.out.print("用户名不存在!");
}
else userDao.delete(name);
}
else if(flag.equals("5")) userDao.queryAll();
else if(flag.equals("0")) {System.out.println("您已退出系统期待您的再次使用"); break;}
else {
System.out.println("输入信息错误请重新输入:");}
}
read.close();}
}
实验内容:
使用MySQL(或SQL Server)数据库管理系统,建立名为“Information”数据库,在该数据库中创建名为“userInfo”的数据表,用于存储用户注册时在注册界面输入的用户信息,包括:用户名、密码等,为“userInfo”表设置主键。
编写User.java类,该类对应于数据库的userInfo表,其成员变量和数据库字段相对应,提供对成员变量操作的方法,比如:成员变量的set方法和get方法等。
//User.java public class User{ …… } |
编写类数据库连接类DBUtil.java,该类实现连接数据库的功能,该类模板如下:
//数据库连接类,需要连接数据库时使用该类 publicclass DBUtil { //设置数据库参数 privatestaticfinal String URL = "jdbc:sqlserver://localhost:1433;DatabaseName=factory"; privatestaticfinal String USER="sa"; privatestaticfinal String PASSWORD="12345"; privatestatic Connection conn=null;
//connetcDB方法:连接数据库 public static void connetcDB() { //补充与数据库建立连接的代码 }
//getConnection方法:返回所建立的数据库连接,即:Connection对象 publicstatic Connection getConnection(){ returnconn; } } |
编写数据访问类UserDao.java(Data Access Object,DAO),该类负责提供方法对User表进行增查删改等所有操作,其它类需要对User表进行增查删改等操作时直接该使用该类。
add(User user)方法:添加一个用户的信息到User表中,如果用户已经存在则不重复添加。
query(String name)方法:按用户姓名查找用户,还可以根据其他字段查询用户。
delete(String name)方法:删除一个用户记录,比如:根据用户名或编号删除某个用户。
update()方法:更新用户信息,比如:修改密码。
queryAll()方法:遍历并显示所有用户信息。
/*UserDao.java, 是专为User类设计的数据访问类,该类使用JDBC编程提供数据的增查删改的服务,所有需要操作数据库的sql语句均包含在该类中。 */ public class UserDao{ //构造方法 ……
//方法 …… } |
编写测试类Test.java,测试以下功能,该类模板如下::
添加一个新用户
按新用户名查询用户
修改用户密码
删除新用户
查询并显示所有用户
//Test.java public class Test{ publicstaticvoid main(String[] args) throws Exception { UserDao userDao=new UserDao(); //添加用户 User user=new User(); user.setName("张三"); user.setPassword("12345"); userDao.addStudent(user); …… } } |
实验中的问题及解决方案(不少于100字)
问题1:添加新用户时,从键盘读入String类型的name和password总是只能读入一个,另一个自动赋为空(虽然mysql里声明了not null)
解决方法:String类型是不能改变的,但是找了一下没找到直接的StringBuffer的读入方法,索性将两个信息在输入循环里声明,然后试错发现需要用next读入,nextline可能存在问题导致只能读入一个信息
问题2:用户名查询信息时,查询不到会报Exception in thread "main"错误,
解决方法:匹配用户名输出信息时加“ if(rs.next())”就可以输出,查资料发现:ResultSet是访问数据库返回的数据表,作为结果集合,一开始是处于“第一行”之前的,使用了next( )才将指针指向返回结果表的第一行,另添加了用户名输入错误,查询不到用户的情况
问题3:mysql建表时申明的主键并不会自动重复、为空时就报错
解决方法:需要自己写一个函数去判断是否重复或为空
问题4:update更新里用到Scanner,后在函数里关闭,但在主函数里也关闭了读入。
解决方法:试错发现在函数里把reader.close()删去就对了,询问老师发现,scanner对象共用一个缓冲区,一个程序里出现俩个scanner对象是很危险的,以及读入read的close可以不用关闭,只是会有一个警告。
问题5:为了使作业更完整,我添加了选择操作的功能,然后!一开始我想的是输入数字控制操作,而后觉得万一输入错误,则编译会直接报错而跳出代码。而后想到用string字符串来存储数字来选择,而后遇到了疯狂输出“输入信息错误请重新输入”
解决方法:而后想到了用判断字符串相等,但是我直接写的“==”,but!!!java里应该用equals函数。
String str3=new String(“123”);运行时把123放入堆中,在堆中创建一个对象,
而String str1=“123”把123放入常量池,编译时产生;String str2=“123”引用常量池中的对象,不会重新创建对象。则str1==str2是真,str2==str3是假