日常回顧上一章內容(有需要可以回去看看)
學習做學生管理系統——java swing+Mysql 第二章(登錄功能)
這一章將會對註冊功能進行重點講解,在講解的同時,優化原先的代碼。
在講解實現功能時,我要先說明一下,我的註冊功能是基於什麼思路來進行註冊的。
1.我的註冊是有條件的註冊,不是隨便註冊,根據工號來註冊賬號
2.每個工號限制帳號數量
3.禁止重複帳號和重複使用工號
如下圖,我特地建了新表access,用於存放工號信息和工號擁有的帳號數量,註冊將會先根據工號搜索access表,在根據帳號搜索賬號表,當條件都符合的時候,註冊功能纔開始進行。(當然如果自己有其他的需要可以根據我後續給出的代碼進行相應的修改)
爲了代碼的簡潔,我在工程下面新建了兩個類,main.java是前兩章內容,這次的註冊功能是額外建的register類,爲了方便我把數據庫連接用的帳號密碼那些信息放到Mysql類
把數據庫用的帳號密碼這些信息放到一個新的類,就不用再後續寫各種功能的時候重新定義,可以直接調用
Mysql.java的內容
public class Mysql {
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/StudentManage?useSSL=false&serverTimezone=UTC";
static final String USER = "root";
static final String PASS = "123";
}
現在開始說明register.java的內容,也是本章要說的重點
先上圖看最終成果
在建好的class類文件後,定義註冊功能要用的窗口,添加上你所需要的一切信息,標籤,輸入框,按鈕等東西(不記得怎麼添加組件的記得回看第一章,或者百度),這裏直接上代碼
public class register {
public void reg() {
JFrame jf=new JFrame("註冊");
jf.setSize(350, 250);
JPanel jp=new JPanel();
jf.add(jp);
jp.setLayout(null);
JLabel acc=new JLabel("帳號");
JLabel pass=new JLabel("密碼");
JLabel id=new JLabel("工號");
jp.add(pass);
jp.add(id);
jp.add(acc);
acc.setBounds(40, 20, 80, 25);
pass.setBounds(40, 60, 80, 25);
id.setBounds(40, 100, 80, 25);
JTextField text1=new JTextField();//帳號輸入
JPasswordField text2=new JPasswordField();//密碼輸入
JTextField text3=new JTextField();//工號輸入
text1.setBounds(80, 20, 165, 25);
text2.setBounds(80, 60, 165, 25);
text3.setBounds(80, 100, 165, 25);
jp.add(text1);
jp.add(text2);
jp.add(text3);
JButton regButton=new JButton("註冊");//註冊按鈕
regButton.setBounds(125, 150, 80, 20);
jp.add(regButton);
jf.setVisible(true);
Mysql sql=new Mysql();//爲後續調用數據庫信息
}
}
這時候就已經畫好程序框圖了,接下來就是添加實用功能。
還是同樣的步驟,給按鈕編寫觸發
regButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
爲了實現上述功能,需要對三個輸入框進行數據的讀取
String s1=text1.getText().toString();//賬號獲取
String s2=new String(text2.getPassword());//密碼獲取
String s3=text3.getText().toString();//工號獲取
由於我個人爲了實現帳號註冊的要求,所以我就編寫了4個狀態和一個控制量
PreparedStatement stmt1=null;
PreparedStatement stmt2=null;
PreparedStatement stmt3=null;
PreparedStatement stmt4=null;
int i;//註冊限制
連接數據庫並且實現註冊功能(註釋在代碼裏面)
try {
Class.forName(sql.JDBC_DRIVER);//sql.都是直接調用原先寫的mysql.java
c = DriverManager.getConnection(sql.DB_URL,sql.USER,sql.PASS);
if(s1.length()==0||s2.length()==0||s3.length()==0) {
JOptionPane.showMessageDialog(null, "還有信息未填", "錯誤", ERROR_MESSAGE);//判斷是否信息填寫完整
}
else if(s1.length()!=0&&s2.length()!=0&&s3.length()!=0) {
//當信息填寫完整時
String sql1="SELECT * FROM access where id=?";
stmt1=c.prepareStatement(sql1);
stmt1.setString(1, s3);
ResultSet rs1 = stmt1.executeQuery();
if(rs1.next()) {//判斷工號是否正確
i=rs1.getInt("acc_num");//讀取工號是否有帳號
if(i==0) {//沒有就進行註冊
String sql2="SELECT * FROM account where user=?";
stmt2=c.prepareStatement(sql2);
stmt2.setString(1, s1);
ResultSet rs2 = stmt2.executeQuery();
if(!rs2.next()) {//判斷帳號是否已經註冊過
JOptionPane.showMessageDialog(null, "註冊成功");
String sql3="INSERT INTO account (user,password,id) VALUES (?,?,?)";
stmt3=c.prepareStatement(sql3);
stmt3.setString(1, s1);
stmt3.setString(2, s2);
stmt3.setString(3, s3);
stmt3.executeUpdate();
String sql4="UPDATE access SET acc_num=? WHERE id=?";
stmt4=c.prepareStatement(sql4);
stmt4.setString(1, "1");
stmt4.setString(2, s3);
stmt4.executeUpdate();
}
else {//帳號已經存在,跳轉提醒
JOptionPane.showMessageDialog(null, "賬號已經存在", "錯誤", ERROR_MESSAGE);
}
}
else {//工號已經註冊過帳號,跳轉提醒
JOptionPane.showMessageDialog(null, "工號已經被使用", "錯誤", ERROR_MESSAGE);
}
}
else {//輸入工號錯誤,跳轉提醒
JOptionPane.showMessageDialog(null, "工號有誤", "錯誤", ERROR_MESSAGE);
}
}
}catch(Exception e1) {
System.err.println( e1.getClass().getName() + ": " + e1.getMessage() );
System.exit(0);
}
把這些整合起來,最後的完整版本
public class register {
public void reg() {
JFrame jf=new JFrame("註冊");
jf.setSize(350, 250);
JPanel jp=new JPanel();
jf.add(jp);
jp.setLayout(null);
JLabel acc=new JLabel("帳號");
JLabel pass=new JLabel("密碼");
JLabel id=new JLabel("工號");
jp.add(pass);
jp.add(id);
jp.add(acc);
acc.setBounds(40, 20, 80, 25);
pass.setBounds(40, 60, 80, 25);
id.setBounds(40, 100, 80, 25);
JTextField text1=new JTextField();//帳號輸入
JPasswordField text2=new JPasswordField();//密碼輸入
JTextField text3=new JTextField();//工號輸入
text1.setBounds(80, 20, 165, 25);
text2.setBounds(80, 60, 165, 25);
text3.setBounds(80, 100, 165, 25);
jp.add(text1);
jp.add(text2);
jp.add(text3);
JButton regButton=new JButton("註冊");//註冊按鈕
regButton.setBounds(125, 150, 80, 20);
jp.add(regButton);
jf.setVisible(true);
Mysql sql=new Mysql();
regButton.addActionListener(new ActionListener() {
private int ERROR_MESSAGE;
public void actionPerformed(ActionEvent e) {
String s1=text1.getText().toString();//賬號獲取
String s2=new String(text2.getPassword());//密碼獲取
String s3=text3.getText().toString();//工號獲取
Connection c=null;
PreparedStatement stmt1=null;
PreparedStatement stmt2=null;
PreparedStatement stmt3=null;
PreparedStatement stmt4=null;
int i;//註冊限制
try {
Class.forName(sql.JDBC_DRIVER);
c = DriverManager.getConnection(sql.DB_URL,sql.USER,sql.PASS);
if(s1.length()==0||s2.length()==0||s3.length()==0) {
JOptionPane.showMessageDialog(null, "還有信息未填", "錯誤", ERROR_MESSAGE);
}
else if(s1.length()!=0&&s2.length()!=0&&s3.length()!=0) {
String sql1="SELECT * FROM access where id=?";
stmt1=c.prepareStatement(sql1);
stmt1.setString(1, s3);
ResultSet rs1 = stmt1.executeQuery();
if(rs1.next()) {
i=rs1.getInt("acc_num");
if(i==0) {
String sql2="SELECT * FROM account where user=?";
stmt2=c.prepareStatement(sql2);
stmt2.setString(1, s1);
ResultSet rs2 = stmt2.executeQuery();
if(!rs2.next()) {
JOptionPane.showMessageDialog(null, "註冊成功");
String sql3="INSERT INTO account (user,password,id) VALUES (?,?,?)";
stmt3=c.prepareStatement(sql3);
stmt3.setString(1, s1);
stmt3.setString(2, s2);
stmt3.setString(3, s3);
stmt3.executeUpdate();
String sql4="UPDATE access SET acc_num=? WHERE id=?";
stmt4=c.prepareStatement(sql4);
stmt4.setString(1, "1");
stmt4.setString(2, s3);
stmt4.executeUpdate();
}
else {
JOptionPane.showMessageDialog(null, "賬號已經存在", "錯誤", ERROR_MESSAGE);
}
}
else {
JOptionPane.showMessageDialog(null, "工號已經被使用", "錯誤", ERROR_MESSAGE);
}
}
else {
JOptionPane.showMessageDialog(null, "工號有誤", "錯誤", ERROR_MESSAGE);
}
}
}catch(Exception e1) {
System.err.println( e1.getClass().getName() + ": " + e1.getMessage() );
System.exit(0);
}
}
});
}
}
接着就是返回到main.java,也就是登錄界面的class類,繼續在原有的基礎上,編寫註冊按鈕的觸發,直接調用register.java的功能就完成了。
調用範例
regButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
register re=new register();
re.reg();
}
});
這樣一個登錄界面就算大工搞成了,下一次就是製作管理界面了。