基于Java swing+mysql+eclipse的【图书管理系统】

本项目为Java swing项目,在工作环境中基本使用不到,但是很多学校把这个当做编程入门的项目来做,故分享出本项目供初学者参考。

CSDN赞助下载:https://download.csdn.net/download/weixin_44893902/20367467

一、效果演示:

主要功能:

①基本数据维护:
图书类别管理 >> 图书类别添加、图书类别维护
图书管理 >> 图书添加、图书维护
②关于我们
在这里插入图片描述

1、登录界面

在这里插入图片描述

2、主界面:

在这里插入图片描述

3、图书类别维护

在这里插入图片描述

4、图书类别添加

在这里插入图片描述

5、图书维护

在这里插入图片描述

6、图书添加

在这里插入图片描述

7、关于我们

在这里插入图片描述
可全部缩小到左下角
在这里插入图片描述

二、核心代码:

1、Util包 【存放数据库连接工具】

① DBTool(数据库连接工具类)

package cn.ac.azure.util;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 数据库连接工具类
 * @author 
 *
 */
public class DBTool {
	private static String driver;  //数据库驱动
	private static String url;  //数据库连接地址
	private static String user; //数据库连接用户
	private static String password;  //数据库连接密码
	
	static{
		//新建一个properties,用于读取db.properties配置文件
		Properties p=new Properties();
		//新建一个字符串,保存配置文件的路径
		String path="cn//ac//azure//util//db.properties";
		try {
			//调用Properties.load通过类加载获得配置文件的输入流
			p.load(DBTool.class.getClassLoader().getResourceAsStream(path));
			//读取配置文件中的配置参数
			driver=p.getProperty("driver");  //获取驱动
			url=p.getProperty("url");  //获取数据库连接地址
			user=p.getProperty("user");  //获取数据库用户
			password=p.getProperty("password");  //获取数据库密码
			try {
				//加载数据库驱动类到程序中
				Class.forName(driver);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
				throw new RuntimeException("加载驱动失败",e);
			}
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("找不到配置文件",e);
		}
	}
	/**
	 * 获取数据库连接
	 * @return 数据库连接对象
	 * @throws SQLException 提醒调用者捕获异常,并在finally中关闭关闭异常
	 */
	public static Connection getConnetion() throws SQLException{
		//通过DriverManager获得数据库连接
		return DriverManager.getConnection(url, user, password);
	}
	/**
	 * 关闭数据库连接
	 * @param con
	 */
	public static void close(Connection con){
		if(con!=null){ //如果数据连接不为空
			try {
				//关闭数据库连接
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException("数据库关闭失败",e);
			}
		}
	}
//	/**
//	 * 测试数据库连接工具是否可用
//	 * @param args
//	 */
//	public static void main(String[] args) {
//		Connection con=null;
//		try {
//			con=DBTool.getConnetion();
//			System.out.println("数据库连接成功!");
//		} catch (SQLException e) {
//			System.out.println("数据库连接失败!");
//			e.printStackTrace();
//		}finally{
//			DBTool.close(con);
//		}
//	}
}

② db.properties(配置文件)

2、model包 【存放实体类】

① Book(图书实体类)

 package cn.ac.azure.model;
/**
 * 图书实体
 * @author 
 *
 */
public class Book {
	private Integer id;  //图书id
	private String bookName;  //图书名称
	private String author;  //图书作者
	private String sex;     //作者性别
	private Float price;    //图书价格
	private Integer bookTypeId;  //图书类别ID
	private String bookTypeName;  //图书类别名称
	private String bookDesc;  //图书描述
	public Book() {
		super();
	}
	public Book(Integer id, String bookName, String author, String sex, Float price, Integer bookTypeId,
			String bookTypeName, String bookDesc) {
		super();
		this.id = id;
		this.bookName = bookName;
		this.author = author;
		this.sex = sex;
		this.price = price;
		this.bookTypeId = bookTypeId;
		this.bookTypeName = bookTypeName;
		this.bookDesc = bookDesc;
	}
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Float getPrice() {
		return price;
	}
	public void setPrice(Float price) {
		this.price = price;
	}
	public Integer getBookTypeId() {
		return bookTypeId;
	}
	public void setBookTypeId(Integer bookTypeId) {
		this.bookTypeId = bookTypeId;
	}
	public String getBookTypeName() {
		return bookTypeName;
	}
	public void setBookTypeName(String bookTypeName) {
		this.bookTypeName = bookTypeName;
	}
	public String getBookDesc() {
		return bookDesc;
	}
	public void setBookDesc(String bookDesc) {
		this.bookDesc = bookDesc;
	}
	
