Bootstrap

Java GUI,mybatis实现资产管理系统

Java GUI——资产管理系统

前言:为了做java课设,学了一手Java GUI。感觉蛮有意思的,写写文章,做个视频记录一下。欢迎大家友善指出我的不足

资产管理系统录制视频,从头敲到尾

模块划分

  • 资产信息管理
    • 资产信息查询 【各种条件查询】
    • 资产信息修改(不能对资产进行领用、归还、报废
    • 资产信息增加
    • 资产信息删除
  • 人员信息管理
    • 人员信息查询 【各种条件查询】
    • 人员信息修改
    • 人员信息增加
    • 人员信息删除
  • 资产设备领用、归还、报废
    • 资产设备操作(仅限于领用、归还、报废
    • 资产设备查询 【各种条件】

数据库创建

资产表

DROP TABLE IF EXISTS `asset_information`;
CREATE TABLE `asset_information`  (
  `asset_number` int NOT NULL AUTO_INCREMENT COMMENT '资产编号',
  `asset_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '资产名称',
  `price` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '价格',
  `purchase_date` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '购买日期',
  `status` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '状态 0-默认 1-领用 2-归还 3-报废',
  `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`asset_number`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1007 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_croatian_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of asset_information
-- ----------------------------
INSERT INTO `asset_information` VALUES (1000, '潇洒哥', '1000', '', '1', '');
INSERT INTO `asset_information` VALUES (1004, '潇洒哥', '10000', '2020-09-07 14:52:54', '0', '是个蛋');

资产操作流水表

DROP TABLE IF EXISTS `asset_operation_log`;
CREATE TABLE `asset_operation_log`  (
  `operation_number` int NOT NULL AUTO_INCREMENT COMMENT '操作编号',
  `operation_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '操作类型 0-默认 1-领用 2-归还 3-报废',
  `asset_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '资产编号',
  `operation_time` datetime NULL DEFAULT NULL COMMENT '操作时间',
  `recipient` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '操作人',
  `remarks` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`operation_number`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_croatian_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of asset_operation_log
-- ----------------------------
INSERT INTO `asset_operation_log` VALUES (5, '1', '1000', NULL, '1', '无');

人员信息表

DROP TABLE IF EXISTS `personnel_information`;
CREATE TABLE `personnel_information`  (
  `personnel_number` int NOT NULL AUTO_INCREMENT COMMENT '人员编号',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '姓名',
  `gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '性别',
  `department` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '部门',
  `position` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '职位',
  `other` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_croatian_ci NULL DEFAULT NULL COMMENT '其他信息',
  PRIMARY KEY (`personnel_number`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_croatian_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of personnel_information
-- ----------------------------
INSERT INTO `personnel_information` VALUES (1, '潇洒哥', '男', '羊村', '大哥', '是个蛋,白色的蛋蛋');
INSERT INTO `personnel_information` VALUES (2, '飞鸽', '男', '鸽子部门', '二弟', '飞哥不鸽');
INSERT INTO `personnel_information` VALUES (3, '老王', '女', '军乐团', '团长', '牛逼啊');

业务流程

在这里插入图片描述

资产被人员操作后,操作记录写入资产记录表。同时根据人员的操作修改资产本身的信息。

代码编写

maven坐标

    <dependencies>
        <!--Servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- Lombok 依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>
        <!--MyBatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--MySQL-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.2.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.0</version>
            </plugin>
        </plugins>
    </build>

本项目采用模块划编写。不同模块划分为不同的包,每个包下维护若干类,每个类表示一个UI界面。

模块一:主界面

1.1)创建主界面UI

用代码构建如下界面, 但不具备界面跳转等操作
在这里插入图片描述

在这里插入图片描述

package com.xhf.keshe;

import com.xhf.keshe.asset.AssetQuery;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main extends JFrame {
    /**
     * 窗体宽
     */
    public static final int width = 800;
    /**
     * 窗体高
     */
    public static final int height = 600;
    /**
     * 基本字体
     */
    public static final Font font = new Font("仿宋", Font.BOLD, 20);
    /**
     * 创建基本界面
     */
    private JPanel workspace;

    public Main() {
        // 创建窗体
        setTitle("资产管理系统");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(width, height);

        // 创建基本界面
        initBasePanel();

        // 居中
        setLocationRelativeTo(null);

        // 初始化界面
        initUI();
    }

    /**
     * 创建基本界面
     */
    private void initBasePanel() {
        this.workspace = new JPanel();
        workspace.setLayout(null);
        JLabel jLabel = new JLabel("欢迎使用资产管理系统", JLabel.CENTER);    //创建一个标签
        jLabel.setBounds(140, 100, 400, 60);
        jLabel.setFont(Main.font);
        workspace.add(jLabel, BorderLayout.NORTH);
        add(workspace);
    }

    /**
     * 初始化界面
     */
    private void initUI() {
        // 添加菜单栏组件
        JMenuBar jMenuBar = new JMenuBar();

        // 在菜单栏(bar)中添加若干菜单(menu)
        String[] jMenuNameList = {"资产信息管理", "人员信息管理", "资产设备管理"};
        for (int i = 0; i < 3; ++i) {
            // jMenu的名称
            String jMenuName = jMenuNameList[i];
            JMenu jMenu = new JMenu(jMenuName);
            // 为menu添加item
            addItemForJMenu(jMenu, jMenuName);
            // 设置字体
            jMenu.setFont(font);
            // 将jMenu添加到bar中
            jMenuBar.add(jMenu);
        }

        // 添加jMenuBar
        setJMenuBar(jMenuBar);
    }

    /**
     * 为不同名称的jMenu添加item
     * @param jMenu
     * @param jMenuName
     */
    private void addItemForJMenu(JMenu jMenu, String jMenuName) {
        String[] item1NameList = {"资产信息查询", "资产信息修改", "资产信息增加", "资产信息删除"};
        String[] item2NameList = {"人员信息查询", "人员信息修改", "人员信息增加", "人员信息删除"};
        String[] item3NameList = {"资产设备查询", "资产设备操作"};

        // 判断jMenu名称, 然后添加item
        switch (jMenuName) {
            case "资产信息管理":
                for (String s : item1NameList) {
                    addItem(s, jMenu);
                }
                break;
            case "人员信息管理":
                for (String s : item2NameList) {
                    addItem(s, jMenu);
                }
                break;
            case "资产设备管理":
                for (String s : item3NameList) {
                    addItem(s, jMenu);
                }
                break;
        }
    }

    /**
     * 创建jMenuItem, 同时取名name, 将item添加到menu中
     * @param name
     * @param jMenu
     */
    private void addItem(String name, JMenu jMenu) {
        JMenuItem item = new JMenuItem(name);
        item.setFont(font);
        jMenu.add(item);
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.setVisible(true);
    }
}

1.2)增加主界面的界面跳转逻辑

所有的界面跳转,都可以理解为以下几个操作

  1. 触发相应操作
  2. 清除当前界面
  3. 添加需要界面
  4. 界面重新渲染

分析可知,通过点击item,才触发界面跳转的操作。因此我们需要给不同的item上添加相应的监听器,用于执行界面跳转的逻辑

    /**
     * 创建jMenuItem, 同时取名name, 将item添加到menu中
     * @param name
     * @param jMenu
     */
    private void addItem(String name, JMenu jMenu) {
        JMenuItem item = new JMenuItem(name);
        // 为不同的item添加监听操作
        item.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 为不同的item添加不同的界面
                switch (name) {
                    case "资产信息查询":
                        // 清空当前界面
                        remove(workspace);
                        // 添加想要的界面
                        workspace = new AssetQuery();
                        add(workspace);
                        // 重新绘制界面
                        validate();
                        break;
                }
            }
        });
        item.setFont(font);
        jMenu.add(item);
    }

模块二: 资产界面

2.1)mybatis整合

学习资料

(44条消息) Mybatis基本使用教程(小白向)_敲代码它不香嘛的博客-CSDN博客

入门_MyBatis中文网

2.2.1) 编写mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/keshe1"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--后续编写的mapper.xml都需要添加到这里-->
        <mapper resource="mapper/assetInformationMapper.xml"/>
        <mapper resource="mapper/personnelInformationMapper.xml"/>
        <mapper resource="mapper/operateMapper.xml"/>
    </mappers>
</configuration>

如下图,编写mybatis-config.xml【核心配置文件】文件,放置在resources根目录

image-20230710155452363
2.2.2) 获取SqlSession

sqlsession是mybatis中的核心工具,有了它才有后续操作。sqlsession封装jdbc的数据库连接操作

package com.xhf.keshe.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class GetSqlsession {
    private static InputStream inputStream;

	//这个方法生成一个生产Sqlsession的工厂,即SqlSessionFactory
    public static SqlSessionFactory createfactory() {
		
        {
            try {
                inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过把这个工厂return出来,以便后续通过这个工厂获得SqlSession对象
        return sqlSessionFactory;
    }

	//这个方法获得SqlSession对象
    public static SqlSession getsqlsession(){
        return createfactory().openSession();
    }
}
2.2.3)编写实体类
package com.xhf.keshe.asset.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class AssetInformation implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 资产编号
     */
    private Integer assetNumber;

    /**
     * 资产名称
     */
    private String assetName;

    /**
     * 价格
     */
    private String price;

    /**
     * 购买日期
     */
    private String purchaseDate;

    /**
     * 状态 0-默认 1-领用 2-归还 3-报废
     */
    private String status;

    /**
     * 备注
     */
    private String remarks;
}
2.2.5) 编写mapper接口
package com.xhf.keshe.asset.mapper;

import com.xhf.keshe.asset.entity.AssetInformation;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface AssetInformationMapper {
    /**
     * 查询全部信息
     * @return
     */
    List<AssetInformation> list();
    /**
     * 根据id查询数据
     */
    AssetInformation listById(@Param("id") String id);
    /**
     * 修改
     */
    void update(@Param("entity") AssetInformation entity);
    /**
     * 新增数据
     */
    void insert(@Param("entity") AssetInformation entity);
    /**
     * 根据id删除数据
     */
    void deleteById(@Param("id") Integer id);
}

2.2.6)编写mapper的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xhf.keshe.asset.mapper.AssetInformationMapper">

    <resultMap id="BaseResultMap" type="com.xhf.keshe.asset.entity.AssetInformation" >
        <result column="asset_number" property="assetNumber" />
        <result column="asset_name" property="assetName" />
        <result column="price" property="price" />
        <result column="purchase_date" property="purchaseDate" />
        <result column="status" property="status" />
        <result column="remarks" property="remarks" />
    </resultMap>

    <insert id="insert" useGeneratedKeys="true" keyProperty="assetNumber">
        INSERT INTO
            asset_information
        VALUES (
            null,
            #{entity.assetName},
            #{entity.price},
            #{entity.purchaseDate},
            #{entity.status},
            #{entity.remarks}
            );
    </insert>
    <update id="update">
        UPDATE asset_information
        <set>
            <if test="entity.assetName != null"> asset_name = #{entity.assetName}, </if>
            <if test="entity.price != null"> price = #{entity.price}, </if>
            <if test="entity.purchaseDate != null"> purchase_date = #{entity.purchaseDate}, </if>
            <if test="entity.status"> status = #{entity.status}, </if>
            <if test="entity.remarks"> remarks = #{entity.remarks} </if>
        </set>
        WHERE
            asset_information.asset_number = #{entity.assetNumber}
    </update>
    <delete id="deleteById">
        DELETE FROM asset_information WHERE asset_information.asset_number = #{id};
    </delete>

    <select id="list" resultMap="BaseResultMap">
        SELECT * FROM asset_information;
    </select>
    <select id="listById" resultMap="BaseResultMap">
        SELECT * FROM asset_information WHERE asset_number = #{id};
    </select>

</mapper>
2.2)查询界面UI
package com.xhf.keshe.asset.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.asset.entity.AssetInformation;
import com.xhf.keshe.asset.mapper.AssetInformationMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.*;
import java.util.List;


/**
 * 维护资产信息查询界面
 */
public class AssetQuery extends JPanel {
    // 表格列名
    public static final String[] columnNames = {"资产编号", "资产名称", "价格", "购买日期", "状态", "备注"};
    /**
     * sqlsession
     */
    private SqlSession sqlSession;
    /**
     * mapper
     */
    private AssetInformationMapper mapper;

    {
        sqlSession = GetSqlsession.getsqlsession();
        mapper = sqlSession.getMapper(AssetInformationMapper.class);
    }

    public AssetQuery() {
        // 设置界面大小
        setSize(Main.width, Main.height);
        // 设置布局
        setLayout(new BorderLayout());
        // 设置标题
        JLabel title = new JLabel("资产查询");
        title.setFont(Main.TitleFont);
        // 设置标题为居中对其
        title.setHorizontalAlignment(SwingConstants.CENTER);
        this.add(title, BorderLayout.NORTH);

        // 创建表格数据
        Object[][] data = getData();

        // 创建 JTable
        JTable table = new JTable(data, columnNames);
        // 设置头的字体
        table.getTableHeader().setFont(Main.font);
        // 设置每行的高度
        table.setRowHeight(25);
        // 设置表内容字体
        table.setFont(Main.font);

        // 将表格添加到滚动面板,并将滚动面板添加到窗口
        JScrollPane scrollPane = new JScrollPane(table);
        this.add(scrollPane);
    }

    /**
     * 返回资产表格数据
     * @return
     */
    private Object[][] getData() {
        // 返回list数据
        List<AssetInformation> list = mapper.list();
        Object[][] data = new Object[list.size()][columnNames.length];
        // 将list处理为二维数组, 赋值给data
        for (int i = 0; i < list.size(); i++) {
            // 将list[i] -> assetInformation 变为数组
            Object[] res = new Object[columnNames.length];
            AssetInformation assetInformation = list.get(i);
            res[0] = assetInformation.getAssetNumber();
            res[1] = assetInformation.getAssetName();
            res[2] = assetInformation.getPrice();
            res[3] = assetInformation.getPurchaseDate();
            res[4] = assetInformation.getStatus();
            res[5] = assetInformation.getRemarks();
            data[i] = res;
        }
        return data;
    }
}
2.3)添加界面UI
package com.xhf.keshe.asset.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.asset.entity.AssetInformation;
import com.xhf.keshe.asset.mapper.AssetInformationMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

public class AssetAdd extends JPanel {
    /**
     * title宽度
     */
    public static final int widthTitle = 200, heightTitle = 40;
    /**
     * 标题x坐标
     */
    public static final int xTitle = Main.width / 2 - widthTitle / 2;
    /**
     * 标题y坐标
     */
    public static final int yTitle = Main.height / 10;
    /**
     * y轴间距
     */
    public static final int yGap = 40;
    /**
     * 存储所有的JTextField
     */
    private final List<JTextField> jTextFieldList = new ArrayList<JTextField>();
    /**
     * 获取mapper
     */
    private static AssetInformationMapper mapper;
    /**
     * 获取sqlSession
     */
    private static SqlSession sqlSession;

    {
        sqlSession = GetSqlsession.getsqlsession();
        mapper = sqlSession.getMapper(AssetInformationMapper.class);
    }

    /**
     * 提交button
     */
    private final JButton jButton = new JButton("添加");

    public AssetAdd() {
        setLayout(null);
        // 设置title坐标
        JLabel title = new JLabel("添加资产信息");
        title.setFont(Main.TitleFont);
        title.setBounds(xTitle, yTitle, widthTitle, heightTitle);

        // 通过title坐标, 计算剩余组件坐标, 并添加
        int widthLabel = 100, heightLabel = 30, xLabel = xTitle / 2, yLabel = yTitle + yGap + heightLabel, xGap = 80;
        int xText = xLabel + widthLabel + xGap, yText = yLabel, widthText = 300, heightText = 30;

        for (int i = 0; i < AssetQuery.columnNames.length - 1; ++i) {
            // 创建JLabel
            JLabel jLabel = new JLabel(AssetQuery.columnNames[i + 1]);
            jLabel.setFont(Main.font);
            jLabel.setBounds(xLabel, yLabel, widthLabel, heightLabel);
            // 创建JTextField
            JTextField jTextField = new JTextField();
            jTextField.setFont(Main.font);
            jTextField.setBounds(xText, yText, widthText, heightText);
            // 添加
            add(jLabel);
            add(jTextField);
            // 将所有jTextField存储
            jTextFieldList.add(jTextField);
            // 更新位置
            yLabel += yGap;
            yText += yGap;
        }
        // 添加修改button
        jButton.setFont(Main.font);
        jButton.setBounds(xTitle, yText + yGap, widthTitle, heightTitle);
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 提交数据
                save();
            }
        });

        add(title);
        add(jButton);
    }

    /**
     * 提交数据
     */
    private void save() {
        System.out.println("保存数据");
        AssetInformation entity = new AssetInformation();
        entity.setAssetName(jTextFieldList.get(0).getText());
        entity.setPrice(jTextFieldList.get(1).getText());
        entity.setPurchaseDate(jTextFieldList.get(2).getText());
        entity.setStatus(jTextFieldList.get(3).getText());
        entity.setRemarks(jTextFieldList.get(4).getText());
        // 保存数据
        mapper.insert(entity);
        // 事务提交
        sqlSession.commit();
        JOptionPane.showMessageDialog(null, "添加成功");
    }
}

2.4)修改界面UI
package com.xhf.keshe.asset.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.asset.entity.AssetInformation;
import com.xhf.keshe.asset.mapper.AssetInformationMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

public class AssetUpdate extends JPanel {
    /**
     * title宽度
     */
    private static final int widthTitle = 200, heightTitle = 40;
    /**
     * 标题x坐标
     */
    private static final int xTitle = Main.width / 2 - widthTitle / 2;
    /**
     * 标题y坐标
     */
    private static final int yTitle = Main.height / 10;
    /**
     * y轴间距
     */
    private static final int yGap = 40;
    /**
     * 存储所有的JTextField
     */
    private final List<JTextField> jTextFieldList = new ArrayList<JTextField>();
    /**
     * sqlsession
     */
    private SqlSession sqlSession;
    /**
     * 获取mapper
     */
    private AssetInformationMapper mapper;

    {
        sqlSession = GetSqlsession.getsqlsession();
        mapper = sqlSession.getMapper(AssetInformationMapper.class);
    }

    /**
     * 提交button
     */
    private final JButton jButton = new JButton("修改");

    public AssetUpdate() {
        setLayout(null);
        // 设置title坐标
        JLabel title = new JLabel("修改资产信息");
        title.setFont(Main.TitleFont);
        title.setBounds(xTitle, yTitle, widthTitle, heightTitle);

        // 通过title坐标, 计算剩余组件坐标, 并添加
        int widthLabel = 100, heightLabel = 30, xLabel = xTitle / 2, yLabel = yTitle + yGap + heightLabel, xGap = 80;
        int xText = xLabel + widthLabel + xGap, yText = yLabel, widthText = 300, heightText = 30;

        for (int i = 0; i < AssetQuery.columnNames.length; ++i) {
            // 创建JLabel
            JLabel jLabel = new JLabel(AssetQuery.columnNames[i]);
            jLabel.setFont(Main.font);
            jLabel.setBounds(xLabel, yLabel, widthLabel, heightLabel);
            // 创建JTextField
            JTextField jTextField = new JTextField();
            jTextField.setFont(Main.font);
            jTextField.setBounds(xText, yText, widthText, heightText);
            // 添加
            add(jLabel);
            add(jTextField);
            // 将所有jTextField存储
            jTextFieldList.add(jTextField);

            if (i == 0) {
                System.out.println("添加button");
                // 添加查询按钮
                JButton jButton = new JButton("查询");
                jButton.setFont(Main.font);
                jButton.setBounds(xText + widthText + 10, yText, 80, heightText);
                jButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // 查询数据
                        getData();
                        // 重置文本框读写状态
                        setField();
                    }
                });
                add(jButton);
            } else {
                // 设置所有的都无法修改
                jTextField.setEnabled(false);
            }
            // 更新位置
            yLabel += yGap;
            yText += yGap;
        }
        // 添加修改button
        jButton.setEnabled(false);
        jButton.setFont(Main.font);
        jButton.setBounds(xTitle, yText + yGap, widthTitle, heightTitle);
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 提交数据
                upload();
            }
        });

        add(title);
        add(jButton);
    }

    /**
     * 重置textField的写状态
     */
    private void setField() {
        // 除了状态, 其它都可修改
        for (int i1 = 0; i1 < jTextFieldList.size(); i1++) {
            if (i1 != 4) {
                jTextFieldList.get(i1).setEnabled(true);
            }
        }
    }

    /**
     * 根据id查询数据信息, 并进行回显
     */
    private void getData() {
        // 根据jTextField中的id查询数据, 并进行数据回显
        String id = jTextFieldList.get(0).getText();
        AssetInformation assetInformation = mapper.listById(id);
        // 查不到
        if (assetInformation == null) {
            JOptionPane.showMessageDialog(null, "查询失败");
            return;
        }
        // 修改按钮功能重新开启
        jButton.setEnabled(true);
        // 数据回显
        jTextFieldList.get(0).setText(String.valueOf(assetInformation.getAssetNumber()));
        jTextFieldList.get(1).setText(assetInformation.getAssetName());
        jTextFieldList.get(2).setText(assetInformation.getPrice());
        jTextFieldList.get(3).setText(assetInformation.getPurchaseDate());
        jTextFieldList.get(4).setText(assetInformation.getStatus());
        jTextFieldList.get(5).setText(assetInformation.getRemarks());
    }

    /**
     * 提交数据
     */
    private void upload() {
        AssetInformation entity = new AssetInformation();
        entity.setAssetNumber(Integer.valueOf(jTextFieldList.get(0).getText()));
        entity.setAssetName(jTextFieldList.get(1).getText());
        entity.setPrice(jTextFieldList.get(2).getText());
        entity.setPurchaseDate(jTextFieldList.get(3).getText());
        entity.setStatus(jTextFieldList.get(4).getText());
        entity.setRemarks(jTextFieldList.get(5).getText());
        // 保存数据
        mapper.update(entity);
        sqlSession.commit();
        JOptionPane.showMessageDialog(null, "修改成功");
    }
}

2.5)删除界面UI
package com.xhf.keshe.asset.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.asset.mapper.AssetInformationMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class AssetDelete extends JPanel {
    /**
     * sqlsession
     */
    private static SqlSession sqlSession;
    /**
     * mapper
     */
    private static AssetInformationMapper assetInformationMapper;

    {
        sqlSession = GetSqlsession.getsqlsession();
        assetInformationMapper = sqlSession.getMapper(AssetInformationMapper.class);
    }

    public AssetDelete() {
        setLayout(null);
        // 设置标题
        JLabel title = new JLabel("资产信息删除");
        title.setFont(Main.TitleFont);
        title.setBounds(AssetAdd.xTitle, AssetAdd.yTitle, AssetAdd.widthTitle, AssetAdd.heightTitle);
        add(title);

        // jLabel设置坐标
        int widthLabel = 100, heightLabel = 30, xLabel = AssetAdd.xTitle / 2, yLabel = AssetAdd.yTitle + AssetAdd.yGap + heightLabel, xGap = 80;
        JLabel jLabel = new JLabel("资产编号");
        jLabel.setFont(Main.font);
        jLabel.setBounds(xLabel, yLabel, widthLabel, heightLabel);

        // 设置JCombox
        int xText = xLabel + widthLabel + xGap, yText = yLabel, widthText = 300, heightText = 30;
        JComboBox jComboBox = new JComboBox();
        jComboBox.setFont(Main.font);
        jComboBox.setBounds(xText, yText, widthText, heightText);
        jComboBox.addItem("请选择");
        // 查询所有的id, 并添加到JComboBox中
        assetInformationMapper.list().forEach(e -> {
            jComboBox.addItem(e.getAssetNumber());
        });

        add(jLabel);
        add(jComboBox);

        // 删除按钮
        JButton jButton = new JButton("删除");
        jButton.setFont(Main.font);
        jButton.setBounds(AssetAdd.xTitle, AssetAdd.yTitle + 120, AssetAdd.widthTitle, AssetAdd.heightTitle);
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Object id = jComboBox.getSelectedItem();
                assetInformationMapper.deleteById((Integer) id);
                sqlSession.commit();
                JOptionPane.showMessageDialog(null, "删除成功");
            }
        });
        add(jButton);
    }
}

模块三:人员界面

3.1)mybatis整合
3.1.1)编写实体类
package com.xhf.keshe.person.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PersonnelInformation implements Serializable {

    private static final long serialVersionUID = 1L;
    /**
    * 人员编号
    */
    private Integer personnelNumber;

    /**
    * 姓名
    */
    private String name;

    /**
    * 性别
    */
    private String gender;

    /**
    * 部门
    */
    private String department;

    /**
    * 职位
    */
    private String position;

    /**
    * 其他信息
    */
    private String other;
}
3.1.2)编写mapper接口
package com.xhf.keshe.person.mapper;

import com.xhf.keshe.person.entity.PersonnelInformation;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface PersonnelInformationMapper {
    /**
     * 查询全部信息
     * @return
     */
    List<PersonnelInformation> list();
    /**
     * 根据id查询数据
     */
    PersonnelInformation listById(@Param("id") String id);
    /**
     * 修改
     */
    void update(@Param("entity") PersonnelInformation entity);
    /**
     * 新增数据
     */
    void insert(@Param("entity") PersonnelInformation entity);
    /**
     * 根据id删除数据
     */
    void deleteById(@Param("id") Integer id);
}

3.1.3)编写mapper的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xhf.keshe.person.mapper.PersonnelInformationMapper">
    <resultMap id="BaseResultMap" type="com.xhf.keshe.person.entity.PersonnelInformation" >
        <result column="personnel_number" property="personnelNumber" />
        <result column="name" property="name" />
        <result column="gender" property="gender" />
        <result column="department" property="department" />
        <result column="position" property="position" />
        <result column="other" property="other" />
    </resultMap>
    <insert id="insert">
        INSERT INTO
            personnel_information
        VALUES (
            null,
            #{entity.name},
            #{entity.gender},
            #{entity.department},
            #{entity.position},
            #{entity.other}
        )
    </insert>
    <update id="update">
        UPDATE personnel_information
        SET
            `name` = #{entity.name},
            gender = #{entity.gender},
            department = #{entity.department},
            `position` = #{entity.position},
            other = #{entity.other}
        WHERE
            personnel_number = #{entity.personnelNumber};
    </update>
    <delete id="deleteById">
        DELETE FROM personnel_information WHERE personnel_number = #{id};
    </delete>
    <select id="list" resultMap="BaseResultMap">
        SELECT * FROM personnel_information;
    </select>
    <select id="listById" resultMap="BaseResultMap">
        SELECT * FROM personnel_information WHERE personnel_number = #{id};
    </select>

</mapper>
3.2)查询界面UI
package com.xhf.keshe.person.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.person.entity.PersonnelInformation;
import com.xhf.keshe.person.mapper.PersonnelInformationMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.*;
import java.util.List;


/**
 * 维护资产信息查询界面
 */
public class PersonQuery extends JPanel {
    /**
     * 获取mapper
     */
    private static PersonnelInformationMapper mapper;
    /**
     * 获取sqlSession
     */
    private static SqlSession sqlSession;

    {
        sqlSession = GetSqlsession.getsqlsession();
        mapper = sqlSession.getMapper(PersonnelInformationMapper.class);
    }

    // 表格列名
    public static final String[] columnNames = {"人员编号", "姓名", "性别", "部门", "职位", "其它信息"};

    public PersonQuery() {
        // 设置界面大小
        setSize(Main.width, Main.height);
        // 设置布局
        setLayout(new BorderLayout());
        // 设置标题
        JLabel title = new JLabel("人员查询");
        title.setFont(Main.TitleFont);
        // 设置标题为居中对其
        title.setHorizontalAlignment(SwingConstants.CENTER);
        this.add(title, BorderLayout.NORTH);

        // 创建表格数据
        Object[][] data = getData();

        // 创建 JTable
        JTable table = new JTable(data, columnNames);
        // 设置头的字体
        table.getTableHeader().setFont(Main.font);
        // 设置每行的高度
        table.setRowHeight(25);
        // 设置表内容字体
        table.setFont(Main.font);

        // 将表格添加到滚动面板,并将滚动面板添加到窗口
        JScrollPane scrollPane = new JScrollPane(table);
        this.add(scrollPane);
    }

    /**
     * 返回资产表格数据
     * @return
     */
    private Object[][] getData() {
        // 返回list数据
        List<PersonnelInformation> list = mapper.list();
        System.out.println(list.toString());

        Object[][] data = new Object[list.size()][columnNames.length];
        // 将list处理为二维数组, 赋值给data
        for (int i = 0; i < list.size(); i++) {
            // 将list[i] -> assetInformation 变为数组
            Object[] res = new Object[columnNames.length];
            PersonnelInformation personnelInformation = list.get(i);
            res[0] = personnelInformation.getPersonnelNumber();
            res[1] = personnelInformation.getName();
            res[2] = personnelInformation.getGender();
            res[3] = personnelInformation.getDepartment();
            res[4] = personnelInformation.getPosition();
            res[5] = personnelInformation.getOther();
            data[i] = res;
        }
        return data;
    }
}
3.3)添加界面UI
package com.xhf.keshe.person.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.person.entity.PersonnelInformation;
import com.xhf.keshe.person.mapper.PersonnelInformationMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

public class PersonAdd extends JPanel {
    /**
     * title宽度
     */
    public static final int widthTitle = 200, heightTitle = 40;
    /**
     * 标题x坐标
     */
    public static final int xTitle = Main.width / 2 - widthTitle / 2;
    /**
     * 标题y坐标
     */
    public static final int yTitle = Main.height / 10;
    /**
     * y轴间距
     */
    public static final int yGap = 40;
    /**
     * 存储所有的JTextField
     */
    private final List<JTextField> jTextFieldList = new ArrayList<JTextField>();
    /**
     * 获取mapper
     */
    private static PersonnelInformationMapper mapper;
    /**
     * 获取sqlSession
     */
    private static SqlSession sqlSession;

    {
        sqlSession = GetSqlsession.getsqlsession();
        mapper = sqlSession.getMapper(PersonnelInformationMapper.class);
    }

    /**
     * 提交button
     */
    private final JButton jButton = new JButton("添加");

    public PersonAdd() {
        setLayout(null);
        // 设置title坐标
        JLabel title = new JLabel("添加人员信息");
        title.setFont(Main.TitleFont);
        title.setBounds(xTitle, yTitle, widthTitle, heightTitle);

        // 通过title坐标, 计算剩余组件坐标, 并添加
        int widthLabel = 100, heightLabel = 30, xLabel = xTitle / 2, yLabel = yTitle + yGap + heightLabel, xGap = 80;
        int xText = xLabel + widthLabel + xGap, yText = yLabel, widthText = 300, heightText = 30;

        for (int i = 0; i < PersonQuery.columnNames.length - 1; ++i) {
            // 创建JLabel
            JLabel jLabel = new JLabel(PersonQuery.columnNames[i + 1]);
            jLabel.setFont(Main.font);
            jLabel.setBounds(xLabel, yLabel, widthLabel, heightLabel);
            // 创建JTextField
            JTextField jTextField = new JTextField();
            jTextField.setFont(Main.font);
            jTextField.setBounds(xText, yText, widthText, heightText);
            // 添加
            add(jLabel);
            add(jTextField);
            // 将所有jTextField存储
            jTextFieldList.add(jTextField);
            // 更新位置
            yLabel += yGap;
            yText += yGap;
        }
        // 添加修改button
        jButton.setFont(Main.font);
        jButton.setBounds(xTitle, yText + yGap, widthTitle, heightTitle);
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 提交数据
                save();
            }
        });

        add(title);
        add(jButton);
    }

    /**
     * 提交数据
     */
    private void save() {
        System.out.println("保存数据");
        PersonnelInformation entity = new PersonnelInformation();
        entity.setName(jTextFieldList.get(0).getText());
        entity.setGender(jTextFieldList.get(1).getText());
        entity.setDepartment(jTextFieldList.get(2).getText());
        entity.setPosition(jTextFieldList.get(3).getText());
        entity.setOther(jTextFieldList.get(4).getText());
        // 保存数据
        mapper.insert(entity);
        // 事务提交
        sqlSession.commit();
        JOptionPane.showMessageDialog(null, "添加成功");
    }
}

3.4)修改界面UI
package com.xhf.keshe.person.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.person.entity.PersonnelInformation;
import com.xhf.keshe.person.mapper.PersonnelInformationMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

public class PersonUpdate extends JPanel {
    /**
     * title宽度
     */
    private static final int widthTitle = 200, heightTitle = 40;
    /**
     * 标题x坐标
     */
    private static final int xTitle = Main.width / 2 - widthTitle / 2;
    /**
     * 标题y坐标
     */
    private static final int yTitle = Main.height / 10;
    /**
     * y轴间距
     */
    private static final int yGap = 40;
    /**
     * 存储所有的JTextField
     */
    private final List<JTextField> jTextFieldList = new ArrayList<JTextField>();
    /**
     * sqlsession
     */
    private SqlSession sqlSession;
    /**
     * 获取mapper
     */
    private PersonnelInformationMapper mapper;

    {
        sqlSession = GetSqlsession.getsqlsession();
        mapper = sqlSession.getMapper(PersonnelInformationMapper.class);
    }

    /**
     * 提交button
     */
    private final JButton jButton = new JButton("修改");

    public PersonUpdate() {
        setLayout(null);
        // 设置title坐标
        JLabel title = new JLabel("修改人员信息");
        title.setFont(Main.TitleFont);
        title.setBounds(xTitle, yTitle, widthTitle, heightTitle);

        // 通过title坐标, 计算剩余组件坐标, 并添加
        int widthLabel = 100, heightLabel = 30, xLabel = xTitle / 2, yLabel = yTitle + yGap + heightLabel, xGap = 80;
        int xText = xLabel + widthLabel + xGap, yText = yLabel, widthText = 300, heightText = 30;

        for (int i = 0; i < PersonQuery.columnNames.length; ++i) {
            // 创建JLabel
            JLabel jLabel = new JLabel(PersonQuery.columnNames[i]);
            jLabel.setFont(Main.font);
            jLabel.setBounds(xLabel, yLabel, widthLabel, heightLabel);
            // 创建JTextField
            JTextField jTextField = new JTextField();
            jTextField.setFont(Main.font);
            jTextField.setBounds(xText, yText, widthText, heightText);
            // 添加
            add(jLabel);
            add(jTextField);
            // 将所有jTextField存储
            jTextFieldList.add(jTextField);

            if (i == 0) {
                System.out.println("添加button");
                // 添加查询按钮
                JButton jButton = new JButton("查询");
                jButton.setFont(Main.font);
                jButton.setBounds(xText + widthText + 10, yText, 80, heightText);
                jButton.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // 查询数据
                        getData();
                        // 重置文本框读写状态
                        setField();
                    }
                });
                add(jButton);
            } else {
                // 设置所有的都无法修改
                jTextField.setEnabled(false);
            }
            // 更新位置
            yLabel += yGap;
            yText += yGap;
        }
        // 添加修改button
        jButton.setEnabled(false);
        jButton.setFont(Main.font);
        jButton.setBounds(xTitle, yText + yGap, widthTitle, heightTitle);
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 提交数据
                upload();
            }
        });

        add(title);
        add(jButton);
    }

    /**
     * 重置textField的写状态
     */
    private void setField() {
        // 除了状态, 其它都可修改
        for (int i1 = 0; i1 < jTextFieldList.size(); i1++) {
            jTextFieldList.get(i1).setEnabled(true);
        }
    }

    /**
     * 根据id查询数据信息, 并进行回显
     */
    private void getData() {
        // 根据jTextField中的id查询数据, 并进行数据回显
        String id = jTextFieldList.get(0).getText();
        PersonnelInformation personnelInformation = mapper.listById(id);
        // 查不到
        if (personnelInformation == null) {
            JOptionPane.showMessageDialog(null, "查询失败");
            return;
        }
        // 修改按钮功能重新开启
        jButton.setEnabled(true);
        // 数据回显
        jTextFieldList.get(0).setText(String.valueOf(personnelInformation.getPersonnelNumber()));
        jTextFieldList.get(1).setText(personnelInformation.getName());
        jTextFieldList.get(2).setText(personnelInformation.getGender());
        jTextFieldList.get(3).setText(personnelInformation.getDepartment());
        jTextFieldList.get(4).setText(personnelInformation.getPosition());
        jTextFieldList.get(5).setText(personnelInformation.getOther());
    }

    /**
     * 提交数据
     */
    private void upload() {
        PersonnelInformation entity = new PersonnelInformation();
        entity.setPersonnelNumber(Integer.valueOf(jTextFieldList.get(0).getText()));
        entity.setName(jTextFieldList.get(1).getText());
        entity.setGender(jTextFieldList.get(2).getText());
        entity.setDepartment(jTextFieldList.get(3).getText());
        entity.setPosition(jTextFieldList.get(4).getText());
        entity.setOther(jTextFieldList.get(5).getText());
        // 保存数据
        mapper.update(entity);
        sqlSession.commit();
        JOptionPane.showMessageDialog(null, "修改成功");
    }
}

3.5)删除界面UI
package com.xhf.keshe.person.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.asset.page.AssetAdd;
import com.xhf.keshe.person.mapper.PersonnelInformationMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class PersonDelete extends JPanel {
    /**
     * sqlsession
     */
    private static SqlSession sqlSession;
    /**
     * mapper
     */
    private static PersonnelInformationMapper mapper;

    {
        sqlSession = GetSqlsession.getsqlsession();
        mapper = sqlSession.getMapper(PersonnelInformationMapper.class);
    }

    public PersonDelete() {
        setLayout(null);
        // 设置标题
        JLabel title = new JLabel("人员信息删除");
        title.setFont(Main.TitleFont);
        title.setBounds(AssetAdd.xTitle, AssetAdd.yTitle, AssetAdd.widthTitle, AssetAdd.heightTitle);
        add(title);

        // jLabel设置坐标
        int widthLabel = 100, heightLabel = 30, xLabel = AssetAdd.xTitle / 2, yLabel = AssetAdd.yTitle + AssetAdd.yGap + heightLabel, xGap = 80;
        JLabel jLabel = new JLabel("人员id");
        jLabel.setFont(Main.font);
        jLabel.setBounds(xLabel, yLabel, widthLabel, heightLabel);

        // 设置JCombox
        int xText = xLabel + widthLabel + xGap, yText = yLabel, widthText = 300, heightText = 30;
        JComboBox jComboBox = new JComboBox();
        jComboBox.setFont(Main.font);
        jComboBox.setBounds(xText, yText, widthText, heightText);
        jComboBox.addItem("请选择");
        // 查询所有的id, 并添加到JComboBox中
        mapper.list().forEach(e -> {
            jComboBox.addItem(e.getPersonnelNumber());
        });

        add(jLabel);
        add(jComboBox);

        // 删除按钮
        JButton jButton = new JButton("删除");
        jButton.setFont(Main.font);
        jButton.setBounds(AssetAdd.xTitle, AssetAdd.yTitle + 120, AssetAdd.widthTitle, AssetAdd.heightTitle);
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Object id = jComboBox.getSelectedItem();
                mapper.deleteById((Integer) id);
                sqlSession.commit();
                JOptionPane.showMessageDialog(null, "删除成功");
            }
        });
        add(jButton);
    }
}

模块四:资产操作

4.1)mybatis整合
4.1.1)编写实体类
package com.xhf.keshe.operate.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class AssetOperationLog implements Serializable {

    private static final long serialVersionUID = 1L;
    /**
     * 操作编号
     */
    private Integer operationNumber;

    /**
     * 操作类型
     */
    private String operationType;

    /**
     * 资产编号
     */
    private String assetNumber;

    /**
     * 操作时间
     */
    private Date operationTime;

    /**
     * 领用人
     */
    private String recipient;
    /**
     * 备注
     */
    private String remarks;
}
4.1.2)编写mapper接口
package com.xhf.keshe.operate.mapper;

import com.xhf.keshe.operate.entity.AssetOperationLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface OperateMapper {
    /**
     * 查询所有数据
     * @return
     */
    List<AssetOperationLog> list();
    /**
     * 保存
     */
    void insert(@Param("entity") AssetOperationLog entity);
}

4.1.3)编写mapper的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xhf.keshe.operate.mapper.OperateMapper">

    <resultMap id="BaseResultMap" type="com.xhf.keshe.operate.entity.AssetOperationLog" >
        <result column="operation_number" property="operationNumber" />
        <result column="operation_type" property="operationType" />
        <result column="asset_number" property="assetNumber" />
        <result column="operation_time" property="operationTime" />
        <result column="recipient" property="recipient" />
        <result column="remarks" property="remarks" />
    </resultMap>
    <insert id="insert">
        INSERT INTO
            asset_operation_log
        VALUES (
            null,
            #{entity.operationType},
            #{entity.assetNumber},
            #{entity.operationTime},
            #{entity.recipient},
            #{entity.remarks}
        );
    </insert>

    <select id="list" resultMap="BaseResultMap">
        SELECT * FROM asset_operation_log;
    </select>

</mapper>
4.2)资产查询界面
package com.xhf.keshe.operate.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.operate.entity.AssetOperationLog;
import com.xhf.keshe.operate.mapper.OperateMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.*;
import java.util.List;

public class OperateQuery extends JPanel {
    /**
     * 列名
     */
    public static final String[] columnNames = {"操作编号", "操作类型", "资产编号", "操作时间", "操作人", "备注"};
    /**
     * sqlsession
     */
    private SqlSession sqlSession;
    /**
     * mapper
     */
    private OperateMapper mapper;

    {
        sqlSession = GetSqlsession.getsqlsession();
        mapper = sqlSession.getMapper(OperateMapper.class);
    }

    public OperateQuery() {
        // 设置界面大小
        setSize(Main.width, Main.height);
        // 设置布局
        setLayout(new BorderLayout());
        // 设置标题
        JLabel title = new JLabel("操作查询");
        title.setFont(Main.TitleFont);
        // 设置标题为居中对其
        title.setHorizontalAlignment(SwingConstants.CENTER);
        this.add(title, BorderLayout.NORTH);

        // 创建表格数据
        Object[][] data = getData();

        // 创建 JTable
        JTable table = new JTable(data, columnNames);
        // 设置头的字体
        table.getTableHeader().setFont(Main.font);
        // 设置每行的高度
        table.setRowHeight(25);
        // 设置表内容字体
        table.setFont(Main.font);

        // 将表格添加到滚动面板,并将滚动面板添加到窗口
        JScrollPane scrollPane = new JScrollPane(table);
        this.add(scrollPane);
    }

    /**
     * 返回资产表格数据
     * @return
     */
    private Object[][] getData() {
        // 返回list数据
        List<AssetOperationLog> list = mapper.list();
        Object[][] data = new Object[list.size()][columnNames.length];
        // 将list处理为二维数组, 赋值给data
        for (int i = 0; i < list.size(); i++) {
            // 将list[i] -> assetInformation 变为数组
            Object[] res = new Object[columnNames.length];
            AssetOperationLog operationLog = list.get(i);
            res[0] = operationLog.getOperationNumber();
            res[1] = operationLog.getOperationType();
            res[2] = operationLog.getAssetNumber();
            res[3] = operationLog.getOperationTime();
            res[4] = operationLog.getRecipient();
            res[5] = operationLog.getRemarks();
            data[i] = res;
        }
        return data;
    }
}

4.3)资产操作界面
package com.xhf.keshe.operate.page;

import com.xhf.keshe.Main;
import com.xhf.keshe.asset.entity.AssetInformation;
import com.xhf.keshe.asset.mapper.AssetInformationMapper;
import com.xhf.keshe.asset.page.AssetQuery;
import com.xhf.keshe.operate.entity.AssetOperationLog;
import com.xhf.keshe.operate.mapper.OperateMapper;
import com.xhf.keshe.utils.GetSqlsession;
import org.apache.ibatis.session.SqlSession;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

public class Operate extends JPanel {
    /**
     * sqlsession
     */
    private SqlSession sqlsession;
    /**
     * mapper
     */
    private OperateMapper mapper;
    /**
     * mapper
     */
    private AssetInformationMapper mapper2;
    /**
     * 资产编号
     */
    private JTextField jTextField1;
    /**
     * 操作人员编号
     */
    private JTextField jTextField2;
    /**
     * 备注
     */
    private JTextField jTextField3;
    /**
     * 操作类型
     */
    private JComboBox comboBox;
    {
        sqlsession = GetSqlsession.getsqlsession();
        mapper = sqlsession.getMapper(OperateMapper.class);
        mapper2 = sqlsession.getMapper(AssetInformationMapper.class);
    }

    public Operate() {
        // 设置布局
        setLayout(new BorderLayout());
        JLabel title = new JLabel("资产设备操作");
        title.setFont(Main.TitleFont);
        title.setHorizontalAlignment(SwingConstants.CENTER);
        add(title, BorderLayout.NORTH);

        // 设置table
        Object[][] data = getData();
        JTable table = new JTable(data, AssetQuery.columnNames);
        table.setFont(Main.font);
        table.setRowHeight(30);
        table.getTableHeader().setFont(Main.font);

        // 添加到滚轴
        JScrollPane jScrollPane = new JScrollPane(table);
        add(jScrollPane, BorderLayout.CENTER);

        // 添加底栏
        int hgap = 30, vgap = 5;
        JPanel bottomBar = new JPanel();
        bottomBar.setLayout(new GridLayout(3, 1, hgap, vgap));

        // 上栏
        JPanel upper = new JPanel();
        upper.setLayout(new GridLayout(1, 4, hgap, vgap));
        initUpper(upper);
        // 中栏
        JPanel middle = new JPanel();
        middle.setLayout(new GridLayout(1, 4, hgap, vgap));
        initMiddle(middle);

        // 下栏
        JPanel down = new JPanel();
        down.setLayout(new GridLayout(1, 1));
        JButton jButton = new JButton("确定");
        jButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 保存日志
                saveLog();
                // 修改资产
                updateAsset();
                JOptionPane.showMessageDialog(null, "操作成功");
            }
        });
        jButton.setFont(Main.font);
        down.add(jButton);

        bottomBar.add(upper);
        bottomBar.add(middle);
        bottomBar.add(down);

        add(bottomBar, BorderLayout.SOUTH);
    }

    /**
     * 修改资产
     */
    private void updateAsset() {
        AssetInformation assetInformation = new AssetInformation();
        assetInformation.setAssetNumber(Integer.valueOf(jTextField1.getText()));
        assetInformation.setStatus(getNumber((String) comboBox.getSelectedItem()));
        mapper2.update(assetInformation);
        sqlsession.commit();
    }

    /**
     * 修改日志
     */
    private void saveLog() {
        AssetOperationLog operationLog = new AssetOperationLog();
        // 设置资产id
        operationLog.setAssetNumber(String.valueOf(jTextField1.getText()));
        // 设置操作人
        operationLog.setRecipient(jTextField2.getText());
        // 设置操作
        operationLog.setOperationType(getNumber((String) comboBox.getSelectedItem()));
        // 设置备注
        operationLog.setRemarks(jTextField3.getText());
        // 保存操作日志
        mapper.insert(operationLog);
        sqlsession.commit();
    }

    /**
     * 根据操作目的, 返回对应数值
     * @param selectedItem
     * @return
     */
    private String getNumber(String selectedItem) {
        if (selectedItem.equals("领用")) {
            return "1";
        }else if (selectedItem.equals("归还")) {
            return "2";
        }else {
            return "3";
        }
    }

    /**
     * 初始化middle栏界面
     * @param middle
     */
    private void initMiddle(JPanel middle) {
        JLabel jLabel = new JLabel("操作");
        jLabel.setFont(Main.font);
        middle.add(jLabel);

        comboBox = new JComboBox();
        comboBox.setFont(Main.font);
        comboBox.addItem("领用");
        comboBox.addItem("归还");
        comboBox.addItem("报废");
        middle.add(comboBox);

        JLabel jLabel1 = new JLabel("备注");
        jLabel1.setFont(Main.font);
        middle.add(jLabel1);
        jTextField3 = new JTextField();
        middle.add(jTextField3);
    }

    /**
     * 初始化upper栏界面
     * @param upper
     */
    private void initUpper(JPanel upper) {
        JLabel jLabel = new JLabel("资产编号");
        jLabel.setFont(Main.font);
        upper.add(jLabel);
        jTextField1 = new JTextField();
        upper.add(jTextField1);

        JLabel jLabel1 = new JLabel("操作人员编号");
        jLabel1.setFont(Main.font);
        upper.add(jLabel1);
        jTextField2 = new JTextField();
        upper.add(jTextField2);
    }

    /**
     * 获取数据
     * @return
     */
    private Object[][] getData() {
        // 返回list数据
        List<AssetInformation> list = mapper2.list();
        Object[][] data = new Object[list.size()][AssetQuery.columnNames.length];
        // 将list处理为二维数组, 赋值给data
        for (int i = 0; i < list.size(); i++) {
            // 将list[i] -> assetInformation 变为数组
            Object[] res = new Object[AssetQuery.columnNames.length];
            AssetInformation assetInformation = list.get(i);
            res[0] = assetInformation.getAssetNumber();
            res[1] = assetInformation.getAssetName();
            res[2] = assetInformation.getPrice();
            res[3] = assetInformation.getPurchaseDate();
            res[4] = assetInformation.getStatus();
            res[5] = assetInformation.getRemarks();
            data[i] = res;
        }
        return data;
    }
}

;