图书管理系统(Java MySQL)

一,功能

  1. 管理员登录
  2. 图书借阅信息管理
  3. 图书信息管理
  4. 管理员更改密码
  5. 退出系统

二,工具

  • 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为例)


 
 
  1. package pers.cyz.dao;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.sql.Statement;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import pers.cyz.model.Book;
  10. import pers.cyz.util.DBUtil;
  11. /**
  12. * 数据库图书表信息数据访问对象类,包含增加图书信息、删除图书信息
  13. * 、更新图书信息、查询图书信息、查询借阅信息和归还图书
  14. *
  15. * @author 1651200111 陈彦志
  16. */
  17. public class BookDao {
  18. /**
  19. * 增加图书信息
  20. */
  21. public void addBook(Book book) throws Exception{
  22. // 首先拿到数据库的连接
  23. Connection con = DBUtil.getConnection();
  24. String sql= "insert into tb_books"
  25. // ISBN、书名、图书价格、图书作者、出版社
  26. + "(ISBN, book_name, book_price, book_author, published_house,"
  27. // 分类号、借书人姓名、借书人电话、借书日期,已借天数
  28. + "book_category, borrower_name, borrower_phone) "
  29. + "values("
  30. /*
  31. * 参数用?表示,相当于占位符,然后在对参数进行赋值。当真正执行时,
  32. * 这些参数会加载在SQL语句中,把SQL语句拼接完整才去执行。这样就会减少对数据库的操作
  33. */
  34. + "?,?,?,?,?,?,?,?)";
  35. /*
  36. * prepareStatement这个方法会将SQL语句加载到驱动程序conn集成程序中,
  37. * 但是并不直接执行,而是当它调用execute()方法的时候才真正执行;
  38. */
  39. PreparedStatement psmt = con.prepareStatement(sql);
  40. // 先对应SQL语句,给SQL语句传递参数
  41. psmt.setString( 1, book.getISBN());
  42. psmt.setString( 2, book.getBookName());
  43. psmt.setFloat( 3, book.getPrice());
  44. psmt.setString( 4, book.getAuthor());
  45. psmt.setString( 5, book.getPublishHouse());
  46. psmt.setString( 6, book.getBookCategory());
  47. if (book.getBorrowerName() == null || book.getBorrowerName() == "") {
  48. psmt.setString( 7, null);
  49. }
  50. else {
  51. psmt.setString( 7, book.getBorrowerName());
  52. }
  53. if (book.getBorrowerPhone() == null || book.getBorrowerPhone() == "") {
  54. psmt.setString( 8, null);
  55. }
  56. else {
  57. psmt.setString( 8, book.getBorrowerPhone());
  58. }
  59. //执行SQL语句
  60. psmt.execute();
  61. }
  62. /**
  63. * 删除图书信息
  64. */
  65. public void delBook(int ID) throws SQLException{
  66. // 首先拿到数据库的连接
  67. Connection con=DBUtil.getConnection();
  68. String sql= "" +
  69. "DELETE FROM tb_books "+
  70. // 参数用?表示,相当于占位符
  71. "WHERE ID = ?";
  72. // 预编译sql语句
  73. PreparedStatement psmt = con.prepareStatement(sql);
  74. // 先对应SQL语句,给SQL语句传递参数
  75. psmt.setInt( 1, ID);
  76. // 执行SQL语句
  77. psmt.execute();
  78. }
  79. /**
  80. * 更新图书信息
  81. */
  82. public void changeBook(Book book) throws SQLException{
  83. // 首先拿到数据库的连接
  84. Connection con=DBUtil.getConnection();
  85. String sql= "update tb_books "
  86. + "set ISBN = ?, book_name = ?, book_price = ?, book_author = ?"
  87. + ",published_house = ?, book_category = ?, borrower_name = ?, borrower_phone = ? "
  88. // 参数用?表示,相当于占位符
  89. + "where ID = ?";
  90. // 预编译sql语句
  91. PreparedStatement psmt = con.prepareStatement(sql);
  92. // 先对应SQL语句,给SQL语句传递参数
  93. psmt.setString( 1, book.getISBN());
  94. psmt.setString( 2, book.getBookName());
  95. psmt.setFloat( 3, book.getPrice());
  96. psmt.setString( 4, book.getAuthor());
  97. psmt.setString( 5, book.getPublishHouse());
  98. psmt.setString( 6, book.getBookCategory());
  99. if (book.getBorrowerName().equals( "")) {
  100. psmt.setString( 7, null);
  101. }
  102. else {
  103. psmt.setString( 7, book.getBorrowerName());
  104. }
  105. if (book.getBorrowerPhone().equals( "")) {
  106. psmt.setString( 8, null);
  107. }
  108. else {
  109. psmt.setString( 8, book.getBorrowerPhone());
  110. }
  111. psmt.setInt( 9, book.getID());
  112. // 执行SQL语句
  113. psmt.execute();
  114. }
  115. /**
  116. * 查询书籍信息
  117. */
  118. public List<Book> query() throws Exception{
  119. Connection con = DBUtil.getConnection();
  120. Statement stmt = con.createStatement();
  121. ResultSet rs = stmt.executeQuery( "select "
  122. // ISBN、书名、作者、图书价格、出版社
  123. + "ID, ISBN, book_name, book_author, book_price, published_house, "
  124. // 分类号、借书人姓名、借书人电话
  125. + "book_category, borrower_name, borrower_phone "
  126. + "from tb_books");
  127. List<Book> bookList = new ArrayList<Book>();
  128. Book book = null;
  129. // 如果对象中有数据,就会循环打印出来
  130. while (rs.next()){
  131. book = new Book();
  132. book.setID(rs.getInt( "ID"));
  133. book.setISBN(rs.getString( "ISBN"));
  134. book.setBookName(rs.getString( "book_name"));
  135. book.setAuthor(rs.getString( "book_author"));
  136. book.setPrice(rs.getFloat( "book_price"));
  137. book.setPublishHouse(rs.getString( "published_house"));
  138. book.setBookCategory(rs.getString( "book_category"));
  139. book.setBorrowerName(rs.getString( "borrower_name"));
  140. book.setBorrowerPhone(rs.getString( "borrower_phone"));
  141. bookList.add(book);
  142. }
  143. return bookList;
  144. }
  145. /**
  146. * 查询借阅信息
  147. *
  148. * @return
  149. * bookList
  150. */
  151. public List<Book> borrowQuery() throws Exception{
  152. Connection con = DBUtil.getConnection();
  153. Statement stmt = con.createStatement();
  154. ResultSet rs = stmt.executeQuery( ""
  155. // ID、书名、借书人姓名、借书人电话
  156. + "SELECT ID, book_name, borrower_name, borrower_phone "
  157. + "FROM tb_books "
  158. + "WHERE borrower_name IS NOT NULL"
  159. );
  160. List<Book> bookList = new ArrayList<Book>();
  161. Book book = null;
  162. // 如果对象中有数据,就会循环打印出来
  163. while (rs.next()){
  164. book = new Book();
  165. book.setID(rs.getInt( "ID"));
  166. book.setBookName(rs.getString( "book_name"));
  167. book.setBorrowerName(rs.getString( "borrower_name"));
  168. book.setBorrowerPhone(rs.getString( "borrower_phone"));
  169. bookList.add(book);
  170. }
  171. return bookList;
  172. }
  173. /**
  174. * 更新图书信息,归还图书
  175. */
  176. public void returnBook(Book book) throws SQLException{
  177. // 首先拿到数据库的连接
  178. Connection con=DBUtil.getConnection();
  179. String sql= "UPDATE tb_books "
  180. // ISBN、图书名称、作者、价格
  181. + "SET "
  182. // 借书人姓名、借书人电话
  183. + "borrower_name = ?, borrower_phone = ? "
  184. // 参数用?表示,相当于占位符
  185. + "WHERE ID = ?";
  186. // 预编译sql语句
  187. PreparedStatement psmt = con.prepareStatement(sql);
  188. // 先对应SQL语句,给SQL语句传递参数
  189. psmt.setString( 1, book.getBorrowerName());
  190. psmt.setString( 2, book.getBorrowerPhone());
  191. psmt.setInt( 3, book.getID());
  192. // 执行SQL语句
  193. psmt.execute();
  194. }
  195. }