	@Override
	public String toString() {
		return "Book [测试=" + id + ", bookName=" + bookName + ", author=" + author + ", sex=" + sex + ", price=" + price
				+ ", bookTypeId=" + bookTypeId + ", bookTypeName=" + bookTypeName + ", bookDesc=" + bookDesc + "]";
	}
	
}

② BookType(图书类别实体类)

package cn.ac.azure.model;
/**
 * 图书类别实体
 * @author 
 *
 */
public class BookType {
	private int id;  //定义ID
	private String bookTypeName;  //定义图书类别名称
	private String bookTypeDesc;  //定义图书类别描述
	//无参构造器
	public BookType() {

	}
	//有参构造函数
	public BookType(String bookTypeName, String bookTypeDesc) {
		super();
		this.bookTypeName = bookTypeName;
		this.bookTypeDesc = bookTypeDesc;
	}
	
	public BookType(int id, String bookTypeName, String bookTypeDesc) {
		super();
		this.id = id;
		this.bookTypeName = bookTypeName;
		this.bookTypeDesc = bookTypeDesc;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getBookTypeName() {
		return bookTypeName;
	}
	public void setBookTypeName(String bookTypeName) {
		this.bookTypeName = bookTypeName;
	}
	public String getBookTypeDesc() {
		return bookTypeDesc;
	}
	public void setBookTypeDesc(String bookTypeDesc) {
		this.bookTypeDesc = bookTypeDesc;
	}
	@Override
	public String toString() {
		return "BookType [id=" + id + ", bookTypeName=" + bookTypeName + ", bookTypeDesc=" + bookTypeDesc + "]";
	}
}

③ User(用户实体类)

package cn.ac.azure.model;
/**
 * 用户实体
 * @author 
 *
 */
public class User {
	private int id;              //用户id
	private String username;     //用户名称
	private String password;     //用户密码
	
