应用举例
注册与登录是软件中经常遇到的模块,本节结合数据库,讲解怎样实现注册与登录。
设计思路
①数据库设计
数据库设计是软件开发中一个非常重要的环节,在清楚了用户的需求之后,就需要进行数据库设计。数据库设计好之后才能进入软件的设计阶段,因此当一个应用问题的需求比较复杂时,数据库的设计(主要是数据库中各个表的设计)就显得尤为重要(要认真学习好数据库原理这门课程)。
②数据模型
程序应当将某些密切相关的数据封装到一个类中,例如,把数据库的表的结构封装到一个类中,即为表建立数据模型。其目的是用面向对象的方法来处理数据。
③数据处理者
程序应尽可能将数据的存储与处理分开,即使用不同的类。数据模型仅仅存储数据,数据处理者根据数据模型和需求处理数据,例如当用户需要注册时,数据处理者将数据模型中的数据写入到数据库的表中。
④视图
程序尽可能提供给用户交互方便的视图,用户可以使用该视图修改模型中的数据,并利用视图提供的交互事件(例如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表里有了一条记录:








