【论文+源码】一个基于SSM(Spring + Spring MVC + MyBatis)的公寓电能计量系统

请添加图片描述

为了实现一个基于SSM(Spring + Spring MVC + MyBatis)的公寓电能计量系统,我们需要创建一个简单的Web应用程序来记录和显示每个公寓的电能使用情况。以下是一个基本的实现示例。

我们将包括以下几个部分:

  1. 数据库表设计
  2. 实体类
  3. DAO层接口及MyBatis映射文件
  4. Service层接口及其实现类
  5. Controller层
  6. 前端页面

1. 数据库表设计

假设我们有一个名为electricity_metering的数据库,其中包含一个meter_reading表:

CREATE TABLE meter_reading (
    id INT AUTO_INCREMENT PRIMARY KEY,
    apartment_id INT NOT NULL,
    reading_date DATE NOT NULL,
    energy_usage DECIMAL(10, 2) NOT NULL
);

2. 实体类

创建一个Java实体类来表示meter_reading表的数据。

public class MeterReading {
    private Integer id;
    private Integer apartmentId;
    private Date readingDate;
    private BigDecimal energyUsage;

    // Getters and Setters
}

3. DAO层接口及MyBatis映射文件

定义DAO层接口以及对应的XML映射文件。

MeterReadingDao.java

import java.util.List;

public interface MeterReadingDao {
    List<MeterReading> getAllReadings();
    void addReading(MeterReading reading);
}