	public User() {
		
	}
	
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

3、Dao包 【数据库访问层】

① BookDao(图书dao类)

package cn.ac.azure.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cn.ac.azure.model.Book;

/**
 * 图书dao类
 * @author 
 *
 */
public class BookDao {
	/**
	 * 图书添加
	 * @param con 数据库库连接对象
	 * @param book 添加的图书对象
	 * @return 返回添加操作的数据库记录数
	 * @throws SQLException 抛出数据库异常
	 */
	public int add(Connection con,Book book) throws SQLException{
		//拼写sql插入语句
		String sql="insert into t_book values(null,'"+book.getBookName()+"','"+book.getAuthor()+"','"+book.getSex()+"','"+book.getPrice()+"','"+book.getBookTypeId()+"','"+book.getBookTypeName()+"','"+book.getBookDesc()+"')";
		System.out.println(sql);
		//获得预编译对象ps
		
		PreparedStatement ps=con.prepareStatement(sql);
		//设置ps参数
		/*ps.setString(1,book.getBookName());  //设置图书名称
		ps.setString(2,book.getAuthor());    //设置图书作者
		ps.setString(3, book.getSex());      //设置作者性别
		ps.setFloat(4, book.getPrice());     //设置图书价格
		ps.setInt(5, book.getBookTypeId());  //设置图书类别ID
		ps.setString(6, book.getBookDesc()); //设置图书描述
*/		//执行sql语句,并返回插入的记录数
		return ps.executeUpdate();
	}
	/**
	 * 图书查询
	 * @param con 数据库连接对象
	 * @param book 图书对象
	 * @return 查询的结果集
	 * @throws SQLException 抛出数据库异常
	 */
	public ResultSet search(Connection con,Book book) throws SQLException{
		//定义图书名称
		String bookName=null;
		//定义图书作者
		String author=null;
		//定义图书类别名称
		String bookTypeName=null;
		//如果图书不为空的话,就为前三个字段赋值,按照条件查询
		if(book!=null){
			bookName=book.getBookName();
			author=book.getAuthor();
			bookTypeName=book.getBookTypeName();
		}
		//定义一个字符串缓冲对象类存储查询添加
		StringBuilder sb=new StringBuilder("select * from t_book b , t_bookType bt where b.bookTypeId=bt.id ");
		//查询条件有图书名称
		if(!(bookName==null || "".equals(bookName.trim()))){
			sb.append("and b.bookName like '%"+bookName+"%' ");
		}
		//查询条件有图书作者
		if(!(author==null || "".equals(author.trim()))){
			sb.append("and b.author like '%"+author+"%' ");
		}
		//查询条件有图书类别名称
		if(!(bookTypeName==null || "".equals(bookTypeName.trim()))){
			sb.append("and bt.bookTypeName like '%"+bookTypeName+"%' ");
		}
		//从sb生成sql语句
		String sql=sb.toString();
		//获取预处理对象
		PreparedStatement ps=con.prepareStatement(sql);
		//执行查询,并返回结果集
		return ps.executeQuery();
	}
	/**
	 * 图书修改
	 * @param con 数据库连接对象
	 * @param book 修改的图书对象
	 * @return 返回修改改变的记录数
	 * @throws SQLException 抛出数据库异常,同时提醒调用者关闭数据库
	 */
	public int update(Connection con,Book book) throws SQLException{
		//编写sql语句
		String sql="update t_book set bookName=?,author=?,sex=?,"
				+ "price=?,bookTypeId=?,bookDesc=? where id=?";
		//获取预编译对象ps
		PreparedStatement ps=con.prepareStatement(sql);
		//设置ps对象 
		ps.setString(1, book.getBookName()); //图书名称
		ps.setString(2, book.getAuthor());   //图书作者
		ps.setString(3,book.getSex()); //作者性别
		ps.setFloat(4, book.getPrice()); //图书价格
		ps.setInt(5, book.getBookTypeId());  //图书类型Id
		ps.setString(6, book.getBookDesc()); //图书描述
		ps.setInt(7, book.getId());
		//执行修改并返回改变的记录数
		return ps.executeUpdate(); 
	}
	