重点内容 :

JDBC进行简单的数据库增删改查

详细参考:https://www.cnblogs.com/Qian123/p/5339164.html#_labelTop

 

Model类(以Book为例)


 
 
  1. package pers.cyz.model;
  2. /**
  3. * 图书模型类,包含数据库图书表各对应的字段get、set方法
  4. *
  5. * @author 1651200111 陈彦志
  6. */
  7. public class Book {
  8. private int ID;
  9. // ISBN号
  10. private String ISBN;
  11. // 图书名称
  12. private String bookName;
  13. // 图书价格
  14. private float price;
  15. // 图书作者
  16. private String author;
  17. // 出版社
  18. private String publishedHouse;
  19. // 图书分类号
  20. private String bookCategory;
  21. // 借书人姓名
  22. private String borrowerName;
  23. // 借书人电话
  24. private String borrowerPhone;
  25. /**
  26. * 获取ID
  27. */
  28. public int getID() {
  29. return ID;
  30. }
  31. /**
  32. * 设置ID
  33. */
  34. public void setID(int iD) {
  35. ID = iD;
  36. }
  37. /**
  38. * 获取ISBN
  39. */
  40. public String getISBN() {
  41. return ISBN;
  42. }
  43. /**
  44. * 设置ISBN
  45. */
  46. public void setISBN(String iSBN) {
  47. ISBN = iSBN;
  48. }
  49. /**
  50. * 获取图书名称
  51. */
  52. public String getBookName() {
  53. return bookName;
  54. }
  55. /**
  56. * 设置图书名称
  57. */
  58. public void setBookName(String bookName) {
  59. this.bookName = bookName;
  60. }
  61. /**
  62. * 获取图书价格
  63. */
  64. public float getPrice() {
  65. return price;
  66. }
  67. /**
  68. * 设置图书价格
  69. */
  70. public void setPrice(float price) {
  71. this.price = price;
  72. }
  73. /**
  74. * 获取图书作者
  75. */
  76. public String getAuthor() {
  77. return author;
  78. }
  79. /**
  80. * 设置图书作者
  81. */
  82. public void setAuthor(String author) {
  83. this.author = author;
  84. }
  85. /**
  86. * 获取出版社
  87. */
  88. public String getPublishHouse() {
  89. return publishedHouse;
  90. }
  91. /**
  92. * 设置出版社
  93. */
  94. public void setPublishHouse(String publishedHouse) {
  95. this.publishedHouse = publishedHouse;
  96. }
  97. /**
  98. * 获取图书分类信息
  99. */
  100. public String getBookCategory() {
  101. return bookCategory;
  102. }
  103. /**
  104. * 设置图书分类信息
  105. */
  106. public void setBookCategory(String bookCategory) {
  107. this.bookCategory = bookCategory;
  108. }
  109. /**
  110. * 获取借书人姓名
  111. */
  112. public String getBorrowerName() {
  113. return borrowerName;
  114. }
  115. /**
  116. * 设置借书人姓名
  117. */
  118. public void setBorrowerName(String borrowerName) {
  119. this.borrowerName = borrowerName;
  120. }
  121. /**
  122. * 获取借书人电话
  123. */
  124. public String getBorrowerPhone() {
  125. return borrowerPhone;
  126. }
  127. /**
  128. * 设置借书人电话
  129. */
  130. public void setBorrowerPhone(String borrowerPhone) {
  131. this.borrowerPhone = borrowerPhone;
  132. }
  133. }

