Java小项目--小型图书管理系统(含完整代码及工具)
写在前面
对于一个java项目来说,我理解的整个流程是这样的:
(1)进行需求分析
(2)设计数据库(重要)
(3)编写java代码
注:数据库设计非常重要,特别是数据类型的定义,表与表之间的关系,如果前期这些没整太好,在后期写java代码的时候会有些小麻烦,比如,修改数据类型,删除表,添加表中字段等等。不过还好有Navicat这种神器,让我们操作数据库更简单。
开发环境
(1)开发工具:Eclipse EE版
(2)数据库:mysql-8.0.16-winx64
(3)JDK:1.8.0_202
(4)JDBC:8.0.16
链接:https://pan.baidu.com/s/1B0Cx42vLII8hVxEswryAZA
提取码:9owp
完整代码
链接:https://pan.baidu.com/s/1PbNl5iyvGWMOBSpVLhrF3g
提取码:vr73
sql文件及word文档
链接:https://pan.baidu.com/s/1QFkmn2bG75jcasyHlHoqAw
提取码:13ve
怎么导入数据库呢?可以看这个:
https://blog.csdn.net/qq_42524288/article/details/103497248
展示下效果图
1、主界面
2、登录界面
3、注册界面
4、查询界面
5、图书添加界面
6、用户查询界面
下面进入正题
1、需求分析
该系统有普通用户和管理员,如果是用户登录,则只能对图书进行查询、借阅、归还等基础操作,如果是管理员登录,还可以对图书进行增删改查等各项操作以及对用户进行查询和删除操作。
总结需求得出系统功能就是:
1、用户登录,有管理员和普通用户
2、普通用户可以借书,还书,查询
3、管理员可以管理图书和用户
2、设计数据库
(1)用户表(user):
用户id,用户名,用户密码
(2)管理员表(admin):
管理员id,管理员名,管理员密码
(3)图书信息表(book):
图书id,图书名,图书出版社,图书作者,图书状态
(4)借阅记录表(lendrecord) :
借阅记录id,用户id,用户名,图书id,图书名,是否归还
(1) user表
(2) admin表
(3) book表
(4) lendrecord表
3、Java代码编写
(1)包结构
(2)包结构的功能
(3)重要代码分析
a、Dao类(以BookDao为例)
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是否已经存在,若存在,返回0String 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,否则返回1public ResultSet bookCheck(Connection con, String id) throws Exception{//插入图书前 检查bookId是否已经存在,若存在,返回0String 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类(以Book为例)
Medel类,主要是get,set方法
get和set方法可以自动生成,快捷键:
Shift+Alt+S –> Generate Getters and Setters –>选择你需要的get,set参数
package com.book.model;public class Book {private String bookId;//图书idprivate String bookName;//图书名private String press;//图书出版社private String author;//图书作者private String typeId;//图书类别idprivate int lend;//图书是否被借, 是为1, 默认为0public 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();}}/* public static void main(String[] args) {DbUtil dbUtil = new DbUtil(); try {dbUtil.getCon(); System.out.println("数据库连接成功"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); //在命令行打印异常信息在程序中出错的位置及原因。System.out.println("数据库连接错误"); } } */
}
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类(以BookMenuFram为例)
各种界面
package com.bookface;import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;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.JTextField;import com.book.util.StringUtil;
import com.bookmanager.view.BookAddFram;
import com.bookmanager.view.BookDeleteFram;
import com.bookmanager.view.BookLookFram;
import com.bookmanager.view.BookUpDataFram;
import com.lendbackbook.view.BackBook;
import com.lendbackbook.view.HistoryBook;
import com.lendbackbook.view.LendBook;
import com.usermanager.view.UserDeleteFram;
import com.usermanager.view.UserLookFram;public class BookMenuFram extends JFrame {static String loginId = null;static String loginName = null;//若是管理员登录,存管理员的名字,否则,存普通用户的名字//标记用户类别,若是0代表普通用户,1代表管理员,默认是0static int flag = 0;//系统主界面public static void BookMenuFram() {JFrame frame = new JFrame();//主菜单窗口 frame.setLayout(null);//开6个面板,方便设置位置JPanel pan1 = new JPanel();//系统名字JPanel pan2 = new JPanel();//图书管理JPanel pan3 = new JPanel();//图书管理的操作按钮JPanel pan4 = new JPanel();//借还书JPanel pan5 = new JPanel();//借还书的操作按钮JPanel pan6 = new JPanel();//用户管理JPanel pan7 = new JPanel();//用户管理的操作按钮JPanel pan8 = new JPanel();//放登录退出按钮JPanel pan9 = new JPanel();//放置图片JTextField text = new JTextField(); // 文本框,可删除text.setText("未登录!");//设置提示未登录// JLabel text = new JLabel();//提示框,不可删除
// text.setText("未登录!");//设置提示未登录//提示框JLabel label1 = new JLabel("小型图书管理系统"); JLabel label2 = new JLabel("图书管理");JLabel label3 = new JLabel("借还书");JLabel label4 = new JLabel("用户管理");//添加图片ImageIcon im = new ImageIcon("imge/1.jpg");JLabel pac = new JLabel(im); pac.setBounds(355,125, im.getIconWidth(), im.getIconHeight());pan9.add(pac);pan9.setBounds(355,125, 932, 630);//按钮JButton button1 = new JButton("登录");JButton button2 = new JButton("图书查询");JButton button3 = new JButton("图书添加");JButton button4 = new JButton("图书修改");JButton button5 = new JButton("图书删除");JButton button6 = new JButton("办理借书");JButton button7 = new JButton("办理还书");JButton button8 = new JButton("历史查询");JButton button9 = new JButton("查询用户");JButton button10 = new JButton("删除用户");JButton button11 = new JButton("退出");//设置颜色格式Color blacka = new Color(30,144,255);Color blackb = new Color(0,255,255);Color blackc = new Color(255,69,0);Color blackd = new Color(255,215,0);//设置字体大小对象Font font = new Font("宋体",Font.BOLD,80);//标题字体大小 Font f = new Font("宋体",Font.BOLD,30);//提示框字体大小Font f1 = new Font("宋体",Font.BOLD,20);//text//设置按钮的大小button2.setPreferredSize(new Dimension(200,65));button3.setPreferredSize(new Dimension(200,65));button4.setPreferredSize(new Dimension(200,65));button5.setPreferredSize(new Dimension(200,65));button6.setPreferredSize(new Dimension(200,65));button7.setPreferredSize(new Dimension(200,65));button8.setPreferredSize(new Dimension(200,65));button9.setPreferredSize(new Dimension(200,65));button10.setPreferredSize(new Dimension(200,65));text.setPreferredSize(new Dimension(170,35));////设置字体大小button2.setFont(f);button3.setFont(f);button4.setFont(f);button5.setFont(f);button6.setFont(f);button7.setFont(f);button8.setFont(f);button9.setFont(f);button10.setFont(f);text.setFont(f1);label1.setFont(font);//设置标题字体label2.setFont(f);label3.setFont(f);label4.setFont(f);//向面板中添加组件pan1.add(label1);pan1.setBackground(blacka);pan1.setBounds(0, 0, 1100, 120);//大标题//pan8定位在右上角,放登录、退出和显示框pan8.add(text);pan8.add(button1);pan8.add(button11); pan8.setBackground(blacka);pan8.setBounds(1100, 0, 190, 120);pan2.add(label2);pan2.setBackground(blackb);pan2.setBounds(0, 120, 150, 284);//图书管理pan3.add(button2);pan3.add(button3);pan3.add(button4);pan3.add(button5);pan3.setBounds(150, 120, 200, 284);pan4.add(label3);pan4.setBackground(blackc);pan4.setBounds(0, 404, 150, 213);//借还书pan5.add(button6);pan5.add(button7);pan5.add(button8);pan5.setBounds(150, 404, 200, 213);pan6.add(label4);pan6.setBackground(blackd);pan6.setBounds(0, 617, 150, 142);//用户管理pan7.add(button9);pan7.add(button10);pan7.setBounds(150, 617, 200, 200);String noLogin = "未登录!";//JVM先查看常量池中有没有,如有,地址指向它,若没有,创建新对象保存//获取登录后的用户名if(StringUtil.isNotEmpty(LogOnFram.userName())) {loginName = LogOnFram.userName();text.setText("欢迎您," + loginName); }if(StringUtil.isNotEmpty(LogOnFram.adminName())) {loginName = LogOnFram.adminName();text.setText("欢迎您," + loginName);flag = 1;}//获取登录后的idif(StringUtil.isNotEmpty(LogOnFram.id())) {loginId = LogOnFram.id();}//登录监听button1.addActionListener(new ActionListener() {//登录监听public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) { LogOnFram.LogOnFram();frame.dispose();//关闭当前登录界面} else {JOptionPane.showMessageDialog(null, "请您先退出!");} } });//各项操作监听,button2--button10button2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) { //equals()方法如果不重写,就是比较的字符串内容。而'=='比较的是地址JOptionPane.showMessageDialog(null, "请您先登录!");return;} else {BookLookFram.BookLookFram();//图书查询}} });button3.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) {JOptionPane.showMessageDialog(null, "请您先登录!");return;} else {if(flag == 1) {//如果flag是1,这可以添加图书BookAddFram.bookAddFram();//图书添加} else {JOptionPane.showMessageDialog(null, "管理员才可以执行此操作!");} } }});button4.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) {JOptionPane.showMessageDialog(null, "请您先登录!");return;} else { if(flag == 1) {//如果flag是1,这可以添加图书BookUpDataFram.bookUpDataFram();//修改图书} else {JOptionPane.showMessageDialog(null, "管理员才可以执行此操作!");}}}});button5.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) {JOptionPane.showMessageDialog(null, "请您先登录!");return;} else {if(flag == 1) {//如果flag是1,这可以添加图书BookDeleteFram.BookDeleteFram();//删除图书} else {JOptionPane.showMessageDialog(null, "管理员才可以执行此操作!");}}}});button6.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) {JOptionPane.showMessageDialog(null, "请您先登录!");return;} else { //办理借书LendBook.LendBook();}}});button7.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) {JOptionPane.showMessageDialog(null, "请您先登录!");return;} else { //办理还书BackBook.BackBook();}}});button8.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) {JOptionPane.showMessageDialog(null, "请您先登录!");return;} else { //历史查询HistoryBook.HistoryBook();}}});button9.addActionListener(new ActionListener() {//查询用户public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) {JOptionPane.showMessageDialog(null, "请您先登录!");return;} else {if(flag == 1) {//如果flag是1,这可以添加图书UserLookFram.UserLookFram();//用户查询} else {JOptionPane.showMessageDialog(null, "管理员才可以执行此操作!");}}}});button10.addActionListener(new ActionListener() {//删除用户public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) {JOptionPane.showMessageDialog(null, "请您先登录!");return;} else {if(flag == 1) {//如果flag是1,这可以添加图书UserDeleteFram.UserDeleteFram();//用户删除} else {JOptionPane.showMessageDialog(null, "管理员才可以执行此操作!");}}}});button11.addActionListener(new ActionListener() {//退出登录public void actionPerformed(ActionEvent e) {String getText = text.getText().toString();//1if(getText.equals(noLogin)) {JOptionPane.showMessageDialog(null, "请您先登录!");return;} else {// frame.dispose();
// LogOnFram.LogOnFram();System.exit(0);}}});//向容器中添加JPanel面板frame.add(pan1);frame.add(pan2);frame.add(pan3);frame.add(pan4);frame.add(pan5);frame.add(pan6);frame.add(pan7);frame.add(pan8);frame.add(pan9);//窗口设置frame.setBounds(310, 100, 1300, 800);frame.setResizable(false);//设置窗口不能扩大frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static String loginName() {return loginName;}public static String loginId() {return loginId;}
}
Java小项目--小型图书管理系统(含完整代码及工具)相关推荐
- Java小项目迷你图书管理系统
package 迷你图书管理系统;import java.util.Scanner;public class BookMgr {public static void main(String[] arg ...
- 模拟图书管理系统的完整代码
模拟图书管理系统的完整代码: def readBook():with open(r"books.txt","r") as f:jsondata=f.read() ...
- java实现简单的图书管理系统(以及代码中用了特殊注释TODO,XXX,FIXME),compare接口
参考来自 java实现简单的图书管理系统_Jewel's blog-CSDN博客_java图书管理系统一.项目分布Book类: 定义了书的一些属性(书名,作者,价格,分类,状态)并且写了属性的get. ...
- java小项目图书管理系统_Java小项目迷你图书管理系统
package迷你图书管理系统;importjava.util.Scanner;public classBookMgr {public static voidmain(String[] args) { ...
- Java小项目-银行用户管理系统
文章目录 前言 一. 功能 二. 代码 银行卡数据 转账流水数据 用户数据 BanksController UserController BanksDao RecordDao UserDao Bank ...
- Java实现ATM银行模拟系统(含完整代码)
目录 引言 功能简介 登录和注册 1.注册 2.登录 具体功能实现 1.存款功能 2.取款功能 3.转账功能 4.查询功能 5.注销账号 6.修改密码 7.退出 完整代码 引言
- java小项目(公交车管理系统+航空订票系统)
航空订票系统 //测试函数放在Booking里面 //Enum PassengerCabin package systemofAirplane;public enum PassengerCabin { ...
- 猿创征文 |【JAVA小程序】图书管理系统(继承 多态 接口 链表 一应俱全)附源码
谢谢你陪着稀奇古怪的我 大家好,这里是新一,请多关照
- C语言通讯录管理系统(含完整代码)
课题3:通讯录管理系统 设计内容: 设计一个通讯录管理系统,以实现以下功能:信息添加.查询.修改.删除.排序等功能. 设计要求: 1) 每条信息至包含 :姓名.电话.工作单位等信息 2) 作为一个完整 ...
最新文章
- 运维数据库平台~inception审核规则详解
- 爱创课堂每日一题第五十二天- js延迟加载的方式有哪些?
- href=#与href=javascriptvoid(0)的区别
- C++初学之 3. ASCII数值的应用(大小写变换)
- 年底跳槽,都去哪儿?数万从业者的新选择即将揭幕
- 20140115-URL编码与解码
- CCNA学习指南记录
- Ubuntu(小名乌班图)的安装顺便附带VMware的安装教程,以及VM的激活密钥
- python循环结构高一信息技术_高中信息技术《循环结构1》优质课教学设计、教案...
- 大数据笔记--Hadoop(第二篇)
- C语言之位操作和整形的补位
- 二极管、三极管、MOSFET管知识点总结
- 安卓4.1.2 新建第一个native c++程序ndk开发以及解决出现configure projects一直卡住的问题
- 计算机中的正负数表示
- 十个免费的Web负载/压力测试工具
- 服务器丢包的原因及解决方法
- java8421码,关于用Java程序实现8421码权限管理 第二部分
- 一直想弃用,从未被替代的Java8——Stream篇(内含大量示例代码)
- Java实现 LeetCode 278 第一个错误的版本
- 学习Numpy(五)