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

news2024/11/15 16:02:52

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;
    }
}

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

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

相关文章

【Linux取经路】进程的奥秘

文章目录 1、什么是进程&#xff1f;1.1 自己写一个进程 2、操作系统如何管理进程&#xff1f;2.1 描述进程-PCB2.2 组织进程2.3 深入理解进程 3、Linux环境下的进程3.1 task_struct3.2 task_struct内容分类3.3 组织进程3.4 查看进程属性 4、结语 1、什么是进程&#xff1f; 在…

Java GUI——网页浏览器开发

Java GUI——网页浏览器开发 前言&#xff1a;为了做java课设&#xff0c;学了一手Java GUI。感觉蛮有意思的&#xff0c;写写文章&#xff0c;做个视频记录一下。欢迎大家友善指出我的不足 网页浏览器开发录制视频&#xff0c;从头敲到尾 任务需求 界面需求 菜单栏 文件 【…

构建IT项目价值管理体系︱陆金所控股有限公司项目管理专家朱磊

陆金所控股有限公司项目管理专家朱磊先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;陆控-构建IT项目价值管理体系。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; IT资源有限&#xff0c;…

常见的几大排序问题

前言&#xff1a;排序问题&#xff0c;是数据结构中的一大重要的组成板块&#xff0c;很多的面试机试中都会多多少少的涉及到排序问题&#xff0c;之前在上数据结构的那个学期整理过排序问题&#xff0c;不过大都是囫囵吞枣&#xff0c;不求甚解&#xff0c;今天&#xff0c;我…

Altium Designer (AD) 绘制原理图及双层PCB简易教程

目录 前言 工程建立 创建工程 创建原理图文件 创建PCB文件 绘制原理图 导入元件库 ​编辑绘制原理图 设置原理图标注 ​编辑​编辑 结果图​编辑 制作PCB板 生成PCB​编辑 绘制PCB边缘 设置PCB网格间距大小 走线规则设置 修改安全间距 什么是安全间距 怎样修…

在飞机设计中的仿真技术

仿真技术在飞机设计中发挥着越来越重要的作用&#xff0c;本文阐述了国内外在飞机设计中广泛使用的结构强度计算&#xff0c;多体动力学仿真、多学科多目标结构优化、内外流场分析、非线性有限元分析、疲劳强度分析、电磁仿真分析&#xff0c;机电液联合仿真分析等&#xff0c;…

数据结构基础5:栈和队列的实现。

一.栈的基本概念。 一.基本概念 1.基本概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&…

java静默打印PDF(可实现生产环境下服务器写入PDF模板,然后调用客户端打印机打印)

java静默打印PDF可实现生产环境下服务器写入PDF模板&#xff0c;然后调用客户端打印机打印 一、简需求实现步骤 二、代码实现0、打印模板1、服务器部分 &#xff08;端口&#xff1a;8090&#xff09;1.1、maven依赖1.2、实体1.2.1、接口返回类1.2.2、标签纸页面参数类1.2.3、P…

【EI/SCOPUS检索】第四届应用力学与机械工程国际学术会议(ICAMME 2023)

第四届应用力学与机械工程国际学术会议&#xff08;ICAMME 2023&#xff09; 2023 4th International Conference on Applied Mechanics and Mechanical Engineering (ICAMME 2023) 第四届应用力学与机械工程国际学术会议&#xff08;ICAMME 2023&#xff09;将于2023年11月10…

期刊和会议缩写查询网站

1.https://pubmed.ncbi.nlm.nih.gov/?termMedicalImageComputingandComputer-AssistedIntervention 2. http://www.letpub.com.cn/index.php?pagejournalapp&viewsearch 3. https://blog.csdn.net/weixin_44557349/article/details/120825927 https://blog.csdn.net/ret…

Kafka:安装和配置

producer&#xff1a;发布消息的对象&#xff0c;称为消息产生者 &#xff08;Kafka topic producer&#xff09; topic&#xff1a;Kafka将消息分门别类&#xff0c;每一个消息称为一个主题&#xff08;topic&#xff09; consumer&#xff1a;订阅消息并处理发布消息的对象…

【solon生态】- solon.cloud.micrometer插件使用指南及micrometer详解

solon.cloud.micrometer插件使用指南 solon是什么solon的cloud生态图快速入门 micrometer指南micrometer是什么监控系统 Supported Monitoring Systems注册表 Registry度量 Meters度量名 Naming Meters度量标签 Tag Naming通用标签 Common Tags 指标过滤器 MeterFilter聚合速率…

LeetCode_01 精度丢失

1281. 整数的各位积和之差 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 输入&#xff1a;n 234 输出&#xff1a;15 解释&#xff1a; 各位数之积 2 * 3 * 4 24 各位数之和 2 3 4 9 结果 24 - 9 15示例 …

vue中使用this.$refs获取不到子组件的方法,属性方法都为undefined的解决方法

问题描述 vue2中refs获取不到子组件中的方法&#xff1f;&#xff0c;而获取到的是undefined 原因及解决方案&#xff1a; 第一种、在循环中注册了很多个ref 因为注册了多个ref&#xff0c;获取是不能单单知识refs.xxx&#xff0c;需要使用数组和索引来获取具体一个组件refs[…

限流式保护器在高校宿舍电气防火的应用

安科瑞 华楠 引言 14日早晨6时10分左右&#xff0c;上海商学院徐汇校区学生宿舍楼发生火灾&#xff0c;4名女生从六楼宿合阳台跳下逃生当场死亡&#xff0c;酿成近年来惨烈的校园事故。宿舍火灾初步判断缘起于寝室里使用热得快导致电器故障并将周围可燃物引燃。 任何条生命都是…

【方法】7Z压缩包如何解压?

你知道7Z压缩包如何解压吗&#xff1f; 7Z是一种主流高效的压缩格式&#xff0c;它可以用多种压缩解压软件来解压&#xff0c;像7-Zip、WinRAR等常用的解压缩软件都可以解压7Z压缩包。 首先我们可以从官网或者软件商店里免费下载7-Zip或者WinRAR解压缩软件&#xff0c;再安装…

PXE-kickstart无人值守安装操作系统

PXE的概念&#xff1a; PXE&#xff08;Pre-boot Execution Environment&#xff0c;预启动执行环境&#xff09;是由Intel公司开发的最新技术&#xff0c;工作于C/S的网络模式&#xff0c;支持工作站通过网络从远端服务器下载映像&#xff0c;并由此支持通过网络启动操作系统…

leetcode 2616. 最小化数对的最大差值

在数组nums中找到p个数对&#xff0c;使差值绝对值的和最小。 思路&#xff1a; 最小差值应该是数值相近的一对数之间产生&#xff0c;让数值相近的数字尽量靠在一起方便计算&#xff0c;所以需要排序。 这里不去直接考虑一对对的数字&#xff0c;而是直接考虑差值的取值。 …

msvcp120.dll丢失的解决方法,哪种解决方法更实用

msvcp120.dll是Microsoft Visual C 2013库中的一个动态链接库文件。它包含了在使用Visual C 2013编译的应用程序中所需的函数和资源。这个文件通常用于在Windows操作系统上运行使用Visual C 2013编写的软件。如果缺少或损坏了msvcp120.dll文件&#xff0c;可能会导致相关软件无…

Wav2Lip实践

1. 安装 1.1 安装 conda以指定python版本运行环境 下载&#xff1a;Index of /https://repo.anaconda.com/archive/index.html 1.2 如按旧项目基于python3.6版本对话&#xff0c;会有很多包找不到的情况&#xff0c;经摸索后以python3.9构建成功&#xff0c; conda instal…