重点内容 :

主要就是数据库对应表中各对应的字段get、set方法

    Eclipse技巧:

        Shift + alt + s  -> Generate Getters and Setters -> Select all -> Generate 自动生成set、get方法

 

Controller类(以BookAction为例)


 
 
  1. package pers.cyz.controller;
  2. import java.util.List;
  3. import javax.swing.JTable;
  4. import javax.swing.JTextField;
  5. import pers.cyz.dao.BookDao;
  6. import pers.cyz.model.Book;
  7. /**
  8. * 图书信息行为控制类,包含增加图书、删除图书
  9. * 、 修改图书、和初始化个人书库管理窗体表格
  10. *
  11. * @author 1651200111 陈彦志
  12. */
  13. public class BookAction {
  14. /**
  15. * 初始化窗体表格
  16. * @return
  17. * results
  18. */
  19. @SuppressWarnings("rawtypes")
  20. public Object[][] initializTable(String[] columnNames) throws Exception{
  21. BookDao bookDao = new BookDao();
  22. List list = bookDao.query();
  23. Object[][] results = new Object[list.size()][columnNames.length];
  24. for( int i = 0; i < list.size(); i++) {
  25. Book book = (Book)list.get(i);
  26. results[i][ 0] = book.getID();
  27. results[i][ 1] = book.getBookName();
  28. results[i][ 2] = book.getAuthor();
  29. results[i][ 3] = book.getPrice();
  30. results[i][ 4] = book.getISBN();
  31. results[i][ 5] = book.getPublishHouse();
  32. results[i][ 6] = book.getBookCategory();
  33. String borrowerName = book.getBorrowerName();
  34. if (borrowerName == null) {
  35. borrowerName = "";
  36. results[i][ 7] = borrowerName;
  37. }
  38. else {
  39. results[i][ 7] = borrowerName;
  40. }
  41. String borrowerPhone = book.getBorrowerPhone();
  42. if (borrowerPhone == null) {
  43. borrowerPhone = "";
  44. results[i][ 8] = borrowerPhone;
  45. }
  46. else {
  47. results[i][ 8] = borrowerPhone;
  48. }
  49. }
  50. return results;
  51. }
  52. /**
  53. * 添加图书信息
  54. */
  55. public void addBookInformation (JTextField textFieldISBN, JTextField textFieldName
  56. ,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
  57. , JTextField textFieldBookCategory, JTextField textFieldBorrowName
  58. , JTextField textFieldBorrowPhone) throws Exception {
  59. BookDao bookDao= new BookDao();
  60. Book book= new Book();
  61. book.setISBN(textFieldISBN.getText());
  62. book.setBookName(textFieldName.getText());
  63. float price = Float.parseFloat(textFieldPrice.getText());
  64. book.setPrice(price);
  65. book.setAuthor(textFieldAuthor.getText());
  66. book.setPublishHouse(textFieldPublishedHouse.getText());
  67. book.setBookCategory(textFieldBookCategory.getText());
  68. if (textFieldBorrowName.getText() == null ||textFieldBorrowName.getText() == "" ) {
  69. book.setBorrowerName( null);
  70. }
  71. else {
  72. book.setBorrowerName(textFieldBorrowName.getText());
  73. }
  74. if (textFieldBorrowPhone.getText() == null || textFieldBorrowPhone.getText() == "") {
  75. book.setBorrowerPhone( null);
  76. }
  77. else {
  78. book.setBorrowerPhone(textFieldBorrowPhone.getText());
  79. }
  80. //添加图书
  81. bookDao.addBook(book);
  82. }
  83. /**
  84. * 删除图书信息
  85. */
  86. public void delBookInformation (JTable table) throws Exception {
  87. int selRow = table.getSelectedRow();
  88. int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
  89. BookDao bookDao= new BookDao();
  90. Book book= new Book();
  91. book.setID(ID);
  92. // 删除图书信息
  93. bookDao.delBook(ID);
  94. }
  95. /**
  96. * 修改图书信息
  97. */
  98. public void changeBookInformation (JTextField textFieldISBN, JTextField textFieldName
  99. ,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
  100. , JTextField textFieldBookCategory, JTextField textFieldBorrowerName
  101. , JTextField textFieldBorrowerPhone, JTable table) throws Exception{
  102. BookDao bookDao= new BookDao();
  103. Book book= new Book();
  104. int selRow = table.getSelectedRow();
  105. int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
  106. book.setID(ID);
  107. book.setISBN(textFieldISBN.getText());
  108. book.setBookName(textFieldName.getText());
  109. book.setAuthor(textFieldAuthor.getText());
  110. float price = Float.parseFloat(textFieldPrice.getText());
  111. book.setPrice(price);
  112. book.setPublishHouse(textFieldPublishedHouse.getText());
  113. book.setBookCategory(textFieldBookCategory.getText());
  114. book.setBorrowerName(textFieldBorrowerName.getText());
  115. book.setBorrowerPhone(textFieldBorrowerPhone.getText());
  116. //修改图书
  117. bookDao.changeBook(book);
  118. }
  119. }

 

