
本项目为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;
import java.sql.Connection;
import java.sql.SQLException;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
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 javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import cn.ac.azure.dao.UserDao;
import cn.ac.azure.model.User;
import cn.ac.azure.util.DBTool;
public class LoginFrame extends JFrame {
static {
try {
// 这里是皮肤包可以随意切换
// javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.mcwin.McWinLookAndFeel");
javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.smart.SmartLookAndFeel");
// javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.luna.LunaLookAndFeel");
// javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel");
// javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.bernstein.BernsteinLookAndFeel");
// javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.hifi.HiFiLookAndFeel");
// javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.aero.AeroLookAndFeel");
// javax.swing.UIManager.setLookAndFeel("com.jtattoo.plaf.mint.MintLookAndFeel");
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
| UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
}
private JPanel contentPane;
private JTextField usernameText;
private JPasswordField passwordText;
private JButton loginBtn;
private JButton resetBtn;
/** * Launch the application. */
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
LoginFrame frame = new LoginFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/** * Create the frame. */
public LoginFrame() {
//改变系统默认字体
Font font = new Font("Dialog", Font.PLAIN, 12);
java.util.Enumeration