	/**
	 * 图书删除
	 * @param con 数据库连接对象
	 * @param id 删除图书的id
	 * @return 返回删除的记录数
	 * @throws SQLException 抛出数据库异常,同时提醒调用者关闭数据库
	 */
	public int delete(Connection con,int id) throws SQLException{
		//编写sql语句
		String sql="delete from t_book where id=?";
		//获取预编译对象ps
		PreparedStatement ps=con.prepareStatement(sql);
		//设置ps参数
		ps.setInt(1, id);
		//执行DML删除语句并返回删除的记录数
		return ps.executeUpdate();
	}
}

② BookTypeDao(图书类别dao类)

package cn.ac.azure.dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cn.ac.azure.model.BookType;

/**
 * 图书类别dao类
 * @author 
 *
 */
public class BookTypeDao {
	/**
	 * 图书类别添加
	 * @param con 数据库连接对象
	 * @param bookType 要添加的图书类别
	 * @return 返回数据库操作的记录数
	 * @throws SQLException 
	 */
	public int add(Connection con,BookType bookType) throws SQLException{
		//拼写sql插入语句
		String sql="insert into t_bookType values(null,?,?)";
		//创建预编译对象ps
		PreparedStatement ps=con.prepareStatement(sql);
		//设置ps参数
		ps.setString(1, bookType.getBookTypeName()); //设置bookTypeName
		ps.setString(2, bookType.getBookTypeDesc()); //设置bookTypeDesc
		//返回数据库操作的记录数
		return ps.executeUpdate();
	}
	/**
	 * 图书类别查询
	 * @param con 数据库连接对象
	 * @param bookType 查询的图书类别
	 * @return 返回查询的结果集
	 * @throws SQLException 抛出数据库异常 
	 */
	public ResultSet search(Connection con,BookType bookType) throws SQLException{
		/*
		 * 思路:当jdbc查询数据库有多个条件从外部输入时,这是最好创建一个字符串缓冲类来添加条件到sql语句中。
		 * 同时,不知道有哪些条件是第一条件,无法确定where关键字的所在,于是添加条件都用(and 条件)
		 * 最后字符串转换成字符串时在将第一个and替换成where
		 */
		//定义一个图书类别名称
		String bookTypeName=null;
		if(bookType!=null){ //如果类别对象不为空的话,就获取它的类别名称
			bookTypeName=bookType.getBookTypeName();
		}
		//创建一个字符串缓冲类
		StringBuilder sb=new StringBuilder("select * from t_bookType");
		//添加查询语句的条件(and + 条件)
		if(!(bookTypeName==null || "".equals(bookTypeName.trim()))){
			//jdbc中,数据库字符串要用单引号括起来
			sb.append(" and bookTypeName like '%"+bookType.getBookTypeName()+"%'");
		}
		//将字符串缓冲对象转换成字符串,同时把第一个and替换成where
		String sql=sb.toString().replaceFirst("and", "where");   
		//获取预编译对象
		PreparedStatement ps=con.prepareStatement(sql);
		//返回ps执行查询之后的结果集
		return ps.executeQuery();
	}
	/**
	 * 图书类别修改
	 * @param con 数据路连接对象
	 * @param bookType 要修改的图书类别
	 * @return 返回数据库更新的记录数
	 * @throws SQLException 抛出数据库异常
	 */
	public int update(Connection con,BookType bookType) throws SQLException{
		//拼写sql更新语句
		String sql="update t_bookType set bookTypeName=? , bookTypeDesc=? where id=?";
		//获取预编译对象ps
		PreparedStatement ps=con.prepareStatement(sql);
		//设置ps参数
		ps.setString(1,bookType.getBookTypeName());
		ps.setString(2,bookType.getBookTypeDesc());
		ps.setInt(3, bookType.getId());
		//赶回ps更新数据库的记录数
		return ps.executeUpdate();
	}
	/**
	 * 删除数据库记录
	 * @param con 数据库连接对象
	 * @param id 传入删除记录的id
	 * @return 返回删除的记录数
	 * @throws SQLException 抛出数据库异常
	 */
	public int delete(Connection con,String id) throws SQLException{
		//拼写sql删除语句
		String sql="delete from t_bookType where id=?";
		//获取预编译对象ps
		PreparedStatement ps=con.prepareStatement(sql);
		//设置ps参数
		ps.setString(1, id);
		//执行ps更行操作,并返回改变的数据记录条数
		return ps.executeUpdate();
	}
}

③ UserDao(用户数据访问对象)

package cn.ac.azure.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cn.ac.azure.model.User;

/**
 * 用户数据访问对象
 * @author 
 *
 */
public class UserDao {
	/**
	 * 登录验证
	 * @param con 数据库连接对象
	 * @param user 登录的账户
	 * @return 返回一个用户对象,为null,则登录失败;反之,则登录成功
	 * @throws Exception 让调用者处理异常
	 */
	public User login(Connection con,User user) throws SQLException{
		//定义一个返回用户对象
		User resultUser=null;
		//拼写sql查询语句
		String sql="select * from t_user where username=? and password=?";
		//获取sql语句预编译对象
		PreparedStatement ps=con.prepareStatement(sql);
		//设置ps参数
		ps.setString(1, user.getUsername());
		ps.setString(2, user.getPassword());
		//ps执行sql查询语句返回结果集
		ResultSet rs=ps.executeQuery();
		//遍历结果集
		while(rs.next()){
			//初始化返回用户对象
			resultUser=new User(); 
			resultUser.setId(rs.getInt("id"));    //设置用户id
			resultUser.setUsername(rs.getString("username"));  //设置用户名称
			resultUser.setPassword(rs.getString("password"));  //设置用户密码
		}
		//返回用户对象
		return resultUser;
	}
}

4、View包 【视图层】

① LoginFrame(登录界面)

package cn.ac.azure.view;

import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
impo
  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值