在一个程序页面中加几个字段用于增删改查

文章目录

  • 前言
  • 一、单表
    • 步骤1:更新实体类
    • 步骤2:更新DAO层XML
    • 步骤3:更新Service实现类
    • 步骤4:更新Controller层
    • 步骤5:更新前端Vue模型和组件
  • 二、多表
    • 步骤1:新程序的增删改查
    • 步骤2:老程序中新增实体类
    • 步骤3:更新前端页面
    • 步骤4:更新Mapper接口及XML文件
    • 步骤5:更新Service实现类
    • 步骤6:关于Action层


前言

提示:这里可以添加本文要记录的大概内容:

我只知道在一个单表程序中可以加字段,但不知道还可以通过另一张表一起加


提示:以下是本篇文章正文内容,下面案例可供参考

一、单表

在Java Spring Boot后端和Vue前端的前后端分离项目中,为数据库表添加新字段并同步到前端展示与交互的步骤如下

步骤1:更新实体类

假设有一个名为User的实体类,并且你想在这个实体类中添加新的字段。例如要添加一个address字段:

@Entity
public class User {@Data...各种注解// 对应的getter和setter方法private Long id;// 已存在的字段...private String username;private String email;// 新增地址字段private String address;}

步骤2:更新DAO层XML

你可能不需要直接修改DAO接口

但需要更新DAO层的XML文件中的SQL语句,其实就是在selectinsertupdate方法中加上那个新增的字段

步骤3:更新Service实现类

在Service层中,可以考虑是否需要添加涉及新字段的业务逻辑方法。

比如导入功能等,这时候就需要把新增的字段加上去

@Service
public class UserService {@Autowiredprivate UserRepository userRepository; // 或UserDao// 新增一个根据地址查询用户的业务方法(如果需要)public Optional<User> findUserByAddress(String address) {return userRepository.findByAddress(address);}
}

步骤4:更新Controller层

在Controller层 可以 提供API以返回包含新字段的数据给前端。

@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;// 假设已有获取单个用户信息的API@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {return ResponseEntity.of(userService.getUserById(id));}// 添加一个根据地址查询用户的API(如果前端需要)@GetMapping("/by-address/{address}")public ResponseEntity<User> getUserByAddress(@PathVariable String address) {return ResponseEntity.of(userService.findUserByAddress(address));}
}

也可以在模糊查询、排序、状态枚举中加上

步骤5:更新前端Vue模型和组件

如果前端或其他客户端需要访问这个新字段,记得在客户端代码中也相应地添加处理逻辑和展示新字段的内容。

在前端Vue应用中:

  1. 更新user模型以反映后端的新字段:
// 在store/modules/user.js或者类似的Vuex状态管理文件中
const state = {// ...user: {id: null,username: '',email: '',// 添加新字段address: ''},// ...
};
  1. 更新获取用户信息的API调用,在axios请求中接收新字段:
// 在Vue组件内部或者其他负责获取用户信息的地方
axios.get(`/api/users/${userId}`).then(response => {this.user = response.data;
});
// 或者根据新的API路径获取
axios.get(`/api/users/by-address/${address}`).then(response => {this.user = response.data;
});
  1. 在Vue组件模板中显示新字段:
<template><div><!-- ...其他内容 --><p>{{ user.username }}</p><p>{{ user.email }}</p><!-- 显示新添加的地址字段 --><p>{{ user.address }}</p><!-- ...更多内容 --></div>
</template>
  1. 如果有相关的表单用于编辑用户信息,也需要在表单控件中添加对应的新字段输入。
