实战项目-图书管理系统

该博客记录了Java图书管理系统的实战开发过程。运用MySQL、Java基础、JDBC、Swing基础等知识,采用MVC框架,创建多个包实现不同功能。逐步完成登录窗口、主界面、图书类别添加、查询、管理等界面及响应功能,还解决了数据库连接和结果集操作的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用到的知识:

MySQL
java 基础
JDBC
swing 基础


19.07.10 第一更

开始构造框架,用的MVC框架,第一次接触,大概了解了一下:

MVC模式:
Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

也大概了解了下 模式-架构-框架 之间的区别和联系

共创建了五个包:
com.java1212.view 视图层
com.java1212.dao 数据库访问层
com.java1212.model 实体层
com.java1212.utill 工具包(连接数据库)
pictures 图片素材包

构建工具包

创建DbUtil类,实现连接数据库的getCon方法和关闭closeCon方法

package com.java1212.util;

import java.sql.Connection;
import java.sql.DriverManager;

/**
 * 数据库工具类
 * @author Administrator
 *
 */
public class DbUtil 
{
	private String driverAddress = "jdbc:mysql://localhost:3306/db_book";//连接数据库的地址
	
	private String userName = "root";	//连接数据库的用户名
	private String passWord = "123456";	//连接数据库的用户密码
	private String jdbcName = "com.mysql.jdbc.Driver";	//加载驱动的驱动名称
	
	
	/**
	 * 获取数据库连接
	 * @return
	 * @throws Exception
	 */
	public Connection getCon()throws Exception
	{
		Class.forName(jdbcName);  //加载驱动
		Connection con = DriverManager.getConnection(driverAddress,userName,passWord);//连接数据库
		return con;
	}
	
	/**
	 * 关闭数据库连接
	 * @param con
	 * @throws Exception
	 */
	public void closeCon(Connection con)throws Exception
	{
		if(con != null)  //判断是否为空,避免异常
		{
			con.close();  //断开连接,一定要关,因为占用内存很大
		}
	}
	public static void main(String[] args)
	{
		DbUtil dbUtil = new DbUtil();
		try {
			Connection con = dbUtil.getCon();
			System.out.println("连接成功");
		
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			System.out.println("连接失败");
		}
	}
}

期间出现的问题:

问题(1):

在创建连接数据库的工具类DbUtil类时候,最后连接测试出现了:“No Suitable Driver Found For Jdbc”的错误,检查了下,总结的解决方案:

1.连接URL格式出现了问题(Connectionconn=DriverManager.getConnection("jdbc:mysql://localhost:3306/XX","root","XXXX")

2.驱动名称字符串出错 (com.mysql.jdbc.Driver)

3.Class path中没有加入合适的mysql_jdbc驱动,

4.有了驱动还需要将该jar包加入到java运行环境的外部jar包中。

创建DbString类,实现判断字符串是否为空串和是否是非空串

package com.java1212.util;

public class DbString
{
	/**
	 * 判断是否是空
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(String str)
	{
		if(str == null || "".equals(str.trim())) return true;
		else return false;
	}
	
	/**
	 * 判断是否不是空
	 * @param str
	 * @return
	 */
	public static boolean isNotEmpty(String str)
	{
		if(str == null || "".equals(str.trim())) return false;
		else return true;
	}
}

构建 实体层,创建User类:

package com.java1212.model;

/**
 * 用户的实体
 * @author Administrator
 *
 */
public class User 
{
	private int userId;  //用户id
	private String userName; //用户名称
	private String passWord;//用户的登录密码
	
	//构造方法
	public User() {
		super();
		// TODO 自动生成的构造函数存根
	}
	
	public User(String userName, String passWord) {
		super();
		this.userName = userName;
		this.passWord = passWord;
	}

	//属性的get set方法
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	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;
	}
}

创建UserDao类,User类连接数据库

package com.java1212.dao;

import java.sql.Connection;

