运行效果:
注册登陆界面
注册存在的账户时
登陆之后主界面如下
点击图书管理-图书更新界面如下
图书列表
项目说明:
由于平时工作比较忙,也没时间写,可是我在公众号后台看见好多小伙伴讨论,我就抽时间写个当作参考。本系统界面我个人就从简设计了,本来打算使用windowbuilder插件设计的,可想到使用windowbuilder插件之后导致代码冗余,会影响到代码可读性,可能对小白不友好。虽然界面设计简单,但是功能上我会尽量想着写全,当然对于页面你可以增加自己的设计,比如增加一个背景图片等,网上都有指导,对于界面美观度从简了。
关键代码:
用户登陆package bookmanage.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import bookmanage.model.User;import bookmanage.utils.DbUtil;/**
* @Description 连接数据库工具类
* @author com.javayihao.top
*/public class UserDao {/**
* 根据用户账号查询用户
*
* @param accout
* 入参:用户账号
* @return 查找的用户
*/public User getUserByAccout(String accout) {
Connection connection = DbUtil.getConnection();
String sql = "select accout,pass from t_user where accout=?";try {
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, accout);
ResultSet rs = ps.executeQuery();if (rs.next()) {// 存在用户,封装用户返回
User user = new User(rs.getString("accout"), rs.getString("pass"));
DbUtil.close(connection, ps);// 关闭连接return user;
}
} catch (SQLException e) {
e.printStackTrace();
}return null;
}public boolean insertUser(User user) {
Connection connection = DbUtil.getConnection();// 获得数据库连接对象
String sql = "insert into t_user(accout,pass)values(?,?)";try {
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, user.getAccout());
ps.setString(2, user.getPass());if (!ps.execute()) {// 成功
DbUtil.close(connection, ps);// 关闭连接return true;
}
} catch (SQLException e) {
e.printStackTrace();
}return false;// 失败
}
}
图书更新package bookmanage.view;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import bookmanage.dao.BookDao;import bookmanage.model.Book;/**
* @Description 用于图书增删改查面板
* @author com.javayihao.top
*/public class CrudBookPanel extends JPanel implements ActionListener {// 定义首页按钮、图书列表按钮、 其他功能按钮,增加图书、删除图书、修改图书、查询图书private JButton addBtn, deleteBtn, updateBtn, findBtn;// 定义标签 底部信息标签、 图书编号、 图书名称、 图书数量、 图书价格private JLabel idLabel, nameLabel, numLabel, priceLabel;// 定义图书编号、 名称、 数量、 价格文本框private JTextField idJTextField, nameJTextField, numJTextField, priceJTextField;// 定义文本对象private String bookIdText;private String bookNameText;private String bookNumText;private String bookPriceText;// 图书数量和价格private Integer numBook;private Float priceBook;// 定义对象BookDaoprivate BookDao bookDao;public CrudBookPanel() {
bookDao = new BookDao();//实例化图书操作对象// 实例化增删改查按钮
addBtn = new JButton("增加图书");
addBtn.addActionListener(this);// 设置图书增加按钮监听
addBtn.setActionCommand("addbook");
deleteBtn = new JButton("删除图书");
deleteBtn.addActionListener(this);// 设置图书删除按钮监听
deleteBtn.setActionCommand("deletebook");
updateBtn = new JButton("修改图书");
updateBtn.addActionListener(this);// 设置图书修改按钮监听
updateBtn.setActionCommand("updatebook");
findBtn = new JButton("查询图书");
findBtn.addActionListener(this);// 设置图书查询按钮监听
findBtn.setActionCommand("findbook");// 实例化图书编号 名称 数量 价格标签
idLabel = new JLabel("图书编号");
nameLabel = new JLabel("图书名称");
priceLabel = new JLabel("图书价格");
numLabel = new JLabel("图书数量");// 实例化文本框
idJTextField = new JTextField(12);
nameJTextField = new JTextField(12);
numJTextField = new JTextField(12);
priceJTextField = new JTextField(12);this.setLayout(new GridLayout(6, 2, 2, 2));// 给增删改查面板添加图书编号 名称 数量 价格标签以及文本框this.add(idLabel);this.add(idJTextField);this.add(nameLabel);this.add(nameJTextField);this.add(priceLabel);this.add(priceJTextField);this.add(numLabel);this.add(numJTextField);// 给增删改查面板添加图书编号 名称 数量 价格按钮this.add(addBtn);this.add(deleteBtn);this.add(updateBtn);this.add(findBtn);
}@Overridepublic void actionPerformed(ActionEvent e) {if (e.getActionCommand().equals("addbook")) {// 添加图书
addbook();
} else if (e.getActionCommand().equals("deletebook")) {// 删除图书
deleteBook();
} else if (e.getActionCommand().equals("updatebook")) {// 修改图书
updateBook();
} else if (e.getActionCommand().equals("findbook")) {// 查询图书
findBook();
}
}/**
* 查询图书
*/private void findBook() {
bookIdText = idJTextField.getText().trim().toString();
Book book = bookDao.getBookById(bookIdText);if (bookIdText.equals("")) {
JOptionPane.showMessageDialog(this, "图书编号不能为空");
} else if (book != null) {// 当前输入的图书编号存在try {
nameJTextField.setText(book.getName());// 填充图书名称文本框
numJTextField.setText(book.getNum() + "");// 将数字类型转成字符串并填充文本框
priceJTextField.setText(book.getPrice() + "");// 将数字类型转成字符串并填充文本框
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "图书查询异常 请联系管理员");
}
} else {
JOptionPane.showMessageDialog(this, "图书不存在");
}
}/**
* 修改图书
*/private void updateBook() {
bookIdText = idJTextField.getText().trim().toString();
bookNameText = nameJTextField.getText().trim().toString();
bookNumText = numJTextField.getText().trim().toString();
bookPriceText = priceJTextField.getText().trim().toString();if (bookIdText.equals("")) {
JOptionPane.showMessageDialog(this, "图书编号不能为空");
} else if (bookNameText.equals("")) {
JOptionPane.showMessageDialog(this, "图书名称不能为空");
} else if (bookNumText.equals("")) {
JOptionPane.showMessageDialog(this, "图书数量不能为空");
} else if (bookPriceText.equals("")) {
JOptionPane.showMessageDialog(this, "图书价格不能为空");
} else {// 将图书数量和图书价格转成对应的数字类型if (bookDao.getBookById(bookIdText) == null) {// 图书不存在
JOptionPane.showMessageDialog(this, "输入正确的图书编号");
} else {try {
numBook = Integer.parseInt(bookNumText);
priceBook = Float.parseFloat(bookPriceText);
bookDao.updateBook(new Book(bookIdText, bookNameText, numBook, priceBook));
JOptionPane.showMessageDialog(this, "图书修改成功");
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "输入正确的图书数量和价格");
e.printStackTrace();
}
}
}
}/**
* 删除图书
*/private void deleteBook() {
bookIdText = idJTextField.getText().trim().toString();if (bookIdText.equals("")) {
JOptionPane.showMessageDialog(this, "图书编号不能为空");
} else if (bookDao.getBookById(bookIdText) != null) {// 当前输入的图书编号是否存在try {
bookDao.deleteBootByid(bookIdText);
JOptionPane.showMessageDialog(this, "图书删除成功");
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "图书删除异常 请联系管理员");
}
} else {
JOptionPane.showMessageDialog(this, "图书不存在");
}
}/**
* 增加图书
*/private void addbook() {
bookIdText = idJTextField.getText().trim().toString();
bookNameText = nameJTextField.getText().trim().toString();
bookNumText = numJTextField.getText().trim().toString();
bookPriceText = priceJTextField.getText().trim().toString();if (bookIdText.equals("")) {
JOptionPane.showMessageDialog(this, "图书编号不能为空");
} else if (bookNameText.equals("")) {
JOptionPane.showMessageDialog(this, "图书名称不能为空");
} else if (bookNumText.equals("")) {
JOptionPane.showMessageDialog(this, "图书数量不能为空");
} else if (bookPriceText.equals("")) {
JOptionPane.showMessageDialog(this, "图书价格不能为空");
} else {// 将图书数量和图书价格转成对应的数字类型if (bookDao.getBookById(bookIdText) != null) {// 编号重复
JOptionPane.showMessageDialog(this, "图书编号重复");
} else {try {
numBook = Integer.parseInt(bookNumText);
priceBook = Float.parseFloat(bookPriceText);
bookDao.insertBoot(new Book(bookIdText, bookNameText, numBook, priceBook));
JOptionPane.showMessageDialog(this, "图书增加成功");
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "输入正确的图书数量和价格");
e.printStackTrace();
}
}
}
}
}
图书列表package bookmanage.view;import java.awt.BorderLayout;import java.util.ArrayList;import java.util.Vector;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import bookmanage.dao.BookDao;import bookmanage.model.Book;/**
* 自定义图书列表面板
* @author com.javayihao.top
*/public class ListPanel extends JPanel {// 从数据库中取出信息// rowData用来存放行数据// columnNames存放列名
Vector rowData, columnNames;
JTable jt = null;
JScrollPane jsp = null;// 构造函数public ListPanel() {
ArrayList books = new BookDao().getBookList();
columnNames = new Vector();// 设置列名
columnNames.add("图书编号");
columnNames.add("图书名称");
columnNames.add("图书价格");
columnNames.add("图书数量");
rowData = new Vector();for (int i = 0; i < books.size(); i++) {//实例化每一行数据
Vector hang = new Vector();
hang.add(books.get(i).getId());
hang.add(books.get(i).getName());
hang.add(books.get(i).getPrice());
hang.add(books.get(i).getNum());// 加入到rowData
rowData.add(hang);
}// 初始化Jtable
jt = new JTable(rowData, columnNames);// 初始化 jsp
jsp = new JScrollPane(jt);this.add(jsp);
}
}
数据库/*
Navicat MySQL Data Transfer
Source Server : localhost
Source Server Version : 50527
Source Host : localhost:3306
Source Database : db_book
Target Server Type : MYSQL
Target Server Version : 50527
File Encoding : 65001
Date: 2019-12-23 13:01:43
*/SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for t_book-- ----------------------------DROP TABLE IF EXISTS `t_book`;CREATE TABLE `t_book` ( `id` varchar(20) NOT NULL, `name` varchar(255) NOT NULL, `num` int(11) NOT NULL, `price` float(10,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of t_book-- ----------------------------INSERT INTO `t_book` VALUES ('123456', 'java入门到精通', '100', '22.00');INSERT INTO `t_book` VALUES ('123457', 'c++实战', '100', '50.00');INSERT INTO `t_book` VALUES ('123458', '微服务电商实战', '22', '1.00');-- ------------------------------ Table structure for t_user-- ----------------------------DROP TABLE IF EXISTS `t_user`;CREATE TABLE `t_user` ( `accout` varchar(255) NOT NULL, `pass` varchar(255) NOT NULL,
PRIMARY KEY (`accout`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of t_user-- ----------------------------INSERT INTO `t_user` VALUES ('123', '123');INSERT INTO `t_user` VALUES ('123456', '123456');INSERT INTO `t_user` VALUES ('1234567', '123456');INSERT INTO `t_user` VALUES ('admin', 'admin');INSERT INTO `t_user` VALUES ('dsfasdfa', 'afasdf');INSERT INTO `t_user` VALUES ('fdsaf', 'adfas');
源码获取:
本来打算放在github上的,考虑到许多小伙伴不会用github,就放在我个人公众号,关注公众号java一号 回复 “图书” 即可
如何运行:
1. 先说下运行环境吧,java+eclipse+mysql,所以首先java环境得有,本地安装了mysql数据库,关于数据库图形化界面工具我用得是navicat;
2. 创建数据库db_book,在获取代码文件中有个db_book.sql文件,记事本打开复制到刚才创建得db_book数据库直接查询运行即可
3. 打开eclipse
点击运行
友情提示
项目主要是用来练习java的面向对象思想,至于java中的swing编程知识,也就是界面编程建议不要花过多时间美化设计,完全没有必要,市场上很少会使用java Swing去编cs软件。