JAVA FX+MySQL图书管理系统(内含部分重要代码)

前言

本篇文章主要讲述孤立系统设计思路并提供部分重要代码。关键代码可参考本篇文章。

(本系统应用到的图形化界面涉及到SceneBuilder相关知识,后续会陆续发布)

一、功能介绍

1.ER图

2.读者登录页面

3.读者注册页面

4.读者操作页面

5.管理员登录页面

6.管理员操作页面

7.增、删、改(借书、还书)功能页面

增加、删除、借书、还书类似。

8、登录成功(失败)弹出小窗口页面

二、功能分解

1.界面展示

public class Main extends Application {
    public static Stage primaryStage;

        @Override
        public void start(Stage PrimaryStage) throws Exception{
            primaryStage=PrimaryStage;
            Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("../page/Text.fxml")));
            primaryStage.setTitle("图书管理系统");
            primaryStage.setScene(new Scene(root, 659, 462));
            primaryStage.show();
        }
    public static void main(String[] args) {
        launch(args);
    }

}

2.点击按钮切换页面

这个功能运用了控制类,JavaFX项目在刚开始创建时有两个类,一个是FXML文件,一个是相对应的Controller控制类,Controller控制类处理用于控制FXML文件中的UI元素和处理逻辑。

在Controller类中创建按钮点击时调用的FXML页面来实现不同场景转换,代码如下:

