飞思卡尔ZigBee方案全解析:从MC1323x硬件到五种协议栈选型指南
2026/6/22 12:27:56
做毕设时,很多同学把“工资管理系统”当成“增删改查”大合集:一个EmployeeServlet里塞满 SQL 拼接,一个if-else搞定个税计算,页面用 JSP 直接<% %>写业务。功能看似能跑,但答辩现场常被老师三连问:
痛点总结成一句话:紧耦合、硬编码、无事务、无扩展。下面用一张图先直观感受“坏味道”:
| 方案 | 优点 | 缺点 | 毕设场景结论 |
|---|---|---|---|
| 纯 Servlet + JSP | 零依赖,老师教学资料多 | SQL 散落各处,事务靠手动 commit,一学期后自己看不懂 | 维护地狱 |
| Spring + JDBC Template | 注入解耦,事务模板化 | 手写 RowMapper 枯燥,字段多时常出 Bug | 写腻了 |
| Spring Boot + MyBatis | 自动配置、接口绑定、SQL 与 Java 分离、插件丰富(分页、乐观锁) | 需要理解 Starter 与 YAML 配置 | 毕设最均衡 |
一句话:Spring Boot 让你专注业务,MyBatis 让你保留对 SQL 的细粒度控制,两者加一起就是“写得快、改得少、答辩稳”。
浏览器 → Controller → Service → Mapper → MySQL员工调薪接口:
POST /api/employees/{id}/salary { "baseSalary": 8000, "allowance": 1500, "effectiveDate": "2024-07-01" }返回:
{ "code": 0, "message": "调薪已生效,7 月薪资将按新标准计算" }@Service public class PayrollService { @Resource private EmployeeMapper employeeMapper; @Resource private SalaryRecordMapper recordMapper; /** * 计算单月工资并落库,事务保证“计算+写记录”原子性 */ @Transactional(rollbackFor = Exception.class) public PaySlip calculateMonthly(Long empId, YearMonth month) { // 1. 查员工最新工资标准 Employee emp = employeeMapper.selectById(empId); Validate.notNull(emp, "员工不存在"); // 2. 组装 SalaryContext,把各种规则参数丢进去 SalaryContext ctx = SalaryContext.builder() .base(emp.getBaseSalary()) .allowance(emp.getAllowance()) .insuranceRate(0.08) // 社保 .taxThreshold(5000) .build(); // 3. 计算 BigDecimal gross = ctx.getBase().add(ctx.getAllowance()); BigDecimal insurance = gross.multiply(BigDecimal.valueOf(ctx.getInsuranceRate())); BigDecimal taxable = gross.subtract(insurance).subtract(BigDecimal.valueOf(ctx.getTaxThreshold())); BigDecimal tax = TaxUtil.calc(taxable); // 分档速算扣除 BigDecimal net = gross.subtract(insurance).subtract(tax); // 4. 落库 SalaryRecord record = SalaryRecord.builder() .empId(empId) .month(month.toString()) .gross(gross).insurance(insurance).tax(tax).net(net) .build(); recordMapper.insertSelective(record); return new PaySlip(month.toString(), gross, insurance, tax, net); } }注意:
BigDecimal,避免double二进制误差TaxUtil单独封装,改政策只改一处#{}预编译占位,拒绝${}拼接maximum-pool-size=100,压测后 5~10 足够net字段若需展示,接口做脱敏,返回*.*或 AES 加密emp_id + month建联合索引,避免全表扫描@Transactional会失效,用@Autowired自身代理或拆 ServiceeffectiveDate存DATE类型,Java 用LocalDate,前后端统一yyyy-MM-dd,拒用java.util.DateBigDecimal,杜绝double<foreach>,一次 500 条,防止大事务锁表SalaryContext抽成策略接口,不同部门implements自定义社保、津贴算法,再用工厂模式注入List<SalaryRecord>→.xlsx,财务小姐姐点赞把工资管理系统从“能跑”做成“能讲”,核心就是分层+解耦+可测试。今天给出的代码骨架,你可以直接丢进毕设仓库,再花一下午把 Excel 导出和多部门策略工厂补齐,足以应对 90% 的答辩提问。下一步,不妨思考:如果公司突然新增“海外员工”且税费规则完全独立,你的策略模式还能 cover 住吗?动手改一改,你会发现——毕业设计不是终点,是代码生涯的第一块积木。