圖書管理系統(Java + MySQL)
阿新 • • 發佈:2019-01-13
(完整程式碼+實訓報告):
https://download.csdn.net/download/qq_35793285/10896342
(完整程式碼):
https://pan.baidu.com/s/1B0kV-_nCQ4MkRmPclqaK7A 提取碼: fr2e
一,功能
- 管理員登入
- 圖書借閱資訊管理
- 圖書資訊管理
- 管理員更改密碼
- 退出系統
二,工具
- Eclipse Version: 2018-09 (4.9.0)
- MySQL Workbench 8.0 CE
- mysql-connector-java-8.0.13.jar
三、效果圖:
登入介面:
主介面:
借閱書籍管理:
個人書庫管理:
更改密碼:
四、資料庫設計
1)圖書表
2)使用者表
兩個資料表間沒有關聯:
五、JAVA層次分析
(1)邏輯圖
(2)包結構,採用MVC三層架構組織各個模組
六、主要Java程式碼分析
Dao類(以BookDao為例)
package pers.cyz.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import pers.cyz.model.Book; import pers.cyz.util.DBUtil; /** * 資料庫圖書表資訊資料訪問物件類,包含增加圖書資訊、刪除圖書資訊 * 、更新圖書資訊、查詢圖書資訊、查詢借閱資訊和歸還圖書 * * @author 1651200111 陳彥志 */ public class BookDao { /** * 增加圖書資訊 */ public void addBook(Book book) throws Exception{ // 首先拿到資料庫的連線 Connection con = DBUtil.getConnection(); String sql="insert into tb_books" // ISBN、書名、圖書價格、圖書作者、出版社 + "(ISBN, book_name, book_price, book_author, published_house," // 分類號、借書人姓名、借書人電話、借書日期,已借天數 + "book_category, borrower_name, borrower_phone) " + "values(" /* * 引數用?表示,相當於佔位符,然後在對引數進行賦值。當真正執行時, * 這些引數會載入在SQL語句中,把SQL語句拼接完整才去執行。這樣就會減少對資料庫的操作 */ + "?,?,?,?,?,?,?,?)"; /* * prepareStatement這個方法會將SQL語句載入到驅動程式conn整合程式中, * 但是並不直接執行,而是當它呼叫execute()方法的時候才真正執行; */ PreparedStatement psmt = con.prepareStatement(sql); // 先對應SQL語句,給SQL語句傳遞引數 psmt.setString(1, book.getISBN()); psmt.setString(2, book.getBookName()); psmt.setFloat(3, book.getPrice()); psmt.setString(4, book.getAuthor()); psmt.setString(5, book.getPublishHouse()); psmt.setString(6, book.getBookCategory()); if (book.getBorrowerName() == null || book.getBorrowerName() == "") { psmt.setString(7, null); } else { psmt.setString(7, book.getBorrowerName()); } if (book.getBorrowerPhone() == null || book.getBorrowerPhone() == "") { psmt.setString(8, null); } else { psmt.setString(8, book.getBorrowerPhone()); } //執行SQL語句 psmt.execute(); } /** * 刪除圖書資訊 */ public void delBook(int ID) throws SQLException{ // 首先拿到資料庫的連線 Connection con=DBUtil.getConnection(); String sql="" + "DELETE FROM tb_books "+ // 引數用?表示,相當於佔位符 "WHERE ID = ?"; // 預編譯sql語句 PreparedStatement psmt = con.prepareStatement(sql); // 先對應SQL語句,給SQL語句傳遞引數 psmt.setInt(1, ID); // 執行SQL語句 psmt.execute(); } /** * 更新圖書資訊 */ public void changeBook(Book book) throws SQLException{ // 首先拿到資料庫的連線 Connection con=DBUtil.getConnection(); String sql="update tb_books " + "set ISBN = ?, book_name = ?, book_price = ?, book_author = ?" + ",published_house = ?, book_category = ?, borrower_name = ?, borrower_phone = ? " // 引數用?表示,相當於佔位符 + "where ID = ?"; // 預編譯sql語句 PreparedStatement psmt = con.prepareStatement(sql); // 先對應SQL語句,給SQL語句傳遞引數 psmt.setString(1, book.getISBN()); psmt.setString(2, book.getBookName()); psmt.setFloat(3, book.getPrice()); psmt.setString(4, book.getAuthor()); psmt.setString(5, book.getPublishHouse()); psmt.setString(6, book.getBookCategory()); if (book.getBorrowerName().equals("")) { psmt.setString(7, null); } else { psmt.setString(7, book.getBorrowerName()); } if (book.getBorrowerPhone().equals("")) { psmt.setString(8, null); } else { psmt.setString(8, book.getBorrowerPhone()); } psmt.setInt(9, book.getID()); // 執行SQL語句 psmt.execute(); } /** * 查詢書籍資訊 */ public List<Book> query() throws Exception{ Connection con = DBUtil.getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select " // ISBN、書名、作者、圖書價格、出版社 + "ID, ISBN, book_name, book_author, book_price, published_house, " // 分類號、借書人姓名、借書人電話 + "book_category, borrower_name, borrower_phone " + "from tb_books"); List<Book> bookList = new ArrayList<Book>(); Book book = null; // 如果物件中有資料,就會迴圈打印出來 while (rs.next()){ book = new Book(); book.setID(rs.getInt("ID")); book.setISBN(rs.getString("ISBN")); book.setBookName(rs.getString("book_name")); book.setAuthor(rs.getString("book_author")); book.setPrice(rs.getFloat("book_price")); book.setPublishHouse(rs.getString("published_house")); book.setBookCategory(rs.getString("book_category")); book.setBorrowerName(rs.getString("borrower_name")); book.setBorrowerPhone(rs.getString("borrower_phone")); bookList.add(book); } return bookList; } /** * 查詢借閱資訊 * * @return * bookList */ public List<Book> borrowQuery() throws Exception{ Connection con = DBUtil.getConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("" // ID、書名、借書人姓名、借書人電話 + "SELECT ID, book_name, borrower_name, borrower_phone " + "FROM tb_books " + "WHERE borrower_name IS NOT NULL" ); List<Book> bookList = new ArrayList<Book>(); Book book = null; // 如果物件中有資料,就會迴圈打印出來 while (rs.next()){ book = new Book(); book.setID(rs.getInt("ID")); book.setBookName(rs.getString("book_name")); book.setBorrowerName(rs.getString("borrower_name")); book.setBorrowerPhone(rs.getString("borrower_phone")); bookList.add(book); } return bookList; } /** * 更新圖書資訊,歸還圖書 */ public void returnBook(Book book) throws SQLException{ // 首先拿到資料庫的連線 Connection con=DBUtil.getConnection(); String sql="UPDATE tb_books " // ISBN、圖書名稱、作者、價格 + "SET " // 借書人姓名、借書人電話 + "borrower_name = ?, borrower_phone = ? " // 引數用?表示,相當於佔位符 + "WHERE ID = ?"; // 預編譯sql語句 PreparedStatement psmt = con.prepareStatement(sql); // 先對應SQL語句,給SQL語句傳遞引數 psmt.setString(1, book.getBorrowerName()); psmt.setString(2, book.getBorrowerPhone()); psmt.setInt(3, book.getID()); // 執行SQL語句 psmt.execute(); } }
重點內容 :
JDBC進行簡單的資料庫增刪改查
詳細參考:https://www.cnblogs.com/Qian123/p/5339164.html#_labelTop
Model類(以Book為例)
package pers.cyz.model; /** * 圖書模型類,包含資料庫圖書表各對應的欄位get、set方法 * * @author 1651200111 陳彥志 */ public class Book { private int ID; // ISBN號 private String ISBN; // 圖書名稱 private String bookName; // 圖書價格 private float price; // 圖書作者 private String author; // 出版社 private String publishedHouse; // 圖書分類號 private String bookCategory; // 借書人姓名 private String borrowerName; // 借書人電話 private String borrowerPhone; /** * 獲取ID */ public int getID() { return ID; } /** * 設定ID */ public void setID(int iD) { ID = iD; } /** * 獲取ISBN */ public String getISBN() { return ISBN; } /** * 設定ISBN */ public void setISBN(String iSBN) { ISBN = iSBN; } /** * 獲取圖書名稱 */ public String getBookName() { return bookName; } /** * 設定圖書名稱 */ public void setBookName(String bookName) { this.bookName = bookName; } /** * 獲取圖書價格 */ public float getPrice() { return price; } /** * 設定圖書價格 */ public void setPrice(float price) { this.price = price; } /** * 獲取圖書作者 */ public String getAuthor() { return author; } /** * 設定圖書作者 */ public void setAuthor(String author) { this.author = author; } /** * 獲取出版社 */ public String getPublishHouse() { return publishedHouse; } /** * 設定出版社 */ public void setPublishHouse(String publishedHouse) { this.publishedHouse = publishedHouse; } /** * 獲取圖書分類資訊 */ public String getBookCategory() { return bookCategory; } /** * 設定圖書分類資訊 */ public void setBookCategory(String bookCategory) { this.bookCategory = bookCategory; } /** * 獲取借書人姓名 */ public String getBorrowerName() { return borrowerName; } /** * 設定借書人姓名 */ public void setBorrowerName(String borrowerName) { this.borrowerName = borrowerName; } /** * 獲取借書人電話 */ public String getBorrowerPhone() { return borrowerPhone; } /** * 設定借書人電話 */ public void setBorrowerPhone(String borrowerPhone) { this.borrowerPhone = borrowerPhone; } }
重點內容 :
主要就是資料庫對應表中各對應的欄位get、set方法
Eclipse技巧:
Shift + alt + s -> Generate Getters and Setters -> Select all -> Generate 自動生成set、get方法
Controller類(以BookAction為例)
package pers.cyz.controller;
import java.util.List;
import javax.swing.JTable;
import javax.swing.JTextField;
import pers.cyz.dao.BookDao;
import pers.cyz.model.Book;
/**
* 圖書資訊行為控制類,包含增加圖書、刪除圖書
* 、 修改圖書、和初始化個人書庫管理窗體表格
*
* @author 1651200111 陳彥志
*/
public class BookAction {
/**
* 初始化窗體表格
* @return
* results
*/
@SuppressWarnings("rawtypes")
public Object[][] initializTable(String[] columnNames) throws Exception{
BookDao bookDao = new BookDao();
List list = bookDao.query();
Object[][] results = new Object[list.size()][columnNames.length];
for(int i = 0; i < list.size(); i++) {
Book book = (Book)list.get(i);
results[i][0] = book.getID();
results[i][1] = book.getBookName();
results[i][2] = book.getAuthor();
results[i][3] = book.getPrice();
results[i][4] = book.getISBN();
results[i][5] = book.getPublishHouse();
results[i][6] = book.getBookCategory();
String borrowerName = book.getBorrowerName();
if (borrowerName == null) {
borrowerName = "";
results[i][7] = borrowerName;
}
else {
results[i][7] = borrowerName;
}
String borrowerPhone = book.getBorrowerPhone();
if (borrowerPhone == null) {
borrowerPhone = "";
results[i][8] = borrowerPhone;
}
else {
results[i][8] = borrowerPhone;
}
}
return results;
}
/**
* 新增圖書資訊
*/
public void addBookInformation (JTextField textFieldISBN, JTextField textFieldName
,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
, JTextField textFieldBookCategory, JTextField textFieldBorrowName
, JTextField textFieldBorrowPhone) throws Exception {
BookDao bookDao=new BookDao();
Book book=new Book();
book.setISBN(textFieldISBN.getText());
book.setBookName(textFieldName.getText());
float price = Float.parseFloat(textFieldPrice.getText());
book.setPrice(price);
book.setAuthor(textFieldAuthor.getText());
book.setPublishHouse(textFieldPublishedHouse.getText());
book.setBookCategory(textFieldBookCategory.getText());
if (textFieldBorrowName.getText() == null ||textFieldBorrowName.getText() == "" ) {
book.setBorrowerName(null);
}
else {
book.setBorrowerName(textFieldBorrowName.getText());
}
if (textFieldBorrowPhone.getText() == null || textFieldBorrowPhone.getText() == "") {
book.setBorrowerPhone(null);
}
else {
book.setBorrowerPhone(textFieldBorrowPhone.getText());
}
//新增圖書
bookDao.addBook(book);
}
/**
* 刪除圖書資訊
*/
public void delBookInformation (JTable table) throws Exception {
int selRow = table.getSelectedRow();
int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
BookDao bookDao=new BookDao();
Book book=new Book();
book.setID(ID);
// 刪除圖書資訊
bookDao.delBook(ID);
}
/**
* 修改圖書資訊
*/
public void changeBookInformation (JTextField textFieldISBN, JTextField textFieldName
,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
, JTextField textFieldBookCategory, JTextField textFieldBorrowerName
, JTextField textFieldBorrowerPhone, JTable table) throws Exception{
BookDao bookDao=new BookDao();
Book book=new Book();
int selRow = table.getSelectedRow();
int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
book.setID(ID);
book.setISBN(textFieldISBN.getText());
book.setBookName(textFieldName.getText());
book.setAuthor(textFieldAuthor.getText());
float price = Float.parseFloat(textFieldPrice.getText());
book.setPrice(price);
book.setPublishHouse(textFieldPublishedHouse.getText());
book.setBookCategory(textFieldBookCategory.getText());
book.setBorrowerName(textFieldBorrowerName.getText());
book.setBorrowerPhone(textFieldBorrowerPhone.getText());
//修改圖書
bookDao.changeBook(book);
}
}
util類(以DBUtil為例)
package pers.cyz.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 連線資料庫類,包含一個對外提供獲取資料庫連線的方法
*
* @author 1651200111 陳彥志
*/
public class DBUtil {
// 資料庫連線路徑
private static final String URL = "jdbc:mysql://127.0.0.1:3306/db_books?"
+ "useUnicode = true & serverTimezone = GMT"
// MySQL在高版本需要指明是否進行SSL連線
+ "& characterEncoding = utf8 & useSSL = false";
private static final String NAME = "root";
private static final String PASSWORD = "root";
private static Connection conn = null;
// 靜態程式碼塊(將載入驅動、連線資料庫放入靜態塊中)
static{
try {
// 載入驅動程式
Class.forName("com.mysql.cj.jdbc.Driver");
// 獲取資料庫的連線
conn = DriverManager.getConnection(URL, NAME, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 對外提供一個方法來獲取資料庫連線
public static Connection getConnection(){
return conn;
}
}
util類(以BackgroundImage為例)
package pers.cyz.util;
import java.awt.Container;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* 設定背景圖片類
*
* @author 1651200111 陳彥志
*/
public class BackgroundImage {
public BackgroundImage(JFrame frame,Container container,String ImageName) {
// 限定載入圖片路徑
ImageIcon icon= new ImageIcon("res/" + ImageName);
final JLabel labelBackground = new JLabel();
ImageIcon iconBookManageSystemBackground = icon;
labelBackground.setIcon(iconBookManageSystemBackground);
// 設定label的大小
labelBackground.setBounds(0,0,iconBookManageSystemBackground.getIconWidth()
,iconBookManageSystemBackground.getIconHeight());
// 將背景圖片標籤放入桌面面板的最底層
frame.getLayeredPane().add(labelBackground,new Integer(Integer.MIN_VALUE));
// 將容器轉換為面板設定為透明
JPanel panel = (JPanel)container;
panel.setOpaque(false);
}
}
重點內容 :
將圖片標籤放在窗體底層面板,然後將窗體轉化為容器,將容器面板設為透明,背景圖片就設定好了,之後就可以直接在該容器中新增元件
- 將所有兩個或兩個以上類需要用到的程式碼段全部封裝到了公共類。
- 整體按照MVC三層架構組織
參考文章:https://www.cnblogs.com/Qian123/p/5339164.html#_labelTop