import com.java1212.model.User;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserDao 
{
	public User login(Connection con, User user)throws Exception
	{
		/**
		 * 登录验证
		 */
		User resultUser = null;  //返回的用户类
		String sql = "select * from t_user where userName = ? and passWord = ? ;"; //sql语句
		PreparedStatement prep = con.prepareStatement(sql);  //预处理sql语句
		prep.setString(1, user.getUserName());  //用户名
		prep.setString(2, user.getPassWord());  //密码
		ResultSet resultSet =  prep.executeQuery();   //返回一个结果集
		if(resultSet.next())
		{
			resultUser = new User();
			resultUser.setUserId(resultSet.getInt("id")); //获取id
			resultUser.setUserName(user.getUserName());  //设置用户名
			resultUser.setPassWord(user.getPassWord());  //设置密码
		}
		return resultUser;
	}
}

然后创建 视图层,用的是WindowBuilder插件。

实现了登录窗口界面:

1.界面上有显示"图书管理系统“”提示和图书图标。
2.窗口标题是“管理员登录”。
3.有用户名和密码标签。
4.有输入用户名和密码的文本框。
5.有登录按钮和重置按钮。

实现了登录界面的响应:
1.没输入用户名会提示“没输入用户名”。
2.没输密码会提示“没输入密码”。
3.点击重置按钮会清空所以输入的字符。
4.点击登录如果用户名密码不正确会提示“用户名或密码错误”,正确则登录。

效果:
在这里插入图片描述


19.07.11 第二更

创建主界面,增加一些菜单,按钮,主要要用WindowBuilder实现

关于窗口最大化WiindowBuilder插件并没有设置,需要手动设置一下,在代码最后面加上:

this.setExtendedState(JFrame.MAXIMIZED_BOTH);//设置JFrame最大化

设置在登录成功后,销毁登录窗口,然后显示主窗口

dispose()  //销毁窗口
new MainJFrame().setVisible(true); //默认不可见,设置为可见

设置一下登录窗口居中,将其放在构造方法的最后面

this.setLocationRelativeTo(null);  //设置为空,即居中

实现了主界面:

1.增加了菜单栏,中有基本数据维护 和 关于我们 两个一级菜单
2.基本数据维护中有 图书类别管理 和 图书管理 两个二级菜单和关闭系统 一个菜单项
3.图书类别管理中有 图书类别添加 和图书类别维护两个菜单项
4.图书管理中有 图书添加 和 图书维护 两个菜单项
5.关于我们中有 关于开发者 一个菜单项

实现主界面的响应:
1.点击 关闭系统 菜单项后弹出提示,是否关闭,点击是会关闭系统
2.点击 关于开发者 会弹出我的logo

运行一下:
在这里插入图片描述


19.07.11 第三更

了解几个关于文本域的方法

方法说明
bookTypeDescTxt.setBorder(new LineBorder(new java.awt.Color(127,157,185), 1, false));设置边框
textArea_1.setLineWrap(true);激活自动换行功能
textArea_1.setWrapStyleWord(true);激活断行不断字功能

创建BookType类,图书类型实体

package com.java1212.model;

/**
 * 图书类型实体
 * @author Administrator
 *
 */
public class BookType 
{
	private int id ; //编号
	private String bookTypeName ;  //图书类型名称
	private String bookTypeDiscribe;  //图书类型描述
	
	//构造方法
	public BookType(String bookTypeName, String bookTypeDiscribe) {
		super();
		this.bookTypeName = bookTypeName;
		this.bookTypeDiscribe = bookTypeDiscribe;
	}
	//属性的get set 方法
	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 getBookTypeDiscribe() {
		return bookTypeDiscribe;
	}
	public void setBookTypeDiscribe(String bookTypeDiscribe) {
		this.bookTypeDiscribe = bookTypeDiscribe;
	}
}

创建BookTypeDao类, BookType类需要连接数据库的操作

package com.java1212.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;

import com.java1212.model.BookType;

/**
 * 
 * @author Administrator
 *return 的是操作的记录数
 */
