在上一节中完成了主界面的创建,那么在本节中将实现图书类别的添加功能,BookTypeAddPanel.java类文件在上一节中已经创建成功,那么直接在该文件内写代码即可。
由于从本节开始使用了数据库,所以需要导入链接数据库的jar包,并且数据库及表已经创建完成,只需要执行db_booksystem.sql中的SQL语句即可。
使用MySQL时需要注意:
当数据库准备好之后,还需要创建如下图几个类:
其中各个类的内容如下:
BookTypeBean.java
package bookManageSystem.bean;
public class BookTypeBean {
private int bookTypeId;
private String bookTypeName;
private String bookTypeDescription;
public BookTypeBean() {
}
public BookTypeBean(int bookTypeId, String bookTypeName, String bookTypeDescription) {
this.bookTypeId = bookTypeId;
this.bookTypeName = bookTypeName;
this.bookTypeDescription = bookTypeDescription;
}
public int getBookTypeId() {
return bookTypeId;
}
public void setBookTypeId(int bookTypeId) {
this.bookTypeId = bookTypeId;
}
public String getBookTypeName() {
return bookTypeName;
}
public void setBookTypeName(String bookTypeName) {
this.bookTypeName = bookTypeName;
}
public String getBookTypeDescription() {
return bookTypeDescription;
}
public void setBookTypeDescription(String bookTypeDescription) {
this.bookTypeDescription = bookTypeDescription;
}
}
实体类的属性是根据数据库对应表的列字段进行创建的。
BookTypeDao.java
package bookManageSystem.dao;
import java.sql.Connection;
import java.sql.Statement;
public class BookTypeDao {
/**
* 操作结果:根据SQL语句执行数据库的增删改操作
*
* @param sql SQL语句
* @return boolean 如果操作数据库成功返回true,否则返回false
*/
public boolean dataChange(String sql) {
Connection conn = null;
Statement stmt = null;
try {
//获得数据的连接
new JDBCUtils();
conn = JDBCUtils.getConnection();
//获得Statement对象
stmt = conn.createStatement();
//发送SQL语句并返回受影响行数
int num = stmt.executeUpdate(sql);
// 根据受影响行数判断是否操作成功
if (num > 0) {
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(stmt, conn);
}
return false;
}
}
JDBCUtils.java
package bookManageSystem.dao;
import java.sql.*;
/**
* 连接JDBC类
*/
public class JDBCUtils {
/**
* 加载驱动,并建立数据库连接
*
* @return 返回数据库连接
* @throws SQLException 抛出SQLException
* @throws ClassNotFoundException 抛出ClassNotFoundException
*/
public static Connection getConnection() throws SQLException, ClassNotFoundException {
// 设置数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 数据库链接URL及数据库名称
String url = "jdbc:mysql://localhost:3306/db_bookSystem";
// 登录账户名
String username = "root";
// 登录账户密码
String password = "admin";
// 创建连接
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
/**
* 关闭数据库连接,释放资源
*
* @param stmt Statement对象
* @param conn Connection对象
*/
public static void release(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
/**
* 关闭数据库连接,释放资源
*
* @param rs ResultSet对象
* @param stmt Statement对象
* @param conn Connection对象
*/
public static void release(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
release(stmt, conn);
}
}
操作数据库表的相关方法会在等会使用。
打开BookTypeAddPanel.java,然后将内容变成如下代码:
package bookManageSystem.view;
import bookManageSystem.dao.BookTypeDao;
import bookManageSystem.tools.ComponentTools;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class BookTypeAddPanel extends JPanel implements ActionListener {
private ComponentTools componentTools = new ComponentTools();
private Box totalVBox, funcationBox, typeNameBox, typeDescriptionBox, buttonBox;
private JLabel typeNameLabel, bookTypeAddFuncationLabel, typeDescriptionLabel;
private JTextArea typeDescriptionTextArea;
private JTextField typeNameTextField;
private JButton addButton, resetButton;
BookTypeAddPanel() {
// 为图书类型添加面板添加控件
this.add(this.createBookTypeAddBox());
// 设置按钮的图标
componentTools.setIcons(new JButton[]{addButton, resetButton}, new String[]{"src/bookManageSystem/images/add.png", "src/bookManageSystem/images/reset.png"});
// 为按钮注册事件监听器
}
/**
* 图书类型添加面板的控件内容
*
* @return 返回一个Box
*/
private Box createBookTypeAddBox() {
// 创建一个垂直容器盒子
totalVBox = Box.createVerticalBox();
// 创建一个水平容器盒子
funcationBox = Box.createHorizontalBox();
bookTypeAddFuncationLabel = new JLabel("图书类别添加功能");
bookTypeAddFuncationLabel.setFont(new Font("微软雅黑", Font.BOLD, 30));
funcationBox.add(bookTypeAddFuncationLabel);
totalVBox.add(funcationBox);
totalVBox.add(Box.createVerticalStrut(60));
typeNameBox = Box.createHorizontalBox();
typeNameLabel = new JLabel("图书类别名称:");
typeNameTextField = new JTextField(20);
typeNameBox.add(typeNameLabel);
typeNameBox.add(Box.createHorizontalStrut(50));
typeNameBox.add(typeNameTextField);
totalVBox.add(typeNameBox);
totalVBox.add(Box.createVerticalStrut(60));
typeDescriptionBox = Box.createHorizontalBox();
typeDescriptionLabel = new JLabel("图书类别描述:");
typeDescriptionTextArea = new JTextArea(10, 20);
typeDescriptionTextArea.setLineWrap(true);
typeDescriptionBox.add(typeDescriptionLabel);
typeDescriptionBox.add(Box.createHorizontalStrut(50));
typeDescriptionBox.add(typeDescriptionTextArea);
totalVBox.add(typeDescriptionBox);
totalVBox.add(Box.createVerticalStrut(60));
buttonBox = Box.createHorizontalBox();
addButton = new JButton("添加");
resetButton = new JButton("重置");
buttonBox.add(addButton);
buttonBox.add(Box.createHorizontalStrut(80));
buttonBox.add(resetButton);
totalVBox.add(buttonBox);
return totalVBox;
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
然后运行程序,成功登录后,点击“图书类别管理”下的“图书类别添加”菜单项,出现如下界面:
点击“添加”和“重置”按钮都不会有任何反应,因为这里还没有为其注册事件,为按钮注册事件的方式有几种,这里只是其中一种。
首先在BookTypeAddPanel()构造器方法内添加如下代码:
// 为按钮注册事件监听器
addButton.addActionListener(this);
resetButton.addActionListener(this);
具体位置如图:
然后就是实现actionPerformed方法了,先实现添加按钮的功能。
在actionPerformed方法内添加如下代码:
// 添加按钮的事件处理
if (e.getSource() == addButton) {
// 获取图书分类名称
String bookTypeName = typeNameTextField.getText();
// 获取图书分类描述
String bookTypeDescription = typeDescriptionTextArea.getText();
// 组装SQL语句
String sql =
"insert into tb_bookType (btName, btDescription) values ('" + bookTypeName + "','" + bookTypeDescription + "');";
// 执行方法插入一条书籍
boolean isOK = new BookTypeDao().dataChange(sql);
// 判断是否操作成功并作出相应的处理
if (isOK) {
JOptionPane.showMessageDialog(null, "添加成功!");
componentTools.reset(typeNameTextField, typeDescriptionTextArea);
} else {
JOptionPane.showMessageDialog(null, "添加失败!");
}
}
上面代码是对“添加”按钮的事件处理,接下来再次运行程序登录成功后切换到图书类别添加界面并点击“添加”按钮,会出现如下状况:
添加记录失败,并且控制台报错了,错误日志如图,分析日志可以得出是没有找到com.mysql.jdbc.Driver这个类,其实问题就是没有添加file文件夹下的jar加包。
以后遇到ClassNotFoundException这种没有找到类的异常,多半都是没有找到加包的问题。
那么接下来就是为本项目添加第三方加包了。
打开“Project Structure...”
然后选中“Libraries”选项卡
并找到jar加包
添加jar包成功
同理,其他项目添加第三方jar包也可以通过该种方式进行。
再次运行项目并点击“添加”按钮
这次就添加成功了,可以到数据库中查看添加的这一条记录:
接着就是实现重置功能,该功能的实现就是将界面中的文本框和文本域清空,代码还是在actionPerformed方法中添加如下:
// 重置按钮的事件处理
if (e.getSource() == resetButton) {
// 即清空输入框的内容
componentTools.reset(typeNameTextField, typeDescriptionTextArea);
}
可以运行项目查询效果。
本节所讲即完成了,下一节将说明如何实现图书类别的维护这个功能的实现。
可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。
注意:在公众号后台回复【20200201】可获取本节的源码。