详解Java GUI连接Derby数据库,实现注册登录功能
作者:互联网
0x01 功能分析
- 连接Derby数据库
在Java中,要想连接Derby数据库,首先要确保Derby数据库的三个jar文件添加到系统环境变量CLASSPATH中(如果是使用集成IDE开发,则对应不同的IDE要具体配置)。
然后,使用Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
加载驱动,使用DriverManager.getConnection("jdbc:derby:【这里是数据库的路径】")
连接数据库,当然,要先创建好,否则是连接不上的。 - 实现查询数据库功能
使用SQL查询语句在Java中的封装:Connection(与数据库建立的连接)、Statement(SQL语句的抽象)、ResultSet(数据库返回的结果集)。
例如下:Connection conn = DriverManager.getConnection("jdbc:derby:test;create=true");// 连接到test数据库,如果不存在则新建一个 Statement stat = conn.createStatement("SELECT * FROM users");// SQL语句的封装 ResultSet rs = stat.executeQuery();// 返回的结果集合
- 注册页面(布局)
public class RegisterPanel extends JPanel { RegisterPanel() { setLayout(new FlowLayout()); init(); } void init() { var idText = new JTextField(10); var pasText = new JTextField(10); var dateText = new JTextField(10); var registerButton = new JButton("注册"); add(new JLabel("ID:")); add(idText); add(new JLabel("密码:")); add(pasText); add(new JLabel("出生日期(****-**-**):")); add(dateText); add(registerButton); } }
- 登录页面(布局)
public class LoginPanel extends JPanel { LoginPanel() { setLayout(new FlowLayout()); init(); } void init() { var idText = new JTextField(10); var pasText = new JTextField(10); var loginButton = new JButton("登录"); add(new JLabel("ID:")); add(idText); add(new JLabel("密码:")); add(pasText); add(loginButton); } }
0x02 代码实现
DbBridge.java
package Login;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 处理与数据库的通讯
*
* @since 10
* @author TagBug {@link https://github.com/tagbug}
*/
public class DbBridge {
private Connection conn;
private static final String registerQuery = "INSERT INTO users VALUES(?,?,?)";// 预处理
private static final String passwordQuery = "SELECT password FROM users WHERE id=?";// 预处理
/**
* 默认构造方法,建立与数据库的连接
*
* @throws ClassNotFoundException 加载数据库驱动失败
* @throws SQLException 建立连接失败
*/
DbBridge() throws ClassNotFoundException, SQLException {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");// 加载Derby数据库驱动
conn = DriverManager.getConnection("jdbc:derby:test;create=true");// 连接到test数据库,如果不存在则新建一个
}
/**
* 注册,将信息存入数据库
*
* @param id 用户ID
* @param password 用户密码
* @param birthDate 出生日期
* @return 是否成功
*/
public boolean register(String id, String password, String birthDate) throws SQLException {
var preStat = conn.prepareStatement(registerQuery);// 预处理SQL语句
preStat.setString(1, id);
preStat.setString(2, password);
preStat.setString(3, birthDate);
if (preStat.executeUpdate() != 0) {
return true;
}
return false;
}
/**
* 登录,读取与ID对应的密码,检测给出的密码与数据库中的密码是否一致 (在实际运用中一般是将密码做Hash处理,将Hash值作比较,而非直接明文)
*
* @param id 用户ID
* @param password 用户密码
* @return 是否成功
*/
public boolean login(String id, String password) throws SQLException {
var preStat = conn.prepareStatement(passwordQuery);// 预处理SQL语句
preStat.setString(1, id);
try (ResultSet rs = preStat.executeQuery()) {
if (rs.next()) {
if (rs.getString(1).equals(password)) {
return true;
}
}
}
return false;
}
}
LoginPanel.java
package Login;
import java.awt.FlowLayout;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* 登录界面视图
*
* @since 10
* @author TagBug {@link https://github.com/tagbug}
*/
public class LoginPanel extends JPanel {
private DbBridge dbBridge;
LoginPanel(DbBridge dbBridge) {
this.dbBridge = dbBridge;
setLayout(new FlowLayout());
init();
}
void init() {
var idText = new JTextField(10);
var pasText = new JTextField(10);
var loginButton = new JButton("登录");
loginButton.addActionListener(e -> {
try {
if (dbBridge.login(idText.getText(), pasText.getText())) {
JOptionPane.showMessageDialog(this, "登录成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, "登录失败!ID不存在或密码错误!", "错误", JOptionPane.ERROR_MESSAGE);
}
} catch (SQLException e1) {
// 出现其他异常的处理
e1.printStackTrace();
JOptionPane.showMessageDialog(this, "注册失败:" + e1, "错误", JOptionPane.ERROR_MESSAGE);
}
});
add(new JLabel("ID:"));
add(idText);
add(new JLabel("密码:"));
add(pasText);
add(loginButton);
}
}
RegisterPanel.java
package Login;
import java.awt.FlowLayout;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* 注册界面视图
*
* @since 10
* @author TagBug {@link https://github.com/tagbug}
*/
public class RegisterPanel extends JPanel {
private DbBridge dbBridge;
RegisterPanel(DbBridge dbBridge) {
this.dbBridge = dbBridge;
setLayout(new FlowLayout());
init();
}
void init() {
var idText = new JTextField(10);
var pasText = new JTextField(10);
var dateText = new JTextField(10);
var registerButton = new JButton("注册");
registerButton.addActionListener(e -> {
try {
if (dbBridge.register(idText.getText(), pasText.getText(), dateText.getText())) {
JOptionPane.showMessageDialog(this, "注册成功!", "提示", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, "注册失败!ID不能重复!", "错误", JOptionPane.ERROR_MESSAGE);
}
} catch (SQLException e1) {
// 出现其他异常的处理
e1.printStackTrace();
JOptionPane.showMessageDialog(this, "注册失败:" + e1, "错误", JOptionPane.ERROR_MESSAGE);
}
});
add(new JLabel("ID:"));
add(idText);
add(new JLabel("密码:"));
add(pasText);
add(new JLabel("出生日期(****-**-**):"));
add(dateText);
add(registerButton);
}
}
MainFrame.java
package Login;
import java.awt.BorderLayout;
import java.sql.SQLException;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
/**
* 主窗体
*
* @since 10
* @author TagBug {@link https://github.com/tagbug}
*/
public class MainFrame extends JFrame {
private DbBridge dbBridge;
MainFrame() throws ClassNotFoundException, SQLException {
dbBridge = new DbBridge();
setTitle("登录&注册");
setBounds(10, 10, 600, 140);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
init();
setVisible(true);
}
void init() {
var tabPanel = new JTabbedPane();
var loginPanel = new LoginPanel(dbBridge);
var registerPanel = new RegisterPanel(dbBridge);
tabPanel.add("我要注册", registerPanel);
tabPanel.add("我要登陆", loginPanel);
add(tabPanel, BorderLayout.CENTER);
}
public static void main(String[] args) {
try {
new MainFrame();
} catch (ClassNotFoundException e) {
System.out.println("驱动加载失败!" + e);
} catch (SQLException e) {
System.out.println("数据库连接失败!" + e);
}
}
}
标签:10,Java,GUI,Derby,JOptionPane,add,import,var,new 来源: https://blog.csdn.net/sdvddf/article/details/118003471