10.28
MES 管理系统设计方案
一、数据库设计
选用 MySQL 数据库,设计mes_daily_report表存储生产日报数据:
sql
CREATE TABLE mes_daily_report (
id INT PRIMARY KEY AUTO_INCREMENT,
production_batch VARCHAR(10) NOT NULL, -- 生产批次(10位)
worker_id VARCHAR(6) NOT NULL, -- 工号(6位)
worker_name VARCHAR(20) NOT NULL, -- 工人姓名(最多10个汉字)
total转出 INT NOT NULL, -- 转出总数
qualified INT NOT NULL, -- 转出合格数
defective INT NOT NULL, -- 次品数
lost INT NOT NULL, -- 丢失数
report_date DATE NOT NULL -- 上报日期
);
二、Java Bean 设计
-
实体类 DailyReport.java
封装日报数据:
java
运行
public class DailyReport {
private int id;
private String productionBatch;
private String workerId;
private String workerName;
private int total转出;
private int qualified;
private int defective;
private int lost;
private String reportDate;// 构造方法、getter/setter
} -
数据库连接工具 DBUtil.java
java
运行
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/mes_db";
private static final String USER = "root";
private static final String PWD = "123456";public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PWD);
}public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); }
try { if (ps != null) ps.close(); } catch (SQLException e) { e.printStackTrace(); }
try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
}
三、Servlet 设计(核心交互) -
提交日报 SubmitReportServlet.java
java
运行
@WebServlet("/submitReport")
public class SubmitReportServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
// 获取表单数据
String batch = req.getParameter("productionBatch");
String workerId = req.getParameter("workerId");
String name = req.getParameter("workerName");
int total = Integer.parseInt(req.getParameter("total转出"));
int qualified = Integer.parseInt(req.getParameter("qualified"));
int defective = Integer.parseInt(req.getParameter("defective"));
int lost = Integer.parseInt(req.getParameter("lost"));
String date = req.getParameter("reportDate");// 验证生产批次(10位,前4位为年+月) boolean batchValid = batch.matches("\\d{10}") && batch.substring(0,2).matches("2[0-9]") && batch.substring(2,4).matches("(0[1-9]|1[0-2])"); // 验证工号(6位,前3位车间号,后3位序号) boolean idValid = workerId.matches("\\d{6}"); if (!batchValid || !idValid) { req.setAttribute("error", "生产批次或工号格式错误"); req.getRequestDispatcher("submit.jsp").forward(req, resp); return; } // 验证押平规则 if (total != qualified + defective + lost) { req.setAttribute("error", "上报数据有误"); req.getRequestDispatcher("submit.jsp").forward(req, resp); return; } // 保存到数据库 try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement( "INSERT INTO mes_daily_report VALUES (null, ?, ?, ?, ?, ?, ?, ?, ?)")) { ps.setString(1, batch); ps.setString(2, workerId); ps.setString(3, name); ps.setInt(4, total); ps.setInt(5, qualified); ps.setInt(6, defective); ps.setInt(7, lost); ps.setString(8, date); ps.executeUpdate(); resp.sendRedirect("queryReport"); // 跳转查询页 } catch (SQLException e) { e.printStackTrace(); }}
} -
修改日报 UpdateReportServlet.java
java
运行
@WebServlet("/updateReport")
public class UpdateReportServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String date = req.getParameter("reportDate");
String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
if (!date.equals(today)) {
req.setAttribute("error", "仅允许修改当天数据");
req.getRequestDispatcher("update.jsp").forward(req, resp);
return;
}// 更新数据库(省略参数获取和SQL执行,类似提交逻辑) resp.sendRedirect("queryReport");}
} -
删除日报 DeleteReportServlet.java
java
运行
@WebServlet("/deleteReport")
public class DeleteReportServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String date = req.getParameter("reportDate");
String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
if (!date.equals(today)) {
req.setAttribute("error", "仅允许删除当天数据");
req.getRequestDispatcher("delete.jsp").forward(req, resp);
return;
}// 删除数据库记录(根据日期和工号定位) resp.sendRedirect("queryReport");}
} -
查询日报 QueryReportServlet.java
java
运行
@WebServlet("/queryReport")
public class QueryReportServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String date = req.getParameter("reportDate");
String batch = req.getParameter("productionBatch");
String workerId = req.getParameter("workerId");
String name = req.getParameter("workerName");// 模糊查询SQL String sql = "SELECT * FROM mes_daily_report WHERE 1=1"; if (date != null && !date.isEmpty()) sql += " AND report_date LIKE '%" + date + "%'"; if (batch != null && !batch.isEmpty()) sql += " AND production_batch LIKE '%" + batch + "%'"; if (workerId != null && !workerId.isEmpty()) sql += " AND worker_id LIKE '%" + workerId + "%'"; if (name != null && !name.isEmpty()) sql += " AND worker_name LIKE '%" + name + "%'"; sql += " ORDER BY report_date DESC"; // 新数据置顶 // 执行查询并转发到查询页 List<DailyReport> list = new ArrayList<>(); try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { while (rs.next()) { DailyReport report = new DailyReport(); // 封装数据到report list.add(report); } } catch (SQLException e) { e.printStackTrace(); } req.setAttribute("reports", list); req.getRequestDispatcher("query.jsp").forward(req, resp);}
}
四、页面设计 -
主页面 index.jsp
html
预览
MES管理系统
2. 提交日报页面 submit.jsp html 预览 3. 查询日报页面 query.jsp html 预览| 生产批次 | 工号 | 工人姓名 | 转出总数 | 转出合格数 | 次品数 | 丢失数 | 上报日期 |
|---|---|---|---|---|---|---|---|
| ${r.productionBatch} | ${r.workerId} | ${r.workerName} | ${r.total转出} | ${r.qualified} | ${r.defective} | ${r.lost} | ${r.reportDate} |
-- 使用该数据库
USE mes_db;
-- 创建生产日报表(对应MES系统的核心数据)
CREATE TABLE IF NOT EXISTS mes_daily_report (
id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键,唯一标识一条记录
production_batch VARCHAR(10) NOT NULL, -- 生产批次(10位,如24100130)
worker_id VARCHAR(6) NOT NULL, -- 工号(6位,如001030)
worker_name VARCHAR(20) NOT NULL, -- 工人姓名(最多10个汉字,对应20个字符)
total_out INT NOT NULL, -- 转出总数
qualified INT NOT NULL, -- 转出合格数
defective INT NOT NULL, -- 次品数
lost INT NOT NULL, -- 丢失数
report_date DATE NOT NULL -- 上报日期
);
二、Java 连接数据库核心代码(Java Bean 封装)
按照需求,我们需要用Java Bean 封装数据库连接操作,核心是编写一个DBUtil工具类,负责获取连接、关闭资源等操作。
- 项目结构(基础 Maven/Web 项目)
先创建一个 Java Web 项目,结构如下(以 Eclipse 为例):
plaintext
MESProject/
├─ src/
│ └─ main/
│ ├─ java/
│ │ ├─ com/mes/util/ -- 工具类包
│ │ │ └─ DBUtil.java -- 数据库连接工具
│ │ └─ com/mes/entity/ -- 实体类包
│ │ └─ DailyReport.java -- 日报实体类
│ └─ webapp/ -- 网页文件
└─ WebContent/
└─ WEB-INF/
└─ lib/ -- 存放MySQL驱动jar包(将下载的mysql-connector-j-xxx.jar复制到这里) - 导入 MySQL 驱动
将下载的mysql-connector-j-xxx.jar复制到项目的WEB-INF/lib目录下(如果是 Maven 项目,可在pom.xml中添加依赖):
xml
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
-
数据库连接工具类(Java Bean封装)
*/
public class DBUtil {
// MySQL连接地址(mes_db是数据库名,useSSL=false避免SSL连接警告,serverTimezone=Asia/Shanghai设置时区)
private static final String URL = "jdbc:mysql://localhost:3306/mes_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8";
// 数据库用户名(默认root)
private static final String USER = "root";
// 数据库密码(替换为你的MySQL密码)
private static final String PASSWORD = "123456"; // 例如你的密码是123456/**
- 获取数据库连接
- @return 连接对象Connection
- @throws SQLException 数据库连接异常
*/
public static Connection getConnection() throws SQLException {
// 加载驱动(MySQL 8.0以上驱动类是com.mysql.cj.jdbc.Driver,5.x是com.mysql.jdbc.Driver)
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new SQLException("MySQL驱动加载失败!");
}
// 获取连接
return DriverManager.getConnection(URL, USER, PASSWORD);
}
/**
- 关闭数据库资源(ResultSet、PreparedStatement、Connection)
- @param rs 结果集
- @param ps 预编译语句
- @param conn 连接对象
*/
public static void closeResources(ResultSet rs, PreparedStatement ps, Connection conn) {
// 关闭顺序:先ResultSet,再PreparedStatement,最后Connection
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close(); // 关闭连接,释放资源
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
三、测试数据库连接是否成功
为了验证连接是否正确,我们可以编写一个测试类,尝试获取数据库连接:
java
运行
package com.mes.test;
import com.mes.util.DBUtil;
import java.sql.Connection;
import java.sql.SQLException;
public class DBTest {
public static void main(String[] args) {
Connection conn = null;
try {
// 调用DBUtil获取连接
conn = DBUtil.getConnection();
if (conn != null) {
System.out.println("数据库连接成功!");
} else {
System.out.println("数据库连接失败!");
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("连接出错:" + e.getMessage());
} finally {
// 关闭连接
DBUtil.closeResources(null, null, conn);
}
}
}
四、常见问题及解决方法
驱动加载失败
检查Class.forName("com.mysql.cj.jdbc.Driver")是否正确(MySQL 8.0 以上必须带cj)。
确认驱动 jar 包已放入WEB-INF/lib或 Maven 依赖正确。
连接地址错误
检查URL中的localhost:3306是否正确(MySQL 默认端口 3306,若修改过需对应)。
确认数据库名mes_db已创建。
用户名 / 密码错误
核对USER和PASSWORD是否与你的 MySQL 登录信息一致(默认用户root,密码是安装时设置的)。
时区错误
URL 中必须添加serverTimezone=Asia/Shanghai(MySQL 8.0 以上要求显式设置时区)。
五、后续使用(在 Servlet 中调用)
连接成功后,在 Servlet 中就可以通过DBUtil操作数据库了,例如提交日报时保存数据:
java
运行
// 示例:保存日报到数据库
Connection conn = null;
PreparedStatement ps = null;
try {
conn = DBUtil.getConnection(); // 获取连接
String sql = "INSERT INTO mes_daily_report (production_batch, worker_id, worker_name, total_out, qualified, defective, lost, report_date) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
ps = conn.prepareStatement(sql);
// 设置参数(对应SQL中的?)
ps.setString(1, "24100130"); // 生产批次
ps.setString(2, "001030"); // 工号
ps.setString(3, "张三"); // 姓名
ps.setInt(4, 100); // 转出总数
ps.setInt(5, 90); // 合格数
ps.setInt(6, 5); // 次品数
ps.setInt(7, 5); // 丢失数
ps.setString(8, "2024-10-27"); // 上报日期
ps.executeUpdate(); // 执行插入
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.closeResources(null, ps, conn); // 关闭资源
}
通过以上步骤,就完成了从 0 到 1 的数据库连接配置。核心是通过DBUtil类封装连接逻辑,确保代码复用和资源正确释放,为后续 MES 系统的 CRUD(增删改查)操作打下基础。

浙公网安备 33010602011771号