MeterReadingMapper.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.example.dao.MeterReadingDao">

    <select id="getAllReadings" resultType="com.example.model.MeterReading">
        SELECT * FROM meter_reading
    </select>

    <insert id="addReading" parameterType="com.example.model.MeterReading">
        INSERT INTO meter_reading (apartment_id, reading_date, energy_usage)
        VALUES (#{apartmentId}, #{readingDate}, #{energyUsage})
    </insert>
</mapper>

4. Service层接口及其实现类

定义Service层接口及其实现类。

MeterReadingService.java

import java.util.List;

public interface MeterReadingService {
    List<MeterReading> getAllReadings();
    void addReading(MeterReading reading);
}

MeterReadingServiceImpl.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MeterReadingServiceImpl implements MeterReadingService {

    @Autowired
    private MeterReadingDao meterReadingDao;

    @Override
    public List<MeterReading> getAllReadings() {
        return meterReadingDao.getAllReadings();
    }

    @Override
    public void addReading(MeterReading reading) {
        meterReadingDao.addReading(reading);
    }
}

5. Controller层

定义Controller层来处理HTTP请求。

MeterReadingController.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Date;

@Controller
public class MeterReadingController {

    @Autowired
    private MeterReadingService meterReadingService;

    @GetMapping("/readings")
    public String showReadings(Model model) {
        model.addAttribute("readings", meterReadingService.getAllReadings());
        return "readings";
    }

    @PostMapping("/addReading")
    public String addReading(@RequestParam int apartmentId, 
                             @RequestParam String readingDateStr, 
                             @RequestParam double energyUsage) throws Exception {
        MeterReading reading = new MeterReading();
        reading.setApartmentId(apartmentId);
        reading.setReadingDate(new Date(readingDateStr));
        reading.setEnergyUsage(BigDecimal.valueOf(energyUsage));

        meterReadingService.addReading(reading);

        return "redirect:/readings";
    }
}

6. 前端页面

最后,创建一些JSP页面来展示数据并允许用户输入新的读数。

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Apartment Electricity Metering System</title>
</head>
<body>
<h1>Welcome to Apartment Electricity Metering System</h1>
<a href="/readings">View Readings</a>
<br/>
<form action="/addReading" method="post">
    Apartment ID: <input type="number" name="apartmentId"><br/>
    Reading Date: <input type="date" name="readingDateStr"><br/>
    Energy Usage: <input type="number" step="0.01" name="energyUsage"><br/>
    <input type="submit" value="Add Reading">
</form>
</body>
</html>

readings.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Meter Readings</title>
</head>
<body>
<h1>Meter Readings</h1>
<table border="1">
    <tr>
        <th>ID</th>
        <th>Apartment ID</th>
        <th>Reading Date</th>
        <th>Energy Usage</th>
    </tr>
    <c:forEach var="reading" items="${readings}">
        <tr>
            <td>${reading.id}</td>
            <td>${reading.apartmentId}</td>
            <td>${reading.readingDate}</td>
            <td>${reading.energyUsage}</td>
        </tr>
    </c:forEach>
</table>
<a href="/">Back to Home</a>
</body>
</html>

以上代码构成了一套完整的基于SSM框架的公寓电能计量系统的后端与前端基础功能。你可以在此基础上进一步扩展和完善系统功能,比如添加用户认证、细化权限管理、增加统计分析等功能。

以下是整合后的完整代码artifact:

package com.example.model;

import java.math.BigDecimal;
import java.util.Date;

public class MeterReading {
    private Integer id;
    private Integer apartmentId;
    private Date readingDate;
    private BigDecimal energyUsage;

    // Getters and Setters
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getApartmentId() {
        return apartmentId;
    }

    public void setApartmentId(Integer apartmentId) {
        this.apartmentId = apartmentId;
    }

    public Date getReadingDate() {
        return readingDate;
    }

    public void setReadingDate(Date readingDate) {
        this.readingDate = readingDate;
    }

    public BigDecimal getEnergyUsage() {
        return energyUsage;
    }

    public void setEnergyUsage(BigDecimal energyUsage) {
        this.energyUsage = energyUsage;
    }
}

package com.example.dao;

import com.example.model.MeterReading;

import java.util.List;

public interface MeterReadingDao {
    List<MeterReading> getAllReadings();
    void addReading(MeterReading reading);
}

<?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.example.dao.MeterReadingDao">

    <select id="getAllReadings" resultType="com.example.model.MeterReading">
        SELECT * FROM meter_reading
    </select>

    <insert id="addReading" parameterType="com.example.model.MeterReading">
        INSERT INTO meter_reading (apartment_id, reading_date, energy_usage)
        VALUES (#{apartmentId}, #{readingDate}, #{energyUsage})
    </insert>
</mapper>

package com.example.service;

import com.example.model.MeterReading;

import java.util.List;

public interface MeterReadingService {
    List<MeterReading> getAllReadings();
    void addReading(MeterReading reading);
}

package com.example.service.impl;

import com.example.dao.MeterReadingDao;
import com.example.model.MeterReading;
import com.example.service.MeterReadingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MeterReadingServiceImpl implements MeterReadingService {

    @Autowired
    private MeterReadingDao meterReadingDao;

    @Override
    public List<MeterReading> getAllReadings() {
        return meterReadingDao.getAllReadings();
    }

    @Override
    public void addReading(MeterReading reading) {
        meterReadingDao.addReading(reading);
    }
}

package com.example.controller;

import com.example.model.MeterReading;
import com.example.service.MeterReadingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Controller
public class MeterReadingController {

    @Autowired
    private MeterReadingService meterReadingService;

    @GetMapping("/readings")
    public String showReadings(Model model) {
        model.addAttribute("readings", meterReadingService.getAllReadings());
        return "readings";
    }

    @PostMapping("/addReading")
    public String addReading(@RequestParam int apartmentId, 
                             @RequestParam String readingDateStr, 
                             @RequestParam double energyUsage) throws ParseException {
        MeterReading reading = new MeterReading();
        reading.setApartmentId(apartmentId);
        reading.setReadingDate(new SimpleDateFormat("yyyy-MM-dd").parse(readingDateStr));
        reading.setEnergyUsage(BigDecimal.valueOf(energyUsage));

        meterReadingService.addReading(reading);

        return "redirect:/readings";
    }
}

<!-- index.jsp -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Apartment Electricity Metering System</title>
</head>
<body>
<h1>Welcome to Apartment Electricity Metering System</h1>
<a href="/readings">View Readings</a>
<br/>
<form action="/addReading" method="post">
    Apartment ID: <input type="number" name="apartmentId"><br/>
    Reading Date: <input type="date" name="readingDateStr"><br/>
    Energy Usage: <input type="number" step="0.01" name="energyUsage"><br/>
    <input type="submit" value="Add Reading">
</form>
</body>
</html>

<!-- readings.jsp -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Meter Readings</title>
</head>
<body>
<h1>Meter Readings</h1>
<table border="1">
    <tr>
        <th>ID</th>
        <th>Apartment ID</th>
        <th>Reading Date</th>
        <th>Energy Usage</th>
    </tr>
    <c:forEach var="reading" items="${readings}">
        <tr>
            <td>${reading.id}</td>
            <td>${reading.apartmentId}</td>
            <td>${reading.readingDate}</td>
            <td>${reading.energyUsage}</td>
        </tr>
    </c:forEach>
</table>
<a href="/">Back to Home</a>
</body>
</html>




请根据实际情况调整配置文件(如Spring配置文件、MyBatis配置文件等),并确保所有依赖项已正确导入项目中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将simpletex 识别的公式 复制到ppt 中

1&#xff09;点击 复制MathML(word) 2&#xff09;右击粘贴到任意word 中 3&#xff09;将word公式粘到 office (2019) 的ppt 中 线上识别链接&#xff1a;SimpleTex - Snip & Get!

MATLAB 车牌自动识别系统设计 SVM支持向量机方法 车牌识别

基于支持向量机&#xff08;SVM&#xff09;方法的车牌自动识别系统是一种利用SVM算法对车牌进行分类和识别的技术。该系统通过将车牌的图像处理和特征提取与SVM分类相结合&#xff0c;实现车牌的自动检测与识别。 1. 系统概述 车牌自动识别系统旨在从车辆图像中自动识别车牌…

【Redis】集群配置(主从复制 哨兵搭建)

文章目录 集群配置主从复制哨兵搭建 集群配置 Redis 集群提供了三种分布式方案&#xff1a; 主从模式&#xff1a;一个主节点和一个或多个从节点&#xff0c;主节点负责写操作&#xff0c;从节点负责读操作&#xff0c;实现读写分离&#xff0c;分担主节点的压力。 哨兵模式…

“AI人工智能软件开发公司:创新技术,引领未来

大家好&#xff01;今天我们来聊聊一个充满未来感的话题——AI人工智能软件开发公司。这个公司&#xff0c;用大白话说&#xff0c;就是专门研究和开发人工智能软件的地方&#xff0c;它们用最新的技术帮我们解决问题&#xff0c;让生活和工作变得更智能、更便捷。听起来是不是…

智能客户服务:科技如何重塑客户服务体验

在数字化时代&#xff0c;客户对于服务的需求和期望在不断演变。传统的客户服务模式已经难以满足现代消费者对于即时性、个性化和高效性的追求。随着人工智能、大数据、云计算等先进技术的蓬勃发展&#xff0c;智能客户服务应运而生&#xff0c;不仅重塑了客户服务的体验&#…

AI 驱动研发模式升级,蓝凌软件探索效率提升之道

深圳市蓝凌软件股份有限公司&#xff08;以下简称蓝凌软件&#xff09;&#xff0c;自2001年成立以来&#xff0c;一直走在数智化办公领域的前沿。作为国家认定的高新技术企业、知识管理国家标准的参编者以及信创供应商10强之一&#xff0c;蓝凌软件始终以“让组织更智慧”为使…

【leetcode100】二叉树的中序遍历

1、题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 2、初始思路 2.1 思路 中序遍历的顺序是左→根→右&#xff0c;定义一个函数进行遍历 # Definition for …

折旧后将成本中心折旧费调整到订单中

背景&#xff1a;设备原作为通用设备&#xff0c;按成本中心折旧&#xff0c;在12月月结正常折旧后才明确为专用设备&#xff0c;需要按内部订单折旧。 问&#xff1a;折旧能不能冲销。 回复&#xff1a; 在SAP中&#xff0c;折旧凭证是无法直接冲销的。如果折旧计提有误&#…

YOLO11改进 | 卷积模块 | ECCV2024 小波卷积

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文给大家带来的教程是将YOLO11的Conv替…

Vue 3.0 中封装icon组件使用外部SVG图标

通常在企业级项目开发时&#xff0c;所使用的 icon 图标&#xff0c;一共分为两类&#xff1a; 1. element-plus 的图标 2. 自定义的 svg 图标 对于 element-plus 的图标我们可以直接通过 el-icon 来进行显示&#xff0c;但是自定义图标的话却无法正常显示&#xff0c;所以就…

MySQL数据库笔记——多版本并发控制MVCC

大家好&#xff0c;这里是Good Note&#xff0c;关注 公主号&#xff1a;Goodnote&#xff0c;本文详细介绍MySQL的并发控制&#xff1a;多版本并发控制MVCC。 文章目录 背景介绍数据库并发控制——锁机制悲观锁和乐观锁悲观锁乐观锁 数据库并发控制——MVCC 的引入MVCC 和锁机…

PDF怎么压缩得又小又清晰?5种PDF压缩方法

PDF 文件在日常办公与学习中使用极为频繁&#xff0c;可想要把它压缩得又小又清晰却困难重重。一方面&#xff0c;PDF 格式本身具有高度兼容性&#xff0c;集成了文字、图像、矢量图等多样元素&#xff0c;压缩时难以兼顾不同元素特性&#xff0c;稍不注意&#xff0c;文字就会…

面向机器学习的Java库与平台

学习Java语言中与机器学习相关的各种库与平台&#xff0c;了解每个库的功能&#xff0c;以及可以用它 们解决的问题。  实现机器学习应用时需要具备的Java环境  Weka&#xff1a;一个通用的机器学习平台  Java机器学习库&#xff1a;一系列机器学习算法  Apache Mah…

前端CSS3学习

学习菜鸟教程 火狐-moz- 谷歌 Safari -webkit- 前面都加这个&#xff0c;可能才生效 边框 border: 1px solid #ddd 粗细 样式 样色 经常和border-radius 一块用 border-radius: 50px 20px 第一个左右 第二个右左 border-top-left-radius … box-shadow: 10px 5px 10px 0 #88…

【LoRa】长交织Long Interleaver

目录 1 前言2 CR与长交织3 小结 1 前言 在使用Semtech的第三代LoRa芯片&#xff08;LR11xx系列&#xff09;配置参数时&#xff0c;可能会注意到参数CR多出了Long Interleaver参数选项&#xff0c;截取lr11xx_driver代码片段如下&#xff1a; /*!brief LoRa Coding Rate conf…

HAL 库------中断相关函数

HAL_SuspendTick();是对SysTick中CTRL寄存器中TICKINT位清0 HAL_ResumeTick(); 刚好与上面函数相反&#xff0c;对SysTick中CTRL寄存器中TICKINT位置1&#xff0c;恢复stick中断。

IntelliJ Idea常用快捷键详解

文章目录 IntelliJ Idea常用快捷键详解一、引言二、文本编辑与导航1、文本编辑2、代码折叠与展开 三、运行和调试四、代码编辑1、代码补全 五、重构与优化1、重构 六、使用示例代码注释示例代码补全示例 七、总结 IntelliJ Idea常用快捷键详解 一、引言 在Java开发中&#xff…

RabbitMQ端口操作

1、什么是RabbitMQ RabbitMQ 是一种可靠且成熟的消息传递和流式处理代理&#xff0c;易于部署在云环境、本地和本地计算机上。目前&#xff0c;全球有数百万人在使用它。 RabbitMQActiveMQRocketMQKafka公司/社区RabbitApache阿里Apache开发语言ErlangJavaJavaScala&Java…

设计模式 创建型 建造者模式(Builder Pattern)与 常见技术框架应用 解析

单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;又称生成器模式&#xff0c;是一种对象构建模式。它主要用于构建复杂对象&#xff0c;通过将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建出具有不同表示的对象。该模式的核心思想是将…

2、pycharm常用快捷命令和配置【持续更新中】

1、常用快捷命令 Ctrl / 行注释/取消行注释 Ctrl Alt L 代码格式化 Ctrl Alt I 自动缩进 Tab / Shift Tab 缩进、不缩进当前行 Ctrl N 跳转到类 Ctrl 鼠标点击方法 可以跳转到方法所在的类 2、使用pip命令安装request库 命令&#xff1a;pip install requests 安装好了…