util类(以DBUtil为例)


 
 
  1. package pers.cyz.util;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.SQLException;
  5. /**
  6. * 连接数据库类,包含一个对外提供获取数据库连接的方法
  7. *
  8. * @author 1651200111 陈彦志
  9. */
  10. public class DBUtil {
  11. // 数据库连接路径
  12. private static final String URL = "jdbc:mysql://127.0.0.1:3306/db_books?"
  13. + "useUnicode = true & serverTimezone = GMT"
  14. // MySQL在高版本需要指明是否进行SSL连接
  15. + "& characterEncoding = utf8 & useSSL = false";
  16. private static final String NAME = "root";
  17. private static final String PASSWORD = "root";
  18. private static Connection conn = null;
  19. // 静态代码块(将加载驱动、连接数据库放入静态块中)
  20. static{
  21. try {
  22. // 加载驱动程序
  23. Class.forName( "com.mysql.cj.jdbc.Driver");
  24. // 获取数据库的连接
  25. conn = DriverManager.getConnection(URL, NAME, PASSWORD);
  26. } catch (ClassNotFoundException e) {
  27. e.printStackTrace();
  28. } catch (SQLException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. // 对外提供一个方法来获取数据库连接
  33. public static Connection getConnection(){
  34. return conn;
  35. }
  36. }

util类(以BackgroundImage为例)


 
 
  1. package pers.cyz.util;
  2. import java.awt.Container;
  3. import javax.swing.ImageIcon;
  4. import javax.swing.JFrame;
  5. import javax.swing.JLabel;
  6. import javax.swing.JPanel;
  7. /**
  8. * 设置背景图片类
  9. *
  10. * @author 1651200111 陈彦志
  11. */
  12. public class BackgroundImage {
  13. public BackgroundImage(JFrame frame,Container container,String ImageName) {
  14. // 限定加载图片路径
  15. ImageIcon icon= new ImageIcon( "res/" + ImageName);
  16. final JLabel labelBackground = new JLabel();
  17. ImageIcon iconBookManageSystemBackground = icon;
  18. labelBackground.setIcon(iconBookManageSystemBackground);
  19. // 设置label的大小
  20. labelBackground.setBounds( 0, 0,iconBookManageSystemBackground.getIconWidth()
  21. ,iconBookManageSystemBackground.getIconHeight());
  22. // 将背景图片标签放入桌面面板的最底层
  23. frame.getLayeredPane().add(labelBackground, new Integer(Integer.MIN_VALUE));
  24. // 将容器转换为面板设置为透明
  25. JPanel panel = (JPanel)container;
  26. panel.setOpaque( false);
  27. }
  28. }

 

重点内容 :

    将图片标签放在窗体底层面板,然后将窗体转化为容器,将容器面板设为透明,背景图片就设置好了,之后就可以直接在该容器中添加组件

 


  • 将所有两个或两个以上类需要用到的代码段全部封装到了公共类。
  • 整体按照MVC三层架构组织

 

参考文章:https://www.cnblogs.com/Qian123/p/5339164.html#_labelTop

参考文章:https://blog.csdn.net/acm_hmj/article/details/52830920

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值