<template><div><!-- ...其他组件内容 --><form @submit.prevent="onSubmit"><!-- 已存在的用户名输入框 --><label for="username">用户名</label><input type="text" id="username" v-model="user.username"><!-- 已存在的邮箱输入框 --><label for="email">邮箱</label><input type="email" id="email" v-model="user.email"><!-- 新增地址输入框 --><label for="address">地址</label><input type="text" id="address" v-model="user.address"><!-- 提交按钮 --><button type="submit">保存更改</button></form></div>
</template><script>
export default {data() {return {user: {// ... 其他已有属性address: '', // 添加新字段},};},methods: {onSubmit() {// 发送更新用户的API请求this.$axios.put(`/api/users/${this.user.id}`, this.user).then(response => {// 更新成功后的处理...}).catch(error => {// 处理错误...});},},
};
</script>

这里,我们首先在模板中的表单里添加了一个新的<input>元素,并将其v-model绑定到user对象的address属性上。这样,当用户在表单中输入地址时,Vue会自动同步到组件的数据模型。

同时,在methods部分的onSubmit方法中,当表单提交时,前端会通过axios向后端发送PUT请求,包含所有表单字段(包括新添加的address字段),以便于在后端更新用户信息。

完成以上步骤后,重新构建并部署后端服务以及前端应用。这样,前端就能正常地展示、处理和保存后端添加的新字段了。

二、多表

在基于SSM(Spring、Spring MVC、MyBatis)和Struts 2的传统Java Web项目中,为User实体类添加来自另一张表的字段并同步到前端展示与交互,步骤如下:

以某一支完整程序为基础,增加一张表,在那只完整程序内新增、修改、查看页面内增加新表字段,下面用【老程序/表】和【新程序/表】说明,用于区分

因为是在老程序中增加新的字段,这两个程序的表有关联关系一对一对应

思路: 新增的那张表也要有增删改查,因为一开始的老程序自己有一套完整的增删改查,是在老程序的新增、修改、查看页面加上新表中的字段

  1. 设计新程序
  2. 在老程序中加新字段,用于赋值给新程序
  3. 在老程序前端页面中加新字段,用于编辑页和查看页
  4. 在老程序的Mapper.xml 文件中映射新表中的字段,并修改ID查询
  5. 在老程序Spring框架的XML配置文件中(spring.xml)定义Bean(组件)Service 的配置注入新程序的Service ,因为这样老程序的 Service实现类就可以调用新程序的 Service实现类

有问题先排查是前端还是后端问题,在Action中Debug看前端数据有没有过来,没过来就是前端问题

在后在程序的修改中要注意,我是通过新程序的关联字段连接老程序的ID主键查询的

步骤1:新程序的增删改查

仿照老程写一套新程序后端的增删改查,其中要加一个ID,与老程序中主键ID对应。因为在老程序页面中的新增和修改要走新程序的代码,只有查看(根据ID查询)要在老程序的SQL中写

步骤2:老程序中新增实体类

在老程序的实体类中新增新表字段,用于后期实体类赋值

public class 老程序实体名 {
// 这是老程序private Long id;private String username;private String email;// 新增新表的地址字段private String address;private String state;// 关联字段private String strGuid;// 对应的getter和setter方法
}

步骤3:更新前端页面

  1. 前端的编辑和新增页一般是同一个页面
  <div><label>地址</label><div><input name="address" id="address" class="form-control" type="text"maxlength="50" value="<s:property value="老程序实体名.address"/>"></div></div>

address:这是新表中的字段,需要加在老程序中的
name="address":设置输入框的名称
id="address":设置输入框的ID
type="text":指定这是一个文本输入类型
maxlength="50":限制用户最多可输入50个字符
value="<s:property value="老程序实体名.address"/>":这里是Struts2标签,用于从后端Java对象老程序实体类中获取并显示当前的地址到输入框中。如果【老程序实体名.address】有值,那么初始状态下该输入框会显示该值

  1. 前端的查看页要注意一下

如果有枚举类型字段要按下面格式:

<div>
// 状态明明是新加的字段,却要用老程序的实体名,因为要与后端参数保持一致<s:if test="老程序实体名.state==1"><div class="abc" title="同意">同意</div></s:if><s:if test="老程序实体名.state==2"><div class="abc" title="不同意">不同意</div></s:if>
</div>

如果有系统代码字段要按下面格式:

// 这里要用Name<s:property value="老程序实体名.系统字段名Name"/>

步骤4:更新Mapper接口及XML文件

先在Mapper.xml文件中映射新表中的字段,这个一定不要忘,否则后面功能不会实现

<!-- 假设你的Mapper接口名为NewTableMapper -->
<mapper namespace="com.example.mapper.NewTableMapper"><resultMap id="newFieldResultMap" type="com.example.entity.NewTableEntity"><!-- 已有字段映射... --><result property="newField" column="NEW_FIELD"/><!-- 新加的字段映射... --><result property="newExample" column="NEW_EXAMPLE"/></resultMap>
</mapper>

在XML文件中编写SQL语句(根据ID查询),确保通过LEFT JOIN查询关联的关联字段信息。
对于字段中有系统代码的不要忘了系统代码表的系统代码名称字段

步骤5:更新Service实现类

在 Service里调用,不要在 Action里面调用,有事务影响;
只有insert、update开头的方法名才会开启事务。

在老程序的服务层(ServiceImpl)中注入新程序的Service实例,以便调用新程序的业务逻辑。

先在老程序Service的Bean实例中,新注入的新程序 Service,这样在老程序ServiceImpl类的业务逻辑中就可以直接使用新程序Service接口提供的服务了

<bean id="userService" class="com.example.service.impl.UserService"><property name="userDao" ref="userDao" /><!--新注入的新程序 service --><property name="newTableService" ref="newTableService" />
</bean>

修改老程序服务层中添加和修改等方法,在保存或更新用户的同时处理新表记录的插入或更新。(在老程序的服务层实现类中的新增、修改方法内加上新程序的字段)

@Override
public User addUser(User user) {// ... 省略验证和老表数据处理// 通过UserDao接口将新用户保存到数据库this.userDao.insertUser(user);// 下面是调用新程序中的方法,老实体类的值赋值给新实体类NewTable newRecord = new NewTable();newRecord.setUserId(user.getId());newRecord.setAddress(user.getAddress());newRecord.setEmail(user.getEmail());this.newTableService.insertNewTable(newRecord);return user;
}// 修改方法也是一样,但是修改有一个ID查询,我这里的ID查询是用的关联字段
@Override
public User updateUser(User user) {// ... 省略验证和老表数据处理userDao.updateUser(user);// 下面是调用新程序中的方法NewTable newRecord = new NewTable();newRecord.setId(获取新表记录ID);newRecord.setAddress(user.getAddress());newRecord.setEmail(user.getEmail());this.newTableService.updateNewTable(newRecord);return user;
}

步骤6:关于Action层

查前后端问题先Debug Action层,没有数据就说明前端数据没有传过来,是前端问题。

不要忘记Action层内也有Setter、Getter(新增字段中可能有系统代码)

完成以上步骤后,重新编译部署项目,并确保前端JSP页面能够正确加载和展示新字段的信息。同时,注意如果在表单中有编辑功能,也需要相应地添加对新字段的处理逻辑。

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

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

相关文章

学习python笔记:7,操作excel表格,生成柱状图,

注意&#xff1a; 注意xlsx的格式&#xff0c;wps一定另存为xlsx才可以&#xff0c;不然就出错。 操作表格 1&#xff0c;在终端里面安装openpyxl pip install openpyxl import openpyxl as xl from openpyxl.chart import BarChart,Reference#注意xlsx的格式&#xff0c;wps…

MySQL语法分类 DDL(1)

DDL&#xff08;1&#xff09;(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所…

【DiffusionModel系列】Sora揭底系列模型介绍 (VAE/DDPM/SD/DiT/Sora)

飞书PPT链接 简介 该文档介绍了几种深度学习模型&#xff0c;特别是那些在图像合成和处理方面有显著应用的模型。文档内容涉及变分自编码器&#xff08;VAE&#xff09;、去噪扩散概率模型&#xff08;DDPM&#xff09;、稳定扩散&#xff08;Stable Diffusion&#xff09;、…

物联网竞赛板CubMx全部功能简洁配置汇总

目录 前言&#xff1a;1、按键&LED灯配置&#xff1a;2、OLED配置&#xff1a;3、继电器配置&#xff1a;4、LORA模块配置&#xff1a;5、矩阵模块&#xff1a;6、串口模块&#xff1a;7、RTC配置&#xff1a;8、ADC模块配置&#xff1a;9、温度传感器模块&#xff1a;后续…

cartographer学习与使用

记录一下在配置和使用cartographer建图时遇到的各种问题吧。 我的数据 配置文件&#xff1a; my_rslidar.launch <launch> <param name"/use_sim_time" value"false" /> <!--启动建图节点--> <node name"cartographer_n…

旋转花键的制造工艺

旋转花键的制造工艺是一门精细的技术&#xff0c;涉及多个步骤和精细的操作&#xff0c;以确保最终产品的质量和性能&#xff0c;下面简单介绍下旋转花键的制造工艺。 1、原材料准备&#xff1a;制造旋转花键的核心是选择合适的材料&#xff0c;根据花键的规格和性能要求&#…

MATLAB 矩阵

【MATLAB】&#xff08;四&#xff09;MATLAB在线性代数中的应用_线性代数在matlab中的应用-CSDN博客 矩阵的秩 rank rank&#xff08;a&#xff09; 矩阵的逆矩阵 inv inv&#xff08;a&#xff09; 矩阵的特征值eig和特征向量D [V,D]eig(a) 特征值 deig(a) 特征向量D [V…

考研C语言复习进阶(6)

目录 1. 程序的翻译环境和执行环境 2. 详解编译链接 2.1 翻译环境 ​编辑​编辑 2.2 编译本身也分为几个阶段&#xff1a; 2.3 运行环境 3. 预处理详解 3.1 预定义符号 3.2 #define 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 2.2.3 #define 替换规则 3.2.4…

流水线式并行加速

入门级的并行加速一般会以一个大数组的计算来举例。这种并行加速的方式适用于大量数据的复杂计算&#xff0c;而且这些计算必须是重复的。然而大多数的程序并不会遇到大量数据的相同计算&#xff0c;这种入门级的并行加速就显得无用武之地。 其实并行加速的模型是对一个任务矩阵…

blender 使用“Shape Keys”(形状键)

【Blender教程】形态键动画_哔哩哔哩_bilibili 准备人头模型 首先需要一个人头的基础网格模型,包含眼睛、嘴巴等部位进入编辑模式,确保顶点布局合理,待会儿需要移动这些顶点设置相对形状关键帧 切换到物体数据属性面板,选择Shape Keys选项卡默认情况下只有一个基础形状关键帧点…

uniapp 分包

在uniapp项目中的根目录下找到pages.json文件夹&#xff1a; {"pages": [ {"path": "pages/index/index","style": {"navigationBarTitleText": "index"}}],// 分包"subPackages": [{"root"…

Lua中文语言编程源码-第二节,更改lbaselib.c基础库模块, 使Lua支持中文关键词(与操作相关的)

源码已经更新在CSDN的码库里&#xff1a; git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的lbaselib.c&#xff0c;是Lua的基础库模块。 增加中文保留字标识符列表&#xff0c;保留英文保留字标识符列表。 搜索luaB_collectgarbage函数: 控制和查询Lua垃圾回…

算法中出现的一些报错及其处理办法

Exception in thread “main” java.lang.UnsupportedOperationException 源代码是 Scanner s new Scanner(System.in);int target s.nextInt();Set<Integer> set new HashSet<>();for(int i0;i<target;i)set.add(s.nextInt());List<Integer> list s…

基础练习题之函数

前言 这些题目来自与一些刷题网站,以及c primer plus,继续练习 第一题 给你一个数&#xff0c;让他进行巴啦啦能量&#xff0c;沙鲁沙鲁&#xff0c;小魔仙大变身&#xff0c;如果进行变身的数不满足条件的话&#xff0c;就继续让他变身。。。直到满足条件为止。 巴啦啦能量…

SQLiteC/C++接口详细介绍之sqlite3类(十五)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十六&#xff09; 47.sqlite3_set_authorizer 用法&#xff…

11.进程的同步与互斥

11.进程的同步与互斥 计数信号量及其初始化 和王道里面学的PV操作一摸一样,带个count变量,带个阻塞队列 //D:\code\x86\code\start\start\source\kernel\include\ipc\sem.h #ifndef OS_SEM_H #define OS_SEM_H#include "tools/list.h"/*** 进程同步用的计数信号量*…

BswM模块配置指导

文章目录 BswM配置的分类自动配置:通信控制Rule:CC_ComMChannel_Rx自动配置:Ecu状态处理自动配置:模块初始化其他配置总结BswM模块是基础软件的模式管理模块,模式/状态控制都是由BswM模块进行,其实现的方式是通过 “请求-仲裁-执行”三步完成。本篇基于基本Can通信所用到…

string.h主要函数汇总

大家点击蓝色的连接就可以跳转查看了&#xff1a; strcpy,strncpy strchr strncmp strcmp strcat strncat strstr

2024计算机二级6

1.基本路径测试是属于白盒测试方法且是动态测试&#xff0c;静态测试不实际运行软件&#xff0c;主要通过人工进行分析。动态测试就是通常所说的上机测试&#xff0c;通过运行软件来检验软件中的动态行为和运行结果的正确性。百合测试的主要技术有逻辑覆盖测试、基本路径测试。…

UE5.1_自定义配置文件读取

UE5.1_自定义配置文件读取 读取配置文件时常规项目都会要求考虑的一个问题,然我接触过的UE类项目还真没考虑过,最近有个想法,奈何比较费劲,利用网上的教程跟进一下试试? 先基于Actor创建c++类(应该大家都会的吧),然后就是一下代码: MyConfig.h // Fill out your c…