暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第十一章 JDBC与MySQL数据库(12)——应用举例(上)

凯哥的故事 2020-09-14
561

应用举例

注册与登录是软件中经常遇到的模块,本节结合数据库,讲解怎样实现注册与登录。

设计思路

①数据库设计

数据库设计是软件开发中一个非常重要的环节,在清楚了用户的需求之后,就需要进行数据库设计。数据库设计好之后才能进入软件的设计阶段,因此当一个应用问题的需求比较复杂时,数据库的设计(主要是数据库中各个表的设计)就显得尤为重要(要认真学习好数据库原理这门课程)。

②数据模型

程序应当将某些密切相关的数据封装到一个类中,例如,把数据库的表的结构封装到一个类中,即为表建立数据模型。其目的是用面向对象的方法来处理数据。

③数据处理者

程序应尽可能将数据的存储与处理分开,即使用不同的类。数据模型仅仅存储数据,数据处理者根据数据模型和需求处理数据,例如当用户需要注册时,数据处理者将数据模型中的数据写入到数据库的表中。

④视图

程序尽可能提供给用户交互方便的视图,用户可以使用该视图修改模型中的数据,并利用视图提供的交互事件(例如ActionEvent事件),将模型交给数据处理者。

具体设计

①user数据库和register表

使用MySQL客户端管理工具创建名字是user的数据库,在该库中新建名字是register的表,表的设计结构如下图所示。

其中id字段的值是用户注册的id(是主键,即要求表中各个记录的id值不能相同),password字段的值是用户注册的密码,birth字段的值是用户注册的出生日期。

②模型

(1)注册模型

数据模型的作用是存放数据,一般不参与数据的操作,大部分情况下,数据模型只需提供设置数据和获取数据的方法。

(2)登录模型

登录模型只存放用户名、密码和登录是否成功的数据。

(3)代码

模型的包名都是fan.model,程序代码如下所示:

1.注册模型的代码

package fan.model;
public class Register {
String id;
String password;
String birth;
public void setID(String id) {
this.id = id;
}
public void setPassword(String password) {
this.password = password;
}
public void setBirth(String birth) {
this.birth = birth;
}
public String getID() {
return id;
}
public String getPassword() {
return password;
}
public String getBirth() {
return birth;
}
}

     2.登录模型的代码

package fan.model;
public class Login {
boolean loginSuccess = false;
String id;
String password;
public void setID(String id) {
this.id = id;
}
public void setPassword(String password) {
this.password = password;
}
public String getID() {
return id;
}
public String getPassword() {
return password;
}
public void setLoginSuccess(boolean bo) {
loginSuccess = bo;
}
public boolean getLoginSuccess() {
return loginSuccess;
}
}

③数据处理

(1)注册处理者

本问题中需要把数据处理单独交给一个HandleInsertData类去完成,该类要负责将模型中的数据写入到user数据库的register表中,即负责向rigister表插入记录。

(2)登录处理者

本问题中需要把数据处理单独交给一个HandleLogin类去完成,该类要负责去查询user数据库的register表,检查用户是否是已经注册的用户。

(3)代码

数据处理者的包名都是fan.handle,程序代码如下所示:

1.注册处理者的代码

package fan.handle;
import fan.model.Register;
import java.sql.*;
import javax.swing.JOptionPane;
public class HandleInsertData {
Connection con;
PreparedStatement preSql;
public HandleInsertData() {
try {
Class.forName("com.mysql.jdbc.Driver"); //加载JDBC-MySQL驱动
}
catch(Exception e) {}
String uri="jdbc:mysql://localhost:3306/user?useSSL=true";
try {
con = DriverManager.getConnection(uri,"root",""); //连接代码
}
catch (SQLException e) {}
}
public void writeRegisterModel(Register register) {
String sqlStr ="insert into register values (?,?,?)";
int ok= 0;
try {
preSql = con.prepareStatement(sqlStr);
preSql.setString(1,register.getID());
preSql.setString(2,register.getPassword());
preSql.setString(3,register.getBirth());
ok = preSql.executeUpdate();
con.close();
}
catch(SQLException e) {
JOptionPane.showMessageDialog(null,"id不能重复","警告",JOptionPane.WARNING_MESSAGE);
}
if(ok!=0) {
JOptionPane.showMessageDialog(null,"注册成功","恭喜",JOptionPane.WARNING_MESSAGE);
}
}
}

     2.登录处理者的代码

package fan.handle;
import java.sql.*;
import javax.swing.JOptionPane;
import fan.model.Login;
public class HandleLogin {
Connection con;
PreparedStatement preSql;
ResultSet rs;
public HandleLogin() {
try {
Class.forName("com.mysql.jdbc.Driver");
}
catch (Exception e) {}
String uri = "jdbc:mysql://localhost:3306/user?useSSL=true";
try {
con = DriverManager.getConnection(uri,"root",""); //连接代码
}
catch (SQLException e) {}
}
public Login queryVerify(Login loginModel) {
String id = loginModel.getID();
String pw = loginModel.getPassword();
String sqlStr = "select id,password from register where id = ? and pasaword = ?";
try {
preSql = con.prepareStatement(sqlStr);
preSql.setString(1,id);
preSql.setString(2,pw);
rs = preSql.executeQuery();
if(rs.next()==true) { //检查是否是注册的用户
loginModel.setLoginSuccess(true);
JOptionPane.showMessageDialog(null,"登录成功","恭喜",JOptionPane.WARNING_MESSAGE);
}
else {
loginModel.setLoginSuccess(false);
JOptionPane.showMessageDialog(null,"登录失败","登录失败,重新登录",JOptionPane.WARNING_MESSAGE);
}
con.close ();
}
catch (SQLException e) {}
return loginModel;
}
}

(4)简单的测试

有了模型和数据处理者,现在就可以用命令行(也算是简单视图)实现注册和登录。先体会一下,后面我们将继续提供更好的视图。主类Cheshi的包名是fan.cheshi,实现了注册并登录,如果登录成功,就输出一句欢迎语“登录成功了!”。程序代码如下所示:

package fan.cheshi;
import fan.handle.HandleInsertData;
import fan.handle.HandleLogin;
import fan.model.Login;
import fan.model.Register;
public class Cheshi {
public static void main(String[] args) {
Register user = new Register();
user.setID("moonjava");
user.setPassword("123456");
user.setBirth("1999-12-10");
HandleInsertData handleRegister = new HandleInsertData();
handleRegister.writeRegisterModel(user);
Login login = new Login();
login.setID("moonjava");
login.setPassword("123456");
HandleLogin handleLogin = new HandleLogin();
login = handleLogin.queryVerify(login);
if(login.getLoginSuccess()==true) {
System.out.println("登录成功了!");
}
}
}

用MySQL客户端管理工具就可以看到register表里有了一条记录:


文章转载自凯哥的故事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论