Java项目-----图书管理系统
开发流程
(1)进行需求分析
(2)设计数据库(重要)
(3)编写java代码
开发环境
(1)开发工具:Eclipse EE版
(2)数据库:mysql-8.0.16-winx64
(3)JDK:1.8.0_202
(4)JDBC:8.0.16
界面效果图
1、主界面
2、登陆界面
2、登陆界面
3、查询界面
4、添加界面
等。。。。。。
设计数据库
(1)用户表(user):
用户id,用户名,用户密码
(2)管理员表(admin):
管理员id,管理员名,管理员密码
(3)图书信息表(book):
图书id,图书名,图书出版社,图书作者,图书状态
(4)借阅记录表(lendrecord) :
借阅记录id,用户id,用户名,图书id,图书名,是否归还
(1) user表
(2) admin表
(3) book表
(4) lendrecord表
重要代码分析
Dao类中写的是对数据库的一些基本操作
package com.book.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.book.model.Book;
import com.book.model.User;
import com.book.util.StringUtil;
public class BookDao {
/**
* 图书添加
* @param con
* @param book
* @return
* @throws Exception
*/
public int add(Connection con, Book book) throws Exception {
//插入图书前 检查bookId是否已经存在,若存在,返回0
String sqlid = "select * from book where bookId = ?";
PreparedStatement pstmtid = (PreparedStatement) con.prepareStatement(sqlid);
pstmtid.setString(1, book.getBookId());
ResultSet rs = pstmtid.executeQuery();
if(rs.next()) {
return 0;
}
String sql = "insert into book values(?,?,?,?,?,?)";
PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
pstmt.setString(1, book.getBookId());
pstmt.setString(2, book.getBookName());
pstmt.setString(3, book.getPress());
pstmt.setString(4, book.getAuthor());
pstmt.setString(5, book.getTypeId());
pstmt.setInt(6, book.getLend());
return pstmt.executeUpdate();
}
/**
* 图书查询
* @param con
* @param bookMessage
* @return
* @throws Exception
*/
public ResultSet list(Connection con, Book bookMessage) throws Exception {
//将book表和bookType表连接
//StringBuffer sb = new StringBuffer("select * from book,booktype where book.typeId=booktype.typeId");
StringBuffer sb = new StringBuffer("select * from book where bookId = bookId ");
//向sb中添加,并进行模糊查询
if(StringUtil.isNotEmpty(bookMessage.getBookId())) {
sb.append(" and bookId like '%" + bookMessage.getBookId() + "%'");
}
//按书名模糊查询
if(StringUtil.isNotEmpty(bookMessage.getBookName())) {
sb.append(" and book.bookName like '%" + bookMessage.getBookName() + "%'");
}
//按作者模糊查询
if(StringUtil.isNotEmpty(bookMessage.getAuthor())) {
sb.append(" and book.author like '%" + bookMessage.getAuthor() + "%'");
}
//按图书类型模糊查询
if(StringUtil.isNotEmpty(bookMessage.getTypeId())) {
sb.append(" and book.typeId like '%" + bookMessage.getTypeId() + "%'");
}
PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sb.toString());
return pstmt.executeQuery();
}
//历史记录查询
public ResultSet listHistory(Connection con, User userMessage) throws Exception {
String sql = "select recordId,userName, bookName, (case back when 0 then '否' when 1 then '是' end) as back from lendrecord where userName = ?";
PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
pstmt.setString(1, userMessage.getUsername());
return pstmt.executeQuery();
}
/**
* 图书删除
* @param con
* @param id
* @return
* @throws Exception
*/
public int delete(Connection con, String id) throws Exception {
String sql = "delete from book where bookId = ?";
PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
pstmt.setString(1, id);
return pstmt.executeUpdate();
}
/**
* 图书修改
* @param con
* @param bookMessage1
* @return
* @throws Exception
*/
public int update(Connection con, Book bookMessage1) throws Exception {
String sql = "update book set bookName=?, press=?, author=? where bookId=?";
PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
pstmt.setString(1, bookMessage1.getBookName());
pstmt.setString(2, bookMessage1.getPress());
pstmt.setString(3, bookMessage1.getAuthor());
pstmt.setString(4, bookMessage1.getBookId());
return pstmt.executeUpdate();
}
//检查该id的图书是否存在,若存在,返回0,否则返回1
public ResultSet bookCheck(Connection con, String id) throws Exception{
//插入图书前 检查bookId是否已经存在,若存在,返回0
String sqlid = "select * from book where bookId = ?";
PreparedStatement pstmtid = (PreparedStatement) con.prepareStatement(sqlid);
pstmtid.setString(1, id);
ResultSet rs = pstmtid.executeQuery();
return rs;
}
//
/**
* 图书借阅
* 修改book表中的lend字段和 借阅记录表(lendrecord)中的back字段 lend=1,back=0
* @param con
* @param textid
* @param bookName
* @param userMessage
* @return
* @throws Exception
*/
public int lend (Connection con, String textid, String bookName, User userMessage) throws Exception {
//先修改book表中图书的状态
String sql = "update book set lend=? where bookId=?";
PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
pstmt.setString(1, "1");
pstmt.setString(2, textid);
pstmt.executeUpdate();
//插入借阅记录表(lendrecord) 信息
String insql = "insert into lendrecord (userId,userName,bookId,bookName,back)values(?,?,?,?,?)";
PreparedStatement lendpstmt = (PreparedStatement) con.prepareStatement(insql);
lendpstmt.setString(1, userMessage.getUserId());
lendpstmt.setString(2, userMessage.getUsername());
lendpstmt.setString(3, textid);
lendpstmt.setString(4, bookName);
lendpstmt.setString(5, "0");
lendpstmt.executeUpdate();
return 0;//成功
}
//图书归还
/**
* 修改book表中的lend字段和 借阅记录表(lendrecord)中的back字段 lend=0,back=1
* @param con
* @param textid
* @param userMessage
* @return
* @throws Exception
*/
public int back (Connection con, String textid, User userMessage) throws Exception {
//先修改book表中图书的状态
String sql = "update book set lend=? where bookId=?";
PreparedStatement pstmt = (PreparedStatement) con.prepareStatement(sql);
pstmt.setString(1, "0");
pstmt.setString(2, textid);
pstmt.executeUpdate();
//修改借阅记录表(lendrecord) 信息 ,back=1,表示已经归还
String insql = "update lendrecord set back=? where bookId=? and userName=? ";
PreparedStatement lendpstmt = (PreparedStatement) con.prepareStatement(insql);
lendpstmt.setString(1, "1");
lendpstmt.setString(2, textid);
lendpstmt.setString(3, userMessage.getUsername());
lendpstmt.executeUpdate();
return 0;//成功
}
}
b、Model类
package com.book.model;
public class Book {
private String bookId;//图书id
private String bookName;//图书名
private String press;//图书出版社
private String author;//图书作者
private String typeId;//图书类别id
private int lend;//图书是否被借, 是为1, 默认为0
public String getBookId() {
return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTypeId() {
return typeId;
}
public void setTypeId(String typeId) {
this.typeId = typeId;
}
public int getLend() {
return lend;
}
public void setLend(int lend) {
this.lend = lend;
}
}
c、Util类
package com.book.util;
import java.sql.Connection;
import java.sql.DriverManager;
public class DbUtil {
private String url = "jdbc:mysql://localhost:3306/work?serverTimezone=UTC";
private String username = "root";
private String password = "123456";
//连接数据库方法
public Connection getCon() throws Exception {
//Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = (Connection) DriverManager.getConnection(url, username, password);
return con;
}
//关闭数据库方法
public void closeCon(java.sql.Connection con) throws Exception {
if(con != null) {
con.close();
}
}
}
d、工具类
package com.book.util;
public class StringUtil {
/**
* 判断字符串是否为空
* @param str
* @return
*/
public static boolean isEmpty(String str) {
if(str == null || "".equals(str.trim())) {//trim()的作用是去掉字符串两端的多余的空格
return true; //注意,是两端的空格,且无论两端的空格有多少个都会去掉,
}else { // 当然,中间的那些空格不会被去掉
return false;
}
}
/**
* 判断不为空
* @param str
* @return
*/
public static boolean isNotEmpty(String str) {
if(str != null && !"".equals(str.trim())) {
return true;
} else {
return false;
}
}
}
e、Fram类
注册界面为例
package book.face;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import book.dao.UserDao;
import book.model.User;
import book.util.DbUtil;
import book.util.StringUtil;
public class LoginFram {
// 写一个注册界面的方法
public static void LoginFram() {
JFrame frame = new JFrame("注册界面");
frame.setLayout(null);
// 创建背景面板。
BackgroundPanel bgp;
// 开6个面板,方便设置位置
JPanel pan1 = new JPanel();// 用来存放系统名字组件
JPanel pan2 = new JPanel();// 用来存放用户身份和下拉框组件
JPanel pan3 = new JPanel();// 用来存放账号和文本框组件
JPanel pan4 = new JPanel();// 用来存放密码和密码框组件
JPanel repan = new JPanel();// 用来存放重复密码和密码框组件
JPanel pan5 = new JPanel();// 用来存放提交组件
// 文本框
JTextField textId = new JTextField();// 账号
JTextField textName = new JTextField();// 用户名
JPasswordField passwordfield = new JPasswordField();
JPasswordField repasswordfield = new JPasswordField();
// 提示框
JLabel label1 = new JLabel("注 册 界 面");
JLabel label2 = new JLabel("账 号 ");
JLabel label3 = new JLabel("用 户 名 ");
JLabel label4 = new JLabel("密 码 ");
JLabel label5 = new JLabel("重复密码 ");
// 按钮
JButton button1 = new JButton("提交");
Font font = new Font("宋体", Font.BOLD, 50);// 标题字体大小
Font f = new Font("宋体", Font.BOLD, 25);// 提示框字体大小
// 设置文本框的大小
textId.setPreferredSize(new Dimension(200, 30));
textName.setPreferredSize(new Dimension(200, 30));
passwordfield.setPreferredSize(new Dimension(200, 30));
repasswordfield.setPreferredSize(new Dimension(200, 30));
button1.setPreferredSize(new Dimension(90, 40));
// 设置界面所有字体大小,包括标题、提示框字体和文本框
label1.setFont(font);// 设置标题字体
label2.setFont(f);
textId.setFont(f);
label3.setFont(f);
textName.setFont(f);
label4.setFont(f);
passwordfield.setFont(f);
label5.setFont(f);
repasswordfield.setFont(f);
button1.setFont(f);
// 向面板中添加组件
pan1.add(label1);
pan2.add(label2);
pan2.add(textId);
pan3.add(label3);
pan3.add(textName);
pan4.add(label4);
pan4.add(passwordfield);
repan.add(label5);
repan.add(repasswordfield);// 重复密码
pan5.add(button1);
//设置背景色透明
pan1.setOpaque(false);
pan2.setOpaque(false);
pan3.setOpaque(false);
pan4.setOpaque(false);
repan.setOpaque(false);
// 设置面板位置
pan1.setBounds(235, 50, 430, 60);
pan2.setBounds(235, 170, 430, 50);
pan3.setBounds(235, 240, 430, 50);
pan4.setBounds(235, 310, 430, 50);
repan.setBounds(235, 380, 430, 50);
pan5.setBounds(450, 440, 100, 50);
// 添加面板
frame.add(pan1);
frame.add(pan2);
frame.add(pan3);
frame.add(pan4);
frame.add(repan);
frame.add(pan5);
// 提交事件监听
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
User userMessage = new User();
String id = textId.getText().toString();
String name = textName.getText().toString();
String password = new String(passwordfield.getPassword());
String repassword = new String(repasswordfield.getPassword());
// 判断两次密码输入是否一致
if (!password.equals(repassword)) {
JOptionPane.showMessageDialog(null, "两次输入的密码不一致,请重新输入");
return;
}
// 注册时,判断输入文本框的值不能为空
if (StringUtil.isEmpty(id)) {
JOptionPane.showMessageDialog(null, "账号不能为空");
return;
} else if (StringUtil.isEmpty(name)) {
JOptionPane.showMessageDialog(null, "用户名不能为空!");
return;
} else if (StringUtil.isEmpty(password)) {
JOptionPane.showMessageDialog(null, "密码不能为空!");
return;
}
// 将用户输入的信息封装到userMessage类里面
userMessage.setUserId(id);
userMessage.setUsername(name);
userMessage.setPassword(password);
DbUtil dbutil = new DbUtil();
UserDao userdao = new UserDao();
// 账号不能相同
try {
Connection con = dbutil.getCon();
int current = userdao.add(con, userMessage);
// 提示框,若返回值是0,注册成功
if (current != 0) {
JOptionPane.showMessageDialog(null, "注册成功");
frame.dispose();
return;
} else {
JOptionPane.showMessageDialog(null, "账号已存在!");
return;
}
} catch (Exception evt) {
evt.printStackTrace();
}
}
});
// 窗口设置
frame.setBounds(500, 150, 950, 650);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
class BackgroundPanel extends JPanel {
Image im;
public BackgroundPanel(Image im) {
this.im = im;
this.setOpaque(true);
}
//Draw the back ground.
public void paintComponent(Graphics g) {
super.paintComponents(g);
g.drawImage(im, 0, 0, this.getWidth(), this.getHeight(), this);
}
}