Java小项目训练

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);

	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值