今天考慮數據庫的邏輯結構,管理系統的E-R圖如下,學籍變更記錄、獎勵記錄、處分記錄的外鍵是學號,要想插入記錄,學生表中一定要有數據。同時學生表的外鍵時院系代碼,和班級編號,要想插入學生記錄,那么院系和班級表中一定要先有數據。昨天已經解決這個問題了,各表中該加入數據的已經加入了,如下面的文章:
數據庫課設進行時第一天 數據庫和表的建立和基本的增刪查改操作
模式設計就是上面的一些基本表,但在界面視圖上不僅僅要顯示學生表,要以學生的ID建立多個表的連接,顯示其他的信息,例如院系、班級、學籍、獎勵、處分。在數據修改的時候,對基本表進行修改。
昨天只是實現了對學生表的數據庫操作,但是沒有實現對其它表進行數據庫的操作,所以還要接著幾個設計數據庫操作類,這里為了方便先設計一個泛型接口DAO(),然后其他表進行操作的類都實現這個接口就OK了。
public interface DAO<T> {
//增加
public void add(T object);
//修改
public void update(T object);
//刪除
public void delete(int id);
//獲取
public Student get(int id);
//查詢
public List<T> list();
//分頁查詢
public List<T> list(int start ,int count);
}
java泛型(泛型接口、泛型類、泛型方法)
下面實現對處罰情況的輸入:
public void add(Punishment object) {
// TODO Auto-generated method stub
String sql ="insert into punishment Values(null,?,?,?,?,?)";
try(Connection c = getConnection();
PreparedStatement s = c.prepareStatement(sql);) {
s.setString(1, object.studentID);
s.setString(2, object.leves);
s.setString(3, object.rec_time);
s.setString(4, object.enable);
s.setString(5, object.description);
s.execute();
System.out.println("數據庫插入成功!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
對獎勵情況的輸入:
public void add(Reward object) {
// TODO Auto-generated method stub
String sql = "insert into reward Values(null,?,?,?,?)";
try(
Connection c = getConnection();
PreparedStatement s = c.prepareStatement(sql);) {
s.setString(1, object.studentID);
s.setString(2, object.leves);
s.setString(3, object.rec_time);
s.setString(4, object.description);
s.execute();
System.out.println("數據插入成功!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
對學籍更改表進行添加記錄:
public void add(Changement object) {
// TODO Auto-generated method stub
String sql = "insert into change Values(null,?,?,?,?)";
try
( Connection c = getConnection();
PreparedStatement s = c.prepareStatement(sql);
) {
s.setString(1, object.studentID);
s.setString(2, object.change);
s.setString(3, object.rec_time);
s.setString(4, object.description);
s.execute();
System.out.println("數據插入成功!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
運行一個test程序,插入如下:
c.studentID = "1";
c.description = "回家生娃去了";
c.rec_time = "2020-3-4";
c.change = "3";
test.add(c);
結果出現以下錯誤:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'change Values(null,'1','3','2020-3-4','???????”??¨???????')' at line 1
看了半天沒弄清出錯在哪?網上百度,發現是使用了mysql的關鍵字change
所以要改,把表名改為changement就OK了.參考博客:
Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your My
前期過程中的一些小Tips:
date類型怎么插入數據庫
好了,下面就來進行GUI圖形界面的實現:
先復習一下有關GUI的知識,
- GUI中的重角色應該就是容器(container),有兩個,一個是JFrame,另一個是JDialog.容器的作用是可以放置多個組件(按鈕,文本框等等).在放置的時候要注意布局,于是就有了布局器,布局有絕對布局(需要設置大小和位置),網格布局(GridLayout),BorderLayout(上北下南左西右東還有中間一個大的東西),FlowLayout(即流式布局).窗體大小不可變 f.setResizable(false);
- 組件也是GUI的一大部分,有標簽JLabel,按鈕JButton,文本框JTextField,下拉框(JComBox),對話框(JOptionPane),密碼框(JPasswordField)
//下拉框出現的條目
String[] heros = new String[] { "姓名", "ID號" };
JComboBox cb = new JComboBox(heros);
這個地方可以用在按字段進行查詢.
- 根據外部窗體實例化JDialog
JDialog d = new JDialog(f);
// 設置為模態
d.setModal(true);```這個部分可以在輸入記錄的時候起作用.例如點擊添加記錄,就彈出一個JDialog窗體.然后用戶進行輸入即可了.
- 面板:面板和JFrame都是容器,都可以添加組件,在面板中添加組件的好處是,可以對整體的組件進行渲染或者大小或者位置變化.適用于整體的界面的設計
- JPanel 為基本面板,可以添加多個組件,然后把JPanel添加到JFrame即可;ContentPanel為JFrame上的一個面板,向JFrame添加組件其實是往ContentPanel添加組件.splitPanel是水平面板,JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, pLeft, pRight);通過設置分割條的位置,將pleft和pright分隔開.
- 表格:使用JScrollPane可以看見表格的標題
String[] columnNames = new String[] { "id", "name", "hp", "damage" };
String[][] heros = new String[][] { { "1", "蓋倫", "616", "100" },
{ "2", "提莫", "512", "102" }, { "3", "奎因", "832", "200" } };
JTable t = new JTable(heros, columnNames);
// 根據t創建 JScrollPane
JScrollPane sp = new JScrollPane(t);
// 設置列寬度
t.getColumnModel().getColumn(0).setPreferredWidth(10);
整個GUI設計選擇JTabbedPane選項卡面板,一個包含5個面板:
學生個人信息輸入界面
學籍變更情況輸入界面
獎勵情況輸入界面
處罰情況輸入界面
學生個人情況查詢和修改界面
JFrame jf; //整個窗體
JPanel jpstudent; //學生信息面板
JPanel jpchangement; //學籍變更面板
JPanel jpreward; //獎勵面板
JPanel jppunish; //處罰面板
JTabbedPane jtp;//選項卡面板
將各個面板都添加到選項卡面板中:
//將4個面板添加到選項卡面板中.
jtp.add("學生信息模塊",jpstudent);
jtp.add("學籍變更模塊", jpchangement);
jtp.add("獎勵模塊", jpreward);
jtp.add("處罰模塊", jppunish);
jf.setContentPane(jtp);
學生信息表格顯示:
String[] columnnames = {"學號 ","姓名","性別","班級","院系","出生年月","籍貫"};
StudentDAO stu = new StudentDAO();
//通過StudentDAO得到數據庫中所有的student對象.
List<Student> list = stu.list();
//將數據庫中的對象的各屬性值存到二維的字符串數組中.
String[][] items = new String[list.size()][10];
for(int i= 0 ;i<list.size();i++) {
items[i][0] = list.get(i).studentID;
items[i][1] = list.get(i).name;
items[i][2] = list.get(i).sex;
items[i][3] = list.get(i).Class;
items[i][4] = list.get(i).department;
items[i][5] = list.get(i).birthday;
items[i][6] = list.get(i).native_place;
}
//把屬性名和得到的二維數組作為參數傳到表格中,初始化表格.
jtable = new JTable(items,columnnames);
//下面是設置第一列學號的寬度,由于學號很長(10位),所以要設置寬點,不然有的看不到
jtable.getColumnModel().getColumn(0).setPreferredWidth(100);
//將表格放到JScrollPane中,不然看不到屬性名.
JScrollPane jsr = new JScrollPane(jtable);
//添加到學生面板中.
jpstudent.add(jsr);
結果如下.
后文
今天對系統進行了整體的設計,設計接口DAO(Data Access Object數據庫訪問對象 ),然后對要操作的各個表實現接口DAO,為以后表的操作奠定基礎。接著界面的實現的思路也出來了,使用選項卡面板,將各個界面添加到面板中,接下來的工作是對每個界面設置面板、組件。重點在于查詢模塊的實現。