0x00 课题内容
实验十 文件操作练习
- 使用MySQL数据库管理系统,建立名为“Information”数据库,在该数据库中创建表名为“userInfo”的数据表,用于存储用户注册时在注册界面输入的用户信息,包括:用户名、密码等,为“userInfo”表设置主键。
- 编写User.java类,该类对应于数据库的userInfo表,其成员变量和数据库字段相对应,提供对成员变量操作的常规方法,包括:所有成员变量的set方法和get方法等。
- 编写数据库连接类DBUtil.java,该类实现连接数据库的功能
- 编写数据访问类UserDao.java(Data Access Object,DAO),该类负责提供方法对User表进行增查删改等所有操作,其它类需要对User表进行增查删改等操作时直接该使用该类。
add(User user)
方法:添加一个用户的信息到User表中,如果用户已经存在则不重复添加。queryByName(String name)
方法:按用户姓名查找用户,还可以根据其他字段查询用户。deleteByName(String name)
方法:删除一个用户记录,比如:根据用户名或编号删除某个用户。update()
方法:更新用户信息,比如:修改密码。queryAll()
方法:遍历并显示所有用户信息。- 编写测试类
Test.java
,测试以下功能:- 查询并显示所有用户
- 添加一个用户
- 按用户名查询用户
- 修改用户密码
- 删除用户
0x01 源代码
UserDao.java
package DBUtil;
import java.sql.*;
public class UserDao {
Connection conn;
ResultSet rs = null;
UserDao() { //初始化自动连接到数据库
DBUtil.connetcDB();
this.conn = DBUtil.getConnection(); //获得链接
}
public void add(User user) { //返回是否添加成功
String sql = "insert into userinfo(ID,username,password) values(?,?,?)";
try {
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, user.getID());
st.setString(2, user.getUsername());
st.setString(3, user.getPassword());
int result = st.executeUpdate();
System.out.println("成功添加用户" + user.getUsername() + ",影响行数:" +
result + "\n");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public void queryByName(String name) { //返回一个javasql记录
String sql = "SELECT * from userinfo where username = ?"; //查询
try {
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, name);
rs = st.executeQuery();
while (rs.next()) {
String ID = rs.getString(1);
String name1 = rs.getString(2);
String password = rs.getString(3);
System.out.println("成功查询到以下数据:");
System.out.println("ID\t\t用户名\t\t密码"); //输出
System.out.println(ID + "\t\t" + name1 + "\t\t\t" + password + "\n"); //输出
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public void deleteByName(String name) {
String sql = "delete from userinfo where username = ?";
try {
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, name);
int result = st.executeUpdate();
System.out.println("成功删除用户:" + name + "\t影响行数:" + result + "\n");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public void updatePassword(String name, String password) {
String sql = "update userinfo set password = ? where username = ?";
try {
PreparedStatement st = conn.prepareStatement(sql);
st.setString(1, password);
st.setString(2, name);
int n = st.executeUpdate();
System.out.println("更新用户:" + name + "成功,影响行数:" + n + "\n");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public void queryAll() {
String sql = "select * from userinfo";
try {
PreparedStatement st = conn.prepareStatement(sql);
rs = st.executeQuery(sql);
System.out.println("全部用户信息如下:");
System.out.println("ID\t\t用户名\t\t密码"); //输出
while (rs.next()) {
String ID = rs.getString(1);
String name = rs.getString(2);
String password = rs.getString(3);
System.out.println(ID + "\t\t" + name + "\t\t\t" + password); //输出
}
System.out.println("\n");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
User.java
package DBUtil;
public class User {
private String username;
private String password;
private String Id;
public User() {
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getID()
{
return Id;
}
public void setName(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setID(String ID) {
this.Id = ID;
}
}
DBUtil.java
package DBUtil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
//设置数据库参数
private static final String driver = "com.mysql.cj.jdbc.Driver";
private static final String URL = "jdbc:mysql://127.0.0.1:3306/information?useSSL=true&characterEncoding=utf-8&serverTimezone=GMT";
private static final String USER = "information";
private static final String PASSWORD = "123456";
private static Connection conn = null;
//connetcDB方法:连接数据库
public static void connetcDB() {
try {
Class.forName(driver);
conn = DriverManager.getConnection(URL,USER,PASSWORD);
}
catch (SQLException | ClassNotFoundException throwables) {
throwables.printStackTrace();
}
}
//getConnection方法:返回所建立的数据库连接,即:Connection对象
public static Connection getConnection() {
return conn;
}
public static void closeConnection(){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
DBUtil(){
}
}
Test.java
package DBUtil;
public class test {
public static void main(String[] args) {
UserDao userDao = new UserDao();
//查询所有用户
userDao.queryAll();
//通过姓名删除用户
userDao.deleteByName("张三");
userDao.queryAll();
//添加一个用户
User user = new User();
user.setID("007");
user.setName("张三");
user.setPassword("abcde");
userDao.add(user);
// 通过姓名查询用户
userDao.queryByName("张三");
// 修改新用户的密码
userDao.updatePassword("张三", "56789");
userDao.queryByName("张三");
//关闭数据库连接
DBUtil.closeConnection();
}
}
0x02 测试结果
运行窗口截图:
Mysql截图:
0x03 问题及解决方案
实验中的问题:
- 无法正常连接到数据库;
- 无法正常执行SQL语句;
- 执行SQL语句使用错误;
解决方案:
- 检测
Mysql
是否正常启动,重新设置数据库名和密码,修改数据库连接地址为localhost
或127.0.0.1
,导入JDBC
驱动,再次连接数据库即可正常回显。 - 验证
SQL
语句是否正确,并将SQL
语句在Mysql
执行,执行正确并返回正确的信息,替换错误的SQL语句即可正常执行。 executeUpdate
和executeQuery
区分,前者执行增删改,返回修改影响的行数;而后者执行查询,返回SQL
记录,迭代器用法。
0x04 Gitee开源仓库
本文代码已经上传至Gitee
上的仓库
📮评论