public void addBookBackClicked(ActionEvent event) {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("../page/manageBook.fxml"));
        Parent managePage = loader.load();

        if (managePage != null) {
            System.out.println(addBookBack);
            Stage stage = (Stage) addBookBack.getScene().getWindow();

            Scene scene = new Scene(managePage);
            stage.setScene(scene);
            stage.show();
        } else {
            System.out.println("Failed");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

代码第四行引号里面是页面地址。

3.登陆注册

登陆注册页面:

登录注册实现需要连接数据库,一下是连接数据库的代码(涉及到JDBC相关知识):

package mysqldata;

import java.sql.*;

public class DbUtil {
    private static Connection conn;
    private static ResultSet rs;

    private static PreparedStatement ps;
    public final static String driver="com.mysql.cj.jdbc.Driver";
     public final static String url = "jdbc:mysql://localhost:3306/123?autoReconnection=true&characterEncoding=utf-8";
    public final static String passWord = "123456";
    public final static String userName = "root";

    //static 静态代码块加载jdbc的驱动
    static {
        try {
           Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //连接mysql的连接对象
    public static Connection getConn(){
        try {
            return DriverManager.getConnection(url, userName, passWord);
        }catch(SQLException e){
            e.printStackTrace();
        }
        return null;
    }

    //关闭连接,保证MySQl资源的释放,能够充分使用资源
    public static void close(){
        try{
            if(rs!=null){
                rs.close();
            }
            if(ps!=null){
                ps.close();
            }
            if(conn!=null){
                conn.close();
            }
        }catch(SQLException e){
            e.printStackTrace();
        }
    }

    public static void setConn(Connection conn) {
        DbUtil.conn = conn;
    }

    public  ResultSet getDataFromDatabase(){
        try{
            Connection co = DriverManager.getConnection(url,userName,passWord);
            setConn(co);
            Statement stmt=conn.createStatement();
            //查询语句
            String sql="select name,author,type,number from book";
            rs=stmt.executeQuery(sql);
        }catch(SQLException e){
            e.printStackTrace();
        }
        return rs;
    }
}
以上包含整个连接数据库类的代码,可供参考。

4.表格控件按钮的绑定

第一步、在SceneBuilder中给按钮设置ID和触发事件(以add按钮举例)

第二步、在相应的控制类中添加事件点击事件

快捷方式添加按钮以及点击方式:光标点击放在上述图片红色方框内,键盘 Ctrl+Enter,二次按下Enter控制Ctrl不松,便可在相应的控制类中生成。

在上述方法中添加相应代码即可。

5.增删改

以添加按钮为例,添加页面

带有mysql语句的两个方法

String sql = "insert into book(name,author,type,number) values(?,?,?,1)";
try {
    Connection conn = DriverManager.getConnection(url, userName, passWord);
    PreparedStatement statement = conn.prepareStatement(sql);
    statement.setString(1, bookName);
    statement.setString(2, bookAuthor);
    statement.setString(3, bookType);
    int rowsInserted=statement.executeUpdate();
String sql="update book set number=number+1 where name=?";
Connection connection=DriverManager.getConnection(url,userName,passWord);
PreparedStatement preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1,bookName);

判断存在与否的方法

public boolean judgeHaveByName(String bookName) throws Exception {
    String sql = "select * from book where name=?";
    Connection connection=DriverManager.getConnection(url,userName,passWord);
    PreparedStatement preparedStatement=connection.prepareStatement(sql);
    preparedStatement.setString(1,bookName);
    if (preparedStatement.executeQuery().next()){
        return true;
    }else {
        return false;
    }
}

添加点击事件的方法

public void addBookSuccessClicked(ActionEvent event) throws Exception {
    String bookName=addBookName.getText();
    String bookAuthor=addBookAuthor.getText();
    String bookType=addBookType.getText();

    if(bookName.isEmpty() || bookAuthor.isEmpty() || bookType.isEmpty()) {
        tipFrame("请将相关信息填写完整");
    }else if (!judgeHaveByName(addBookName.getText())){
        if (addBook(bookName,bookAuthor,bookType)){
            tipFrame("已添加新的图书");
            System.out.println("该书已经存在");
        }
    }else if (judgeHaveByName(addBookName.getText())){
        if (addNum(addBookName.getText())){
            tipFrame("已添加"+addBookName.getText()+"的库存");
        }
    }
}

表格控件的绑定(以书名为例)

第一步、在SceneBuilder中添加文本ID

第二步,在相应的FXML文件所对应的控制类中引用对应组件,具体代码如下:

public TextField addBookName;//书名
public TextField addBookAuthor;//作者
public TextField addBookType;//类型

第三步,在点击事件中获取文本相应内容,具体代码如下:

public void addBookSuccessClicked(ActionEvent event) throws Exception {
    String bookName=addBookName.getText();
    String bookAuthor=addBookAuthor.getText();
    String bookType=addBookType.getText();}

6.模糊查询

带有mysql语句的代码如下:

String sql="SELECT * FROM book WHERE name LIKE ? OR author LIKE ?";
pds=con.prepareStatement(sql);
pds.setString(1, "%"+searchText + "%");
pds.setString(2, "%"+searchTextOne + "%");
rs=pds.executeQuery();
while(rs.next()){
    Book book=new Book();
    book.setType(rs.getString("type"));
    book.setNumber(rs.getInt("number"));
    book.setName(rs.getString("name"));
    book.setAuthor(rs.getString("author"));
    books.add(book);
}

获取文本

String searchText=searchBookName.getText().trim();
String searchTextOne=searchBookAuthor.getText().trim();

将数据与表格控件进行绑定

ObservableList<Book> observableList= FXCollections.observableList(books);
tableView.setItems(observableList);

三、总代码

采用了MVC对包进行分类,一个FXML页面对应一个Controller类,带有sql的方法写在控制器里。

1.系统分类展示:

2.页面类:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Accordion?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>

3.控制类:

增加图书控制类:

package resourse;

import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

图书展示控制类:

package resourse;

import com.test.model.Book;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import mysqldata.DbUtil;

import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;

删除图书控制类:

package resourse;

import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

import java.io.IOException;
import java.sql.*;

注册页面控制类:

package resourse;

import java.io.IOException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

后台管理图书控制类:

package resourse;

import com.test.model.Book;
import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import mysqldata.DbUtil;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;

搜索图书控制类:

package resourse;

import com.test.model.Book;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import mysqldata.DbUtil;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

修改图书控制类:

package resourse;

import javafx.event.ActionEvent;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

10.FXML文件

登录(注册类似):

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Accordion?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.PasswordField?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>

<Pane accessibleRole="TEXT" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="462.0" prefWidth="659.0" style="-fx-border-style: 1px; -fx-border-color: black;" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="resourse.TestController">
   <children>
      <ImageView fitHeight="462.0" fitWidth="659.0" layoutY="2.0" pickOnBounds="true" preserveRatio="true">
         <image>
            <Image url="@../imgs/bcImgs.png" />
         </image></ImageView>
      <Button fx:id="registerButton" layoutX="46.0" layoutY="325.0" mnemonicParsing="false" onAction="#registerButtonClicked" prefHeight="53.0" prefWidth="123.0" style="-fx-background-color: #74a5c6;" text="登录">
         <font>
            <Font size="24.0" />
         </font>
      </Button>
      <Button fx:id="loginButton" layoutX="482.0" layoutY="325.0" mnemonicParsing="false" onAction="#loginButtonClicked" prefHeight="53.0" prefWidth="123.0" style="-fx-background-color: #74a5c6; -fx-font-weight: 650;" text="注册">
         <font>
            <Font size="24.0" />
         </font>
      </Button>
      <TextField fx:id="userText" layoutX="148.0" layoutY="158.0" prefHeight="45.0" prefWidth="233.0" style="-fx-border-style: no-border;" styleClass="no-border">
         <font>
            <Font size="21.0" />
         </font></TextField>
      <PasswordField fx:id="password" layoutX="148.0" layoutY="238.0" prefHeight="45.0" prefWidth="233.0" style="-fx-border-radius: 50px;">
         <font>
            <Font size="21.0" />
         </font></PasswordField>
      <Label layoutX="207.0" layoutY="58.0" prefHeight="53.0" prefWidth="275.0" style="-fx-font-weight: 700;" text="欢迎来到本系统" textFill="#f86b19">
         <font>
            <Font size="37.0" />
         </font>
      </Label>
      <Accordion layoutX="68.0" layoutY="166.0" />
      <Label layoutX="412.0" layoutY="158.0" prefHeight="45.0" prefWidth="140.0" style="-fx-font-weight: 700;" text="学生账号" textFill="#1d0e03">
         <font>
            <Font size="32.0" />
         </font>
      </Label>
      <Label layoutX="449.0" layoutY="240.0" prefHeight="32.0" prefWidth="167.0" style="-fx-font-weight: 700;" text="密码" textFill="#2b1306">
         <font>
            <Font size="32.0" />
         </font>
      </Label>
      <Button fx:id="manageRegister" layoutX="264.0" layoutY="325.0" mnemonicParsing="false" onAction="#manageClicked" prefHeight="53.0" prefWidth="123.0" style="-fx-background-color: #74a5c6; -fx-font-weight: 650;" text="管理员">
         <font>
            <Font size="24.0" />
         </font>
      </Button>
   </children>
</Pane>

添加图书(修改、删除类似):

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<AnchorPane prefHeight="515.0" prefWidth="739.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="resourse.addBookController">
   <children>
      <Pane prefHeight="515.0" prefWidth="739.0" style="-fx-background-color: #d2c1b8;">
         <children>
            <Label layoutX="303.0" layoutY="55.0" prefHeight="46.0" prefWidth="155.0" style="-fx-font-weight: 700;" text="添加书籍" textFill="#e87720">
               <font>
                  <Font size="33.0" />
               </font>
            </Label>
            <Label layoutX="176.0" layoutY="150.0" prefHeight="46.0" prefWidth="106.0" style="-fx-font-weight: 700;" text="书名">
               <font>
                  <Font size="30.0" />
               </font>
            </Label>
            <Label layoutX="176.0" layoutY="235.0" prefHeight="46.0" prefWidth="106.0" style="-fx-font-weight: 700;" text="作者">
               <font>
                  <Font size="30.0" />
               </font>
            </Label>
            <Label layoutX="176.0" layoutY="318.0" prefHeight="46.0" prefWidth="106.0" style="-fx-font-weight: 700;" text="类型">
               <font>
                  <Font size="30.0" />
               </font>
            </Label>
            <TextField fx:id="addBookName" layoutX="340.0" layoutY="150.0" prefHeight="46.0" prefWidth="199.0">
               <font>
                  <Font size="21.0" />
               </font></TextField>
            <TextField fx:id="addBookAuthor" layoutX="340.0" layoutY="235.0" prefHeight="46.0" prefWidth="199.0">
               <font>
                  <Font size="21.0" />
               </font></TextField>
            <TextField fx:id="addBookType" layoutX="340.0" layoutY="318.0" prefHeight="46.0" prefWidth="199.0">
               <font>
                  <Font size="21.0" />
               </font></TextField>
            <Button fx:id="addBookSuccess" layoutX="502.0" layoutY="413.0" mnemonicParsing="false" onAction="#addBookSuccessClicked" prefHeight="12.0" prefWidth="99.0" style="-fx-background-color: #74a5c6;" text="添加">
               <font>
                  <Font size="22.0" />
               </font>
            </Button>
            <Button fx:id="addBookBack" layoutX="572.0" layoutY="39.0" mnemonicParsing="false" onAction="#addBookBackClicked" prefHeight="39.0" prefWidth="99.0" style="-fx-background-color: #74a5c6;" text="返回">
               <font>
                  <Font size="19.0" />
               </font>
            </Button>
         </children>
      </Pane>
   </children>
</AnchorPane>

搜索图书页面:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="520.0" prefWidth="741.0" style="-fx-background-color: #dccbc1;" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="resourse.searchBookController">
   <children>
      <Label layoutX="24.0" layoutY="80.0" prefHeight="42.0" prefWidth="95.0" text="书名">
         <font>
            <Font size="32.0" />
         </font>
      </Label>
      <Label layoutX="334.0" layoutY="83.0" prefHeight="42.0" prefWidth="95.0" text="作者">
         <font>
            <Font size="32.0" />
         </font>
      </Label>
      <TextField fx:id="searchBookName" layoutX="119.0" layoutY="83.0" prefHeight="42.0" prefWidth="190.0">
         <font>
            <Font size="20.0" />
         </font></TextField>
      <TextField fx:id="searchBookAuthor" layoutX="429.0" layoutY="83.0" prefHeight="42.0" prefWidth="190.0">
         <font>
            <Font size="20.0" />
         </font>
      </TextField>
      <TableView fx:id="tableView" layoutX="78.0" layoutY="160.0" prefHeight="315.0" prefWidth="585.0">
        <columns>
          <TableColumn fx:id="bookName" prefWidth="227.99994659423828" text="书名" />
          <TableColumn fx:id="bookAuthor" minWidth="0.0" prefWidth="167.3333740234375" text="作者" />
            <TableColumn fx:id="bookType" prefWidth="125.99996948242188" text="类型" />
            <TableColumn fx:id="bookNumber" prefWidth="64.66668701171875" text="库存" />
        </columns>
      </TableView>
      <Button fx:id="searchBookButton" layoutX="653.0" layoutY="90.0" mnemonicParsing="false" onAction="#searchBookButtonClicked" prefHeight="44.0" prefWidth="48.0" style="-fx-background-color: #fcb215;" text="搜">
         <font>
            <Font size="20.0" />
         </font>
      </Button>
      <Button fx:id="searchBack" layoutX="603.0" layoutY="24.0" mnemonicParsing="false" onAction="#searchBackClicked" prefHeight="44.0" prefWidth="85.0" style="-fx-background-color: #74a5c6;" text="返回">
         <font>
            <Font size="21.0" />
         </font>
      </Button>
   </children>
</AnchorPane>

管理图书页面:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="520.0" prefWidth="741.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="resourse.ManageBookController">
   <children>
      <Pane prefHeight="520.0" prefWidth="741.0" style="-fx-background-color: #d2c1b8;">
         <children>
            <Label layoutX="269.0" layoutY="31.0" prefHeight="53.0" prefWidth="171.0" style="-fx-font-weight: 700;" text="欢迎管理员" textFill="#dd7010">
               <font>
                  <Font size="32.0" />
               </font>
            </Label>
            <Button fx:id="manageBookBack" layoutX="622.0" layoutY="31.0" mnemonicParsing="false" onAction="#manageBookBackButton" prefHeight="37.0" prefWidth="85.0" style="-fx-background-color: #74a5c6;" text="返回">
               <font>
                  <Font size="19.0" />
               </font>
            </Button>
            <TableView fx:id="TableView" layoutX="85.0" layoutY="84.0" prefHeight="320.0" prefWidth="572.0">
              <columns>
                <TableColumn fx:id="manageBookName" prefWidth="206.00000762939453" text="书名" />
                <TableColumn fx:id="manageBookAuthor" prefWidth="168.0" text="作者" />
                  <TableColumn fx:id="manageBookType" prefWidth="122.66659545898438" text="类型" />
                  <TableColumn fx:id="manageBookNum" prefWidth="74.0" text="库存" />
              </columns>
            </TableView>
            <Button fx:id="addButton" layoutX="59.0" layoutY="439.0" mnemonicParsing="false" onAction="#addButtonClicked" prefHeight="45.0" prefWidth="96.0" style="-fx-background-color: #fcb215;" text="增加">
               <font>
                  <Font size="22.0" />
               </font>
            </Button>
            <Button fx:id="updateButton" layoutX="334.0" layoutY="439.0" mnemonicParsing="false" onAction="#updateButtonClicked" prefHeight="45.0" prefWidth="96.0" style="-fx-background-color: #fcb215;" text="修改">
               <font>
                  <Font size="22.0" />
               </font>
            </Button>
            <Button fx:id="deleteButton" layoutX="598.0" layoutY="439.0" mnemonicParsing="false" onAction="#deleteButtonClicked" prefHeight="45.0" prefWidth="96.0" style="-fx-background-color: #fcb215;" text="删除">
               <font>
                  <Font size="22.0" />
               </font>
            </Button>
         </children>
      </Pane>
   </children>
</AnchorPane>

以上就是图书管理系统的部分重要代码,还是有点小瑕疵的,欢迎大家来评论区留言探讨。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值