Java - 学生寮管理システム
<スパン 更新:多くの人がデータベースに接続できない、またはデータベーステーブルがないと言っているので、現在、コードを更新し、データベーステーブルファイルと共に、SQLサーバーからMySQLに変更しました。また、GitHubにログインできない学生もいるので、CSDNにリソースを置きました。何か質問があれば、コメントかプライベートメッセージをどうぞ
<スパン (GitHubには以前のコードが残っています)
<スパン 2021-10-20
PS: ログインエラーのほとんどは、MySQLのドライバがないためです。
2021-12-22に更新しました。
生徒の退学と復学の関数では、挿入時にテーブル名がデータベースキーワードで変更されているため、エラーが報告されます。テーブル名を変更するか、以下のように変更して、退学テーブル名を `leave` にするか選択できます。
今回は、最近完成した実習課題である学生寮管理システムのドキュメントで、インターフェースデザインにJava swing、データベースにSQL server、IDEにIDEAを使用したものです
学生寮管理システムのユーザはホストと学生で、ホストが最高権限、学生は一部権限のみとなっています。
I. 寮の建物管理者
a.
情報の必要性。
建物管理者は、上記の建物のすべての関連情報、例えば、ある学籍番号の建物に滞在する学生の詳細、速達の配達と受領のすべての情報、修理報告のすべての情報、夜間帰宅の詳細、学生の退学と帰宅の情報などを確認することができます。これは、寮棟全体の管理を容易にするためです。
b. 処理要件です。
学生寮の管理者は、学生の基本情報に変更があった場合、その都度変更することが可能です。例えば、一部の学生が別の寮に移動した場合、その寮の記録を削除したり、学生が専攻を変更した場合、それに応じて記録を変更する必要があります。
学生寮の電話番号が変更になった場合、建物管理者は証拠に基づいて変更することができます。
寮の建物管理者は、速達郵便が寮に到着したとき、速達郵便の到着に関する情報に基づいて速達郵便情報に記録を挿入し、学生が速達郵便を受け取ったとき、管理者は速達郵便の受領時刻を登録して、手紙が無事に受取人に届いたことを示すようにする。
寮の財産に関する報告が適時に解決された場合、管理者は報告された問題が正常に解決されたことを示す解決時刻を登録する必要があります。
II. この学生寮の建物にいる学生
a. 情報の必要性。
この寮の学生は、自分の寮に関するあらゆる情報を確認できるほか、同じ棟の寮同士の連絡のために、棟内の指定寮の電話番号を確認することができます。自分の特急情報を確認できること。自分の宿泊記録、帰宅記録を確認することができる。
b. 処理要件です。
この学生寮の学生は、この学生寮の財産に損害が発生し、大学から修理のための人を派遣する必要があることを示すレポートを修理情報フォームに挿入することができます。-
生徒が学校を出るときは、「出発・帰宅記録票」に出発時刻を記入し、生徒が学校に戻るときは、「出発・帰宅記録票」に帰宅時刻を記入し、学校に戻ったことを示すことができるようになっています。
以下に従ってテーブルを作成します。
寮生データ辞書。
<テーブル属性名
ストレージコード
タイプ
長さ
備考
学籍番号
スノ
チャー
20
寮生番号
名称
名前
チャー
20
寮生名
性別
性別
イワナ
4
専門分野
セプト
チャー
40
学生の専攻
ドミトリー番号
Dno
チャー
6
学生寮番号
チェックイン時間
シェーキン
日付
8
新入生の入居時期
寮のデータ辞書。
<テーブル属性名
ストレージコード
タイプ
長さ
備考
ドミトリー番号
Dno
チャー
6
寮の電話
Dフォン
チャー
15
寮の物件データ辞書。
<テーブル属性名
ストレージコード
タイプ
長さ
備考
商品番号
Pno
イント
2
ドミトリーの項目番号
項目名
Pname
チャー
20
ドミトリー項目名
Mail Expressのデータ辞書です。
<テーブル属性名
ストレージコード
タイプ
長さ
備考
名称
名前
チャー
20
受信者名
ドミトリー番号
Dno
チャー
6
受信者寮番号
到着時刻
到着
日付
8
メール便到着時間
受信時間
受信
日付
8
受信者受信時刻
メール数
番号
微小数値
2
生徒が受信したメール数
レポート修復データ辞書。
<テーブル属性名
ストレージコード
タイプ
長さ
備考
ドミトリー番号
Dno
焦がす
6
レポーターの寮番号
商品番号
ピーオー
イント
2
報告事項番号
提出日
再送信
年月日
8
レポート修理提出日
解決日
リゾルブ
年月日
8
課題解決日
修理依頼の理由
理由
焦がす
50
破損の理由
レイトリターンデータディクショナリ。
<テーブル属性名
ストレージコード
タイプ
長さ
備考
アカデミックナンバー
スノ
焦がす
20
遅刻者氏名
ドミトリー番号
ドノ
焦がす
6
遅刻者用寮番号
帰国時刻が遅い
Bタイム
タイムスタンプ
14
学生の遅刻時間
返却遅延の理由
Breasonr
シャル
10
学生が遅刻する理由
オフキャンパスのデータディクショナリー。
<テーブル属性名
ストレージコード
タイプ
長さ
備考
学籍番号
スノ
チャー
20
退学者名
ドミトリー番号
Dno
チャー
6
退学者住基番号
退出時間
Ltime
日付
8
生徒の出発時刻
帰着時間
Lリターン
日付
8
生徒の帰宅時間
ユーザーデータ辞書です。
<テーブル属性名
ストレージコード
タイプ
長さ
備考
ユーザーID
名前
チャー
20
ユーザーパスワード
アップアスワード
チャー
20
ユーザータイプ
Uタイプ
ティント
1
一般ユーザーまたはスーパーユーザー
今回は、CardLayoutとTabbedPaneを使ってインターフェース本体を形成し、CardLayoutを使ってログイン画面とアクション画面を切り替えています。(見栄えを良くするのが面倒なので、コントロールの位置は無視してください .........)
正しいユーザー名とパスワードを入力した後、操作画面に切り替える
オペレータインターフェイスは、タブレイアウトを使用して、異なるテーブルを操作します。
インターフェースと操作インターフェースのコード(先ほど書き忘れましたが、実習の課題をこなすだけで、後のメンテナンスのことは考えていないので、私のコードは、機能を完成させるためだけに、コメントをつけて、できるだけ理解してもらい、後でコードを標準化することにしています)。
public class login extends JFrame implements ActionListener {
JLabel user, password;
JTextField username;
JPasswordField passwordField;
JButton loginButton;
CardLayout cardLayout = new CardLayout();
JPanel card;
JPanel cardPanel;
JTabbedPane jTabbedPane;
int type=1;
Users users;
public login() {
init();
}
private void init() {//initialize the interface
setTitle("Dormitory Management System");
setLayout(new BorderLayout());
user = new JLabel("Username");
password = new JLabel("password");
card = new JPanel(cardLayout);
JPanel panel1 = new JPanel(new BorderLayout());
username = new JTextField();
passwordField = new JPasswordField();
loginButton = new JButton("Login");
loginButton.addActionListener(this);
JPanel titlepanel = new JPanel(new FlowLayout());//title panel
JLabel title = new JLabel("Student Dormitory Management System");
titlepanel.add(title);
JPanel loginpanel = new JPanel();//login panel
loginpanel.setLayout(null);
user.setBounds(50, 20, 50, 20);
password.setBounds(50, 60, 50, 20);
username.setBounds(110, 20, 120, 20);
passwordField.setBounds(110, 60, 120, 20);
loginpanel.add(user);
loginpanel.add(password);
loginpanel.add(username);
loginpanel.add(passwordField);
panel1.add(titlepanel, BorderLayout.NORTH);
panel1.add(loginpanel, BorderLayout.CENTER);
panel1.add(loginButton, BorderLayout.SOUTH);
card.add(panel1, "login");
//card.add(cardPanel, "info");
add(card);
setBounds(600, 200, 900, 600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new login();
}
@Override
public void actionPerformed(ActionEvent e) {
boolean flag=false;//used to flag whether the user is correct
if (e.getSource() == loginButton) {
ArrayList<Users> list = new CheckUsers().getUsers();//Get all user information
for (int i = 0; i < list.size(); i++) {//Iterate through all user information to determine if the information entered is correct
users = list.get(i);
String passwordStr = new String(passwordField.getPassword());
if (username.getText().equals(users.getName()) && passwordStr.equals(users.getPassword())) {
if(users.getType()==1){//If student
データベースのデータ表示。データを表示するためにテーブルを使い、見た目がきれいになるようにしました
JTable table = new JTable();
String[] col = { "Number", "Name", "Gender","Major","Dorm Number","Move-in Time" };
DefaultTableModel mm = new DefaultTableModel(col, 0); // Define a template for the table
while (resultSet.next()){// add data from the database to the table
String Sno=resultSet.getString(1);
String Sname=resultSet.getString(2);
String Ssex=resultSet.getString(3);
String Sdept=resultSet.getString(4);
String Dno=resultSet.getString(5);
String Scheckin=resultSet.getString(6);
String[] data={Sno,Sname,Ssex,Sdept,Dno,Scheckin};
mm.addRow(data);
}
SQLサーバー接続
SQLサーバーのダウンロード。とSQLサーバのJDBCを取得する方法、私はここで多くを言わないだろう、オンラインチュートリアルは、多くの、そして難しくないです。
public class GetConnection {
private Connection con=null;
public Connection GetConnection(){
String URL="jdbc:sqlserver://localhost:1433;DatabaseName=students";
String USER="sa";
String KEY="********";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con= DriverManager.getConnection(URL, USER, KEY);
} catch (Exception e) {
// TODO automatically generated catch block
e.printStackTrace();
}
return con;
}
}
コードがたくさんあるので、すべて少し長すぎるを置くので、私はそれらの1つをここに書くだけで、他のは多かれ少なかれ同じですデータベースの追加、削除、およびチェック、私は私のGithubに置くだろうソースコード
学生が寮や専攻を変更した場合、ホストは学生の寮の情報を修正し、データベースに保存することができます。
コード (繰り返しますが、私のコードは単なる宿題です。私のようなコードを書くことはお勧めしません。ごちゃごちゃして理解しにくいだけでなく、メンテナンスも大変です)
public class DormitoryInfo extends JPanel implements ActionListener {
Connection connection = new GetConnection();
Users users;// current users
int type;//user type
String Dno="";//Dorm number
JTable table=new JTable();
String[] col = { "Number", "Name", "Gender","Major","Dorm Number","Move-in Time" }
DefaultTableModel mm = new DefaultTableModel(col, 0); // Define a template for the table
JLabel Sdept,suse,name;
JTextField SdeptText,suseText,nameText;
JButton submit;
JPanel suguan;
public DormitoryInfo(Users users, int type){//Pass back from the login screen, user name and user type
this.type=type;
this.users=users;
setLayout(new FlowLayout());
table.setModel(mm);
table.setRowSorter(new TableRowSorter<>(mm));// sort
JPanel jPanel=new JPanel(new FlowLayout());
JScrollPane js=new JScrollPane(table);
jPanel.add(js);
add(jPanel);
search();
}
private void search(){
PreparedStatement state;
ResultSet resultSet;
if(type==1){//If it is a student, only the student's own dormitory information is displayed
try {
inquire();
String select="select Dno from student where Sname"+"="+"'"+users.getName()+"'";
state=connection.prepareStatement(select);
resultSet=state.executeQuery();
while (resultSet.next()){
Dno=resultSet.getString("Dno");
}
System.out.println(users.getName()+users.getName().length());
select="select*from student where Dno"+"="+"'"+Dno+"'";
state=connection.prepareStatement(select);
resultSet = state.executeQuery();
while (resultSet.next()){
String Ssex=resultSet.getString(3);
String Sdept=resultSet.getString(4);
String Dno=resultSet.getString(5);
String Scheckin=resultSet.getString(6);
String[] data={Sno,Sname,Ssex,Sdept,Dno,Scheckin};
mm.addRow(data);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
private void inquire(){//Students can only query the phone number of any dormitory
suse=new JLabel("dormitory number");
suseText=new JTextField(10);
submit=new JButton("Query");
submit.addActionListener(this);
suguan=new JPanel(new GridLayout(2, 2));
suguan.add(suse); suguan.add(suseText); suguan.add(submit);
add(suguan);
}
private void xiugai(){//residence management to modify the student's dormitory information
Sdept=new JLabel("College");
suse=new JLabel("dormitory number");
SdeptText=new JTextField(10);
suseText=new JTextField(10);
name=new JLabel("name");
nameText=new JTextField(10);
suguan=new JPanel(new GridLayout(4, 2));
submit=new JButton("submit");
submit.addActionListener(this);
suguan.add(name);suguan.add(nameText);
suguan.add(Sdept);suguan.add(SdeptText);
suguan.add(suse); suguan.add(suseText);
add(suguan);
suguan.add(submit);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==submit&&type==2){//If the button clicked is the host
try {
if (suseText.getText().length()>0&&SdeptText.getText().length()==0){//only modify the dorm number
Statement statement = connection.createStatement();
String sql="update student set Dno="+"'"+suseText.getText()+"'"+" where Sname"+"="+& quot;'"+nameText.getText()+"'";
statement.executeUpdate(sql);
PreparedStatement state;
ResultSet resultSet;
state=connection.prepareStatement("select *from student");
resultSet = state.executeQuery();
while(mm.getRowCount()>0){//refresh the table and restart it the next time it is displayed
//System.out.println(model.getRowCount());
mm.removeRow(mm.getRowCount()-1);
}
while (resultSet.next()){//Display the updated data back into the table, the same below
String Sno=resultSet.getString(1);
String Sname=resultSet.getString(2);
String Ssex=resultSet.getString(3);
String Sdept=resultSet.getString(4);
String DDno=resultSet.getString(5);
String Scheckin=resultSet.getString(6);
String[] data={Sno,Sname,Ssex,Sdept,DDno,Scheckin};
mm.addRow(data);
}
}
if(suseText.getText().length()==0&&SdeptText.getText().length()>0){//only modify the department where
Statement statement = connection.createStatement();
String sql="update student set Sdept="+"'"+SdeptText.getText()+"'"+"where Sname"+"=" +"'"+nameText.getText()+"'";
statement.executeUpdate(sql);
PreparedStatement state;
ResultSet resultSet;
state=connection.prepareStatement(&
以下は、考えられるいくつかの問題点、少なくとも私が遭遇した問題点です。
1. データを更新して再度表示すると、前回表示したものが消えず、重なって表示されていることが確認できる
この問題を解決するには、新しいデータを表示するたびに、テーブルからすべてのデータを削除すればよいのです。
while(mm.getRowCount()>0){//Get the number of rows in the current table and delete if it is greater than 0
mm.removeRow(mm.getRowCount()-1);//column names are not deleted
}
2. SQLサーバのchar型とvarchar型は、テーブルの設計当初は、文字はすべてchar型ですが、ログインでは、情報が正しく入力されている場合でも、まだログインできない、と後で学んだcharは固定長で、あなたの文字長が十分ではない場合、それは後にスペースで補完されますので、検証時に情報が正しく見える場合でも、あなたがそれぞれの文字の長さを決定できる限り、後に、それはvarcharを使用してくださいをお勧めします。varcharは可変長なので、文字の長さだけ保存すれば可変長になり、情報を正確に判断することが非常に容易になります。
その他の操作は、上で説明したものと同様で、異なる関数の実装だけで、インターフェースは同じなので、全部は紹介しませんが、必要な方は私のGitHubにアクセスして見てください
関連
-
jd-gui Java Exceptionが発生しました。
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
自動配線された依存性のインジェクションに失敗しました。
-
このラインで複数のマーカーを解決する方法
-
xxx は型に解決できない エラー解決
-
java Exception problem: unhandled exception: java.lang.
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ファインバグタイプ
-
final, finally, finalizeの違いについて話してください。
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
Javaエラーメッセージがenclosingクラスでない
-
java 例外。Javaツールの初期化
-
「リソースリーク:'scanner'が閉じない」警告、Scannerステートメントでの解決法
-
宣言されたパッケージ XX は、期待されるパッケージ src.main.java.XX と一致しません。
-
dao インターフェースがメソッドを定義し、エラーを報告した。 xxx 型のメソッド xxx は未定義である。