觉着有用就点个赞哦~
加一 Q 一带一你✅10319281✅邀一情一玛✅33339333✅进【0 9 1 9 1x . c o m】✅已助上千人胜利翻盘, 欢送减少, 沟通交流!
一,性能
- 管理员登录
- 图书借阅信息管理
- 图书信息管理
- 管理员更改明码
- 退出零碎
二,工具
- 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;
3. import java.sql.Connection;
4. import java.sql.PreparedStatement;
5. import java.sql.ResultSet;
6. import java.sql.SQLException;
7. import java.sql.Statement;
8. import java.util.ArrayList;
9. import java.util.List;
11. import pers.cyz.model.Book;
12. import pers.cyz.util.DBUtil;
14. /**
15. * 数据库图书表信息数据拜访对象类,蕴含减少图书信息、删除图书信息
16. *、更新图书信息、查问图书信息、查问借阅信息和偿还图书
17. *
18. * @author 1651200111 陈彦志
19. */
20. public class BookDao {
23. /**
24. * 减少图书信息
25. */
26. public void addBook(Book book) throws Exception{
27. // 首先拿到数据库的连贯
28. Connection con = DBUtil.getConnection();
29. String sql="insert into tb_books"
30. // ISBN、书名、图书价格、图书作者、出版社
31. + "(ISBN, book_name, book_price, book_author, published_house,"
32. // 分类号、借书人姓名、借书人电话、借书日期,已借天数
33. + "book_category, borrower_name, borrower_phone)"
34. + "values("
35. /*
36. * 参数用? 示意,相当于占位符,而后在对参数进行赋值。当真正执行时,37. * 这些参数会加载在 SQL 语句中,把 SQL 语句拼接残缺才去执行。这样就会缩小对数据库的操作
38. */
39. + "?,?,?,?,?,?,?,?)";
40. /*
41. * prepareStatement 这个办法会将 SQL 语句加载到驱动程序 conn 集成程序中,42. * 然而并不间接执行, 而是当它调用 execute() 办法的时候才真正执行;43. */
44. PreparedStatement psmt = con.prepareStatement(sql);
45. // 先对应 SQL 语句,给 SQL 语句传递参数
46. psmt.setString(1, book.getISBN());
47. psmt.setString(2, book.getBookName());
48. psmt.setFloat(3, book.getPrice());
49. psmt.setString(4, book.getAuthor());
50. psmt.setString(5, book.getPublishHouse());
51. psmt.setString(6, book.getBookCategory());
53. if (book.getBorrowerName() == null || book.getBorrowerName() == "") {54. psmt.setString(7, null);
55. }
56. else {57. psmt.setString(7, book.getBorrowerName());
58. }
60. if (book.getBorrowerPhone() == null || book.getBorrowerPhone() == "") {61. psmt.setString(8, null);
62. }
63. else {64. psmt.setString(8, book.getBorrowerPhone());
65. }
67. // 执行 SQL 语句
68. psmt.execute();
70. }
73. /**
74. * 删除图书信息
75. */
76. public void delBook(int ID) throws SQLException{
77. // 首先拿到数据库的连贯
78. Connection con=DBUtil.getConnection();
79. String sql="" +
80. "DELETE FROM tb_books"+
81. // 参数用? 示意,相当于占位符
82. "WHERE ID = ?";
83. // 预编译 sql 语句
84. PreparedStatement psmt = con.prepareStatement(sql);
85. // 先对应 SQL 语句,给 SQL 语句传递参数
86. psmt.setInt(1, ID);
87. // 执行 SQL 语句
88. psmt.execute();
89. }
92. /**
93. * 更新图书信息
94. */
95. public void changeBook(Book book) throws SQLException{
96. // 首先拿到数据库的连贯
97. Connection con=DBUtil.getConnection();
98. String sql="update tb_books"
99. + "set ISBN = ?, book_name = ?, book_price = ?, book_author = ?"
100. + ",published_house = ?, book_category = ?, borrower_name = ?, borrower_phone = ?"
101. // 参数用? 示意,相当于占位符
102. + "where ID = ?";
103. // 预编译 sql 语句
104. PreparedStatement psmt = con.prepareStatement(sql);
105. // 先对应 SQL 语句,给 SQL 语句传递参数
106. psmt.setString(1, book.getISBN());
107. psmt.setString(2, book.getBookName());
108. psmt.setFloat(3, book.getPrice());
109. psmt.setString(4, book.getAuthor());
110. psmt.setString(5, book.getPublishHouse());
111. psmt.setString(6, book.getBookCategory());
112. if (book.getBorrowerName().equals("")) {113. psmt.setString(7, null);
114. }
115. else {116. psmt.setString(7, book.getBorrowerName());
117. }
119. if (book.getBorrowerPhone().equals("")) {120. psmt.setString(8, null);
121. }
122. else {123. psmt.setString(8, book.getBorrowerPhone());
124. }
125. psmt.setInt(9, book.getID());
126. // 执行 SQL 语句
127. psmt.execute();
128. }
132. /**
133. * 查问书籍信息
134. */
135. public List<Book> query() throws Exception{136. Connection con = DBUtil.getConnection();
137. Statement stmt = con.createStatement();
138. ResultSet rs = stmt.executeQuery("select"
139. // ISBN、书名、作者、图书价格、出版社
140. + "ID, ISBN, book_name, book_author, book_price, published_house,"
141. // 分类号、借书人姓名、借书人电话
142. + "book_category, borrower_name, borrower_phone"
143. + "from tb_books");
144. List<Book> bookList = new ArrayList<Book>();
145. Book book = null;
146. // 如果对象中有数据,就会循环打印进去
147. while (rs.next()){148. book = new Book();
149. book.setID(rs.getInt("ID"));
150. book.setISBN(rs.getString("ISBN"));
151. book.setBookName(rs.getString("book_name"));
152. book.setAuthor(rs.getString("book_author"));
153. book.setPrice(rs.getFloat("book_price"));
154. book.setPublishHouse(rs.getString("published_house"));
155. book.setBookCategory(rs.getString("book_category"));
156. book.setBorrowerName(rs.getString("borrower_name"));
157. book.setBorrowerPhone(rs.getString("borrower_phone"));
158. bookList.add(book);
159. }
160. return bookList;
161. }
164. /**
165. * 查问借阅信息
166. *
167. * @return
168. * bookList
169. */
170. public List<Book> borrowQuery() throws Exception{171. Connection con = DBUtil.getConnection();
172. Statement stmt = con.createStatement();
173. ResultSet rs = stmt.executeQuery(""
174. // ID、书名、借书人姓名、借书人电话
175. + "SELECT ID, book_name, borrower_name, borrower_phone"
176. + "FROM tb_books"
177. + "WHERE borrower_name IS NOT NULL"
178. );
179. List<Book> bookList = new ArrayList<Book>();
180. Book book = null;
181. // 如果对象中有数据,就会循环打印进去
182. while (rs.next()){183. book = new Book();
184. book.setID(rs.getInt("ID"));
185. book.setBookName(rs.getString("book_name"));
186. book.setBorrowerName(rs.getString("borrower_name"));
187. book.setBorrowerPhone(rs.getString("borrower_phone"));
188. bookList.add(book);
189. }
190. return bookList;
191. }
193. /**
194. * 更新图书信息,偿还图书
195. */
196. public void returnBook(Book book) throws SQLException{
197. // 首先拿到数据库的连贯
198. Connection con=DBUtil.getConnection();
199. String sql="UPDATE tb_books"
200. // ISBN、图书名称、作者、价格
201. + "SET"
202. // 借书人姓名、借书人电话
203. + "borrower_name = ?, borrower_phone = ?"
204. // 参数用? 示意,相当于占位符
205. + "WHERE ID = ?";
206. // 预编译 sql 语句
207. PreparedStatement psmt = con.prepareStatement(sql);
208. // 先对应 SQL 语句,给 SQL 语句传递参数
209. psmt.setString(1, book.getBorrowerName());
210. psmt.setString(2, book.getBorrowerPhone());
211. psmt.setInt(3, book.getID());
212. // 执行 SQL 语句
213. psmt.execute();
214. }
217. }
重点内容:
JDBC 进行简略的数据库增删改查
具体参考:https://www.cnblogs.com/Qian123/p/5339164.html#_labelTop
Model 类(以 Book 为例)
1. package pers.cyz.model;
3. /**
4. * 图书模型类, 蕴含数据库图书表各对应的字段 get、set 办法
5. *
6. * @author 1651200111 陈彦志
7. */
8. public class Book {
9. private int ID;
10. // ISBN 号
11. private String ISBN;
12. // 图书名称
13. private String bookName;
14. // 图书价格
15. private float price;
16. // 图书作者
17. private String author;
18. // 出版社
19. private String publishedHouse;
20. // 图书分类号
21. private String bookCategory;
22. // 借书人姓名
23. private String borrowerName;
24. // 借书人电话
25. private String borrowerPhone;
27. /**
28. * 获取 ID
29. */
30. public int getID() {
31. return ID;
32. }
33. /**
34. * 设置 ID
35. */
36. public void setID(int iD) {
37. ID = iD;
38. }
40. /**
41. * 获取 ISBN
42. */
43. public String getISBN() {
44. return ISBN;
45. }
46. /**
47. * 设置 ISBN
48. */
49. public void setISBN(String iSBN) {
50. ISBN = iSBN;
51. }
54. /**
55. * 获取图书名称
56. */
57. public String getBookName() {
58. return bookName;
59. }
60. /**
61. * 设置图书名称
62. */
63. public void setBookName(String bookName) {
64. this.bookName = bookName;
65. }
68. /**
69. * 获取图书价格
70. */
71. public float getPrice() {
72. return price;
73. }
74. /**
75. * 设置图书价格
76. */
77. public void setPrice(float price) {
78. this.price = price;
79. }
82. /**
83. * 获取图书作者
84. */
85. public String getAuthor() {
86. return author;
87. }
88. /**
89. * 设置图书作者
90. */
91. public void setAuthor(String author) {
92. this.author = author;
93. }
96. /**
97. * 获取出版社
98. */
99. public String getPublishHouse() {
100. return publishedHouse;
101. }
102. /**
103. * 设置出版社
104. */
105. public void setPublishHouse(String publishedHouse) {
106. this.publishedHouse = publishedHouse;
107. }
110. /**
111. * 获取图书分类信息
112. */
113. public String getBookCategory() {
114. return bookCategory;
115. }
116. /**
117. * 设置图书分类信息
118. */
119. public void setBookCategory(String bookCategory) {
120. this.bookCategory = bookCategory;
121. }
124. /**
125. * 获取借书人姓名
126. */
127. public String getBorrowerName() {
128. return borrowerName;
129. }
130. /**
131. * 设置借书人姓名
132. */
133. public void setBorrowerName(String borrowerName) {
134. this.borrowerName = borrowerName;
135. }
138. /**
139. * 获取借书人电话
140. */
141. public String getBorrowerPhone() {
142. return borrowerPhone;
143. }
144. /**
145. * 设置借书人电话
146. */
147. public void setBorrowerPhone(String borrowerPhone) {
148. this.borrowerPhone = borrowerPhone;
149. }
152. }
重点内容:
次要就是数据库对应表中各对应的字段 get、set 办法
Eclipse 技巧:
Shift + alt + s -> Generate Getters and Setters -> Select all -> Generate 主动生成 set、get 办法
Controller 类(以 BookAction 为例)
1. package pers.cyz.controller;
3. import java.util.List;
5. import javax.swing.JTable;
6. import javax.swing.JTextField;
8. import pers.cyz.dao.BookDao;
9. import pers.cyz.model.Book;
12. /**
13. * 图书信息行为管制类,蕴含减少图书、删除图书
14. *、批改图书、和初始化集体书库治理窗体表格
15. *
16. * @author 1651200111 陈彦志
17. */
18. public class BookAction {
22. /**
23. * 初始化窗体表格
24. * @return
25. * results
26. */
27. @SuppressWarnings("rawtypes")
28. public Object[][] initializTable(String[] columnNames) throws Exception{29. BookDao bookDao = new BookDao();
30. List list = bookDao.query();
31. Object[][] results = new Object[list.size()][columnNames.length];
33. for(int i = 0; i < list.size(); i++) {34. Book book = (Book)list.get(i);
36. results[i][0] = book.getID();
37. results[i][1] = book.getBookName();
38. results[i][2] = book.getAuthor();
39. results[i][3] = book.getPrice();
40. results[i][4] = book.getISBN();
41. results[i][5] = book.getPublishHouse();
42. results[i][6] = book.getBookCategory();
44. String borrowerName = book.getBorrowerName();
45. if (borrowerName == null) {
46. borrowerName = "";
47. results[i][7] = borrowerName;
48. }
49. else {50. results[i][7] = borrowerName;
51. }
53. String borrowerPhone = book.getBorrowerPhone();
54. if (borrowerPhone == null) {
55. borrowerPhone = "";
56. results[i][8] = borrowerPhone;
57. }
58. else {59. results[i][8] = borrowerPhone;
60. }
61. }
62. return results;
63. }
66. /**
67. * 增加图书信息
68. */
69. public void addBookInformation (JTextField textFieldISBN, JTextField textFieldName
70. ,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
71. , JTextField textFieldBookCategory, JTextField textFieldBorrowName
72. , JTextField textFieldBorrowPhone) throws Exception {74. BookDao bookDao=new BookDao();
75. Book book=new Book();
77. book.setISBN(textFieldISBN.getText());
78. book.setBookName(textFieldName.getText());
79. float price = Float.parseFloat(textFieldPrice.getText());
80. book.setPrice(price);
81. book.setAuthor(textFieldAuthor.getText());
82. book.setPublishHouse(textFieldPublishedHouse.getText());
83. book.setBookCategory(textFieldBookCategory.getText());
85. if (textFieldBorrowName.getText() == null ||textFieldBorrowName.getText() == "") {86. book.setBorrowerName(null);
87. }
88. else {89. book.setBorrowerName(textFieldBorrowName.getText());
90. }
92. if (textFieldBorrowPhone.getText() == null || textFieldBorrowPhone.getText() == "") {93. book.setBorrowerPhone(null);
94. }
95. else {96. book.setBorrowerPhone(textFieldBorrowPhone.getText());
97. }
99. // 增加图书
100. bookDao.addBook(book);
101. }
105. /**
106. * 删除图书信息
107. */
108. public void delBookInformation (JTable table) throws Exception {110. int selRow = table.getSelectedRow();
111. int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
113. BookDao bookDao=new BookDao();
114. Book book=new Book();
116. book.setID(ID);
118. // 删除图书信息
119. bookDao.delBook(ID);
120. }
123. /**
124. * 批改图书信息
125. */
126. public void changeBookInformation (JTextField textFieldISBN, JTextField textFieldName
127. ,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
128. , JTextField textFieldBookCategory, JTextField textFieldBorrowerName
129. , JTextField textFieldBorrowerPhone, JTable table) throws Exception{131. BookDao bookDao=new BookDao();
132. Book book=new Book();
134. int selRow = table.getSelectedRow();
135. int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
136. book.setID(ID);
138. book.setISBN(textFieldISBN.getText());
139. book.setBookName(textFieldName.getText());
140. book.setAuthor(textFieldAuthor.getText());
141. float price = Float.parseFloat(textFieldPrice.getText());
142. book.setPrice(price);
143. book.setPublishHouse(textFieldPublishedHouse.getText());
144. book.setBookCategory(textFieldBookCategory.getText());
145. book.setBorrowerName(textFieldBorrowerName.getText());
146. book.setBorrowerPhone(textFieldBorrowerPhone.getText());
148. // 批改图书
149. bookDao.changeBook(book);
150. }
153. }
util 类(以 DBUtil 为例)
1. package pers.cyz.util;
3. import java.sql.Connection;
4. import java.sql.DriverManager;
5. import java.sql.SQLException;
7. /**
8. * 连贯数据库类,蕴含一个对外提供获取数据库连贯的办法
9. *
10. * @author 1651200111 陈彦志
11. */
12. public class DBUtil {
14. // 数据库连贯门路
15. private static final String URL = "jdbc:mysql://127.0.0.1:3306/db_books?"
16. + "useUnicode = true & serverTimezone = GMT"
17. // MySQL 在高版本须要指明是否进行 SSL 连贯
18. + "& characterEncoding = utf8 & useSSL = false";
19. private static final String NAME = "root";
20. private static final String PASSWORD = "root";
21. private static Connection conn = null;
23. // 动态代码块(将加载驱动、连贯数据库放入动态块中)24. static{
25. try {
26. // 加载驱动程序
27. Class.forName("com.mysql.cj.jdbc.Driver");
28. // 获取数据库的连贯
29. conn = DriverManager.getConnection(URL, NAME, PASSWORD);
30. } catch (ClassNotFoundException e) {31. e.printStackTrace();
32. } catch (SQLException e) {33. e.printStackTrace();
34. }
35. }
37. // 对外提供一个办法来获取数据库连贯
38. public static Connection getConnection(){
39. return conn;
40. }
43. }
util 类(以 BackgroundImage 为例)
1. package pers.cyz.util;
3. import java.awt.Container;
5. import javax.swing.ImageIcon;
6. import javax.swing.JFrame;
7. import javax.swing.JLabel;
8. import javax.swing.JPanel;
10. /**
11. * 设置背景图片类
12. *
13. * @author 1651200111 陈彦志
14. */
15. public class BackgroundImage {17. public BackgroundImage(JFrame frame,Container container,String ImageName) {
18. // 限定加载图片门路
19. ImageIcon icon= new ImageIcon("res/" + ImageName);
21. final JLabel labelBackground = new JLabel();
22. ImageIcon iconBookManageSystemBackground = icon;
23. labelBackground.setIcon(iconBookManageSystemBackground);
24. // 设置 label 的大小
25. labelBackground.setBounds(0,0,iconBookManageSystemBackground.getIconWidth()
26. ,iconBookManageSystemBackground.getIconHeight());
27. // 将背景图片标签放入桌面面板的最底层
28. frame.getLayeredPane().add(labelBackground,new Integer(Integer.MIN_VALUE));
29. // 将容器转换为面板设置为通明
30. JPanel panel = (JPanel)container;
31. panel.setOpaque(false);
33. }
36. }
重点内容:
将图片标签放在窗体底层面板,而后将窗体转化为容器,将容器面板设为通明,背景图片就设置好了,之后就能够间接在该容器中增加组件