Java+MySQL 图书管理系统
作者:BUFFER.pwn 发布时间:2023-11-28 19:28:43
目录
一,功能
二,工具
三、效果图:
四、数据库设计
五、JAVA层次分析
六、主要Java代码分析
一,功能
管理员登录
图书借阅信息管理
图书信息管理
管理员更改密码
退出系统
二,工具
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
参考文章:https://blog.csdn.net/acm_hmj/article/details/52830920
源码打包下载地址:www.jb51.net/codes/769916.html
来源:https://blog.csdn.net/qq_35793285/article/details/85209242
猜你喜欢
- 线程安全当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协调,这个类
- mybatis plus新增(insert)数据获取主键id在我们执行insert操作的时候,往往会需要拿到新插入数据的主键id做下一步操作
- Java main 方法面试题的详细整理1.不用main方法如何定义一个类?不行,没有main方法我们不能运行Java类。在java 7之前
- 部署到webapps目录启动本文使用的Spring版本为Spring6,SpringBoot版本为3,JDK为17,可能会和之前有细微不同,
- java arrayList遍历的四种方法及Java中ArrayList类的用法package com.test;import java.u
- 本文实例为大家分享了Java解码H264格式视频流中的图片,供大家参考,具体内容如下引入依赖<dependency>  
- 本文实例讲述了Java Web实现添加定时任务的方法。分享给大家供大家参考,具体如下:定时任务时间控制类/** * 定时任务时间控制 * *
- 本文实例讲述了JAVA设计模式之备忘录模式。分享给大家供大家参考,具体如下:备忘录模式:又叫做快照模式,指在不破坏封装性的前提下,获取到一个
- Java:对象创建和初始化过程1.Java中的数据类型 Java中有3个数据类型:基本数据类型(在Jav
- 仅供学习交流,禁止商业用途。如侵害利益,联系必删!前言最近一位小伙伴钟爱二次元文化,于是找到半次元这个app,但是很快他就遇到了问题。一、案
- 前言开篇一个例子,我看看都有谁会?如果不会的,或者不知道原理的,还是老老实实看完这篇文章吧。@Slf4j(topic = "c.V
- 把char数组转换成String调用reverseStr()传入一个字符串"let’s"
- 双向循环链表定义相比于单链表,有两个指针,next指针指向下一个结点,prior指针指向上一个结点,最后一个结点的next指针指向头结点,头
- 在《Spring Boot Hello World》中介绍了一个简单的spring boot例子,体验了spring boot中的诸多特性,
- 1、volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)&nb
- log4j2支持日志的异步打印,日志异步输出的好处在于,使用单独的进程来执行日志打印的功能,可以提高日志执行效率,减少日志功能对正常业务的影
- 错误处理到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以
- 在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。然而在Java中除了提供LockAPI外还在语
- 前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析。PaginatedDataTablePaginatedDataT
- 本文实例为大家分享了java实现航空用户管理系统的具体代码,供大家参考,具体内容如下题目内容:某航空公司在其航班到达的不同的国家的不同地方设