public class BookTypeDao
{
	public int addBookType(Connection con, BookType bookType)throws Exception
	{
		String sql = "insert into t_bookType values(null,?,?)";
		PreparedStatement prep = con.prepareStatement(sql);
		prep.setString(1, bookType.getBookTypeName());  //赋值,图书类型
		prep.setString(2, bookType.getBookTypeDiscribe());  //设置描述
		int result = prep.executeUpdate();  //执行
		return result;  //返回的是操作数,
	}
}

然后是实 现图书类别添加 窗口界面 主要用WindowBuilder实现

1.有图书类别添加标签,图书类别描述标签
2.增添按钮和重置按钮
3.输入图书类别的文本框
4.输入图书类别描述的文本域

下面有一个设置文本域(框)边框的方法,需要了解一下

TextArea.setBorder(new LineBorder(new java.awt.Color(127,157,185), 1, false));

实现的响应:
1.点击增加按钮,如果没有输入图书类别会提示“图书类别为空”,图书描述可以为空
2.如果输入图书类别不为空,则会提示添加成功
3.点击重置按钮会清除所有已经写入的内容

运行:
在这里插入图片描述


19.7.11 第四更

连接数据库层中的BookTypeDao类中添加一个list方法,该方法通过传入BookType类对象,返回该对象的图书类型名有关的结果集

public ResultSet list(Connection con, BookType bookType)throws Exception
{
	StringBuffer sb = new StringBuffer("select * from t_booktype");
	if(DbString.isNotEmpty(bookType.getBookTypeName()))
	{
		sb.append(" and bookType like '%"+ bookType.getBookTypeName()+ "%' ");
	}
	PreparedStatement prep = con.prepareStatement(sb.toString().replaceFirst("and", "where"));  //预处理
	ResultSet ret = null;
	ret = prep.executeQuery();
	return ret;
}

在使用ResultSet类时,出现了Illegal operation on empty result set的错误,查询后总结如下:

出现错误(2)
错误原因分析:

ResultSet 是个结果集。不能直接取记录的信息,比如:rs.getString("name");
需要循环历遍的,哪怕结果集返回的只有一条记录。

Statement stmt = conn.createStatement();            
ResultSet   rs=stmt.executeQuery("select * from register where name='cai'");
while(rs.next()){      //这里必须循环遍历
String passwd = rs.getString("psw");//返回一条记录
System.out.println(passwd );
}

关于高级组件(Table类)的一些方法

DefaultTableModel Table.getModel();  //获取模型
void Table.setRowCount(int n);  //设置表格行数,为0表示清空

创建了 图书类型查询 窗口:
1.有图书类型名称标签和一个文本框
2.有查询按钮
3.在滚动窗口中添加有表格组件(Table)

实现的响应:
1.在文本框输入图书类型名(可以模糊查询),点击查询按钮,可以在表格中显示所有的有关信息


19.7.12 第五更

这几更将 最结果写在前面

继续构建 图书类别管理 窗口:
1.增加了表单操作面板,有编号,图书类别名称,描述,和对应文本框和文本域
2.修改和删除按钮

实现的响应:
1.通过选择查询到的记录,进行图书类别名称和描述修改,编号无法修改
2.点击修改按钮会保存修改内容,将表格界面刷新,表单面板重置清零。
3.点击删除按钮可以删除选中的记录,会提示是否删除,没有选中的会提示没有选中。

在BookTypeDao类中,增加了两个方法, delete方法用于删除中的操作, upDate用于修改中的操作

public int delete(Connection con, int id)throws Exception
{
	String sql = "delete from t_bookType where id = ? ";
	PreparedStatement prep = con.prepareStatement(sql);  //预编译
	prep.setInt(1, id);  //设置值
	return prep.executeUpdate();   //执行更新
}

public int upDate(Connection con, BookType bookType)throws Exception
{
	String sql = "update t_bookType set bookType = ?, bookTypeDiscribe = ? where id = ? ";
	PreparedStatement prep = con.prepareStatement(sql);  //预编译
	prep.setString(1, bookType.getBookTypeName());
	prep.setString(2, bookType.getBookTypeDiscribe());
	prep.setInt(3, bookType.getId());
	return prep.executeUpdate();   //执行更新
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值