如何写最基础的CRUD

本文基于Java,SpringMVC框架。MVC即Model+View+Controller。即使不太确切,我喜欢将其理解为:浏览器与数据库建立联系的方式。(Browser是浏览器,DB是数据库)

Controller 层

  • 掰收序列化信息(JSON)
  • 通过注解进行转换
  • @RequestParam(可默认不写)
    @DeleteMapping
    @ApiOperation("删除分类")
    public Result<String> deleteById(Long id){}
    查询字符串传递id参数:/admin/category?id=1
  • @PathVariable:
    @DeleteMapping("/{id}")//嵌入点
    @ApiOperation("删除分类")
    public Result<String> deleteById(@PathVariable Long id){}
    仅在URL后嵌入参数:/admin/category/1
  • @RequestBody:反序列化为实体类
    @PostMapping
    @ApiOperation("新增分类")
    public Result<String> addCategory(@RequestBody Category category) { // 业务逻辑 }

Service 层

一般来说,Service看有没有接口,有的话直接看Impl实现类会比较具体。

  • 新增(Insert): 需要将业务中的对象封装为程序中的完整实体类,再对应添加完整实体类中应该添加但业务对象缺失的部分(通过拷贝+set方法),好处是可以通过一次Mapper层编写实现不同新增对象的数据操作。(数据完整性/业务隔离/易维护) 说人话:把不健全的变得健全,这样方便数据操作时只用处理健全的一种情况。
  • 删除(Delete): 检查删除业务是否影响其余业务(调用其他Mapper),再进行删除处理
  • 更新(Update): 处理逻辑上与新增相同,封装+填充;但Mapper层有所不同,一般通过if判断需要更新哪些条件(实际上思想也是一致的,将所有情况假设好再使用if与where排除,只需写一次)
  • 查询(Select): Select的业务逻辑并不难,明确好输入参数,以及输出的是参数/对象/列表即可。

Mapper 层

  • 新增:
  Insert into 表名(字段名1,字段名2......) VALUES (#{对应对应参数1},#{对应对应参数2}...)
  • 删除
  Delete from 表名 where id = #{id}

注:若是删除某个属性,其实是通过update的更新逻辑去实现的

  • 更新
  Update 表名 
  SET column_name1 = new_value1,
      column_name2 = new_value2
  WHERE condition;

大部分会在xml进行操作,更加解耦与易管理,因为只需写一次

  • 查询
  Select * from 表名

一般是在xml中操作,需要明确parameterType和resultType会好一些。

Serializable 序列化[基于java]

前言:最近接触的技术慢慢增多,也写了一些方便的技术文档。苦于排版不够系统,干脆对Deepseek提了一些要求,让它重塑我写的这些文档。效果还不错,也拓展了一些还不够了解的知识。因此之后的技术分享很可能以这种形式出现,我自己读着还不错,请多提提意见!

这是我向Deepseek提问的模版:

  • 第一:不说废话,直抒胸臆;
  • 第二:能够给快速上手的人们快速开始的机会,比如多给命令行,支持复制粘贴;
  • 第三:有深度,能够结合实战开发,最好多一些实例;
  • 最后:如果能够引发人们思考更好。

0x00 基础知识(2分钟)

一句话理解:序列化就像把乐高玩具打包成盒子,反序列化就是拆开盒子恢复原样

  • 序列化->具体(对象->数据) 序列化用于将抽象数据转化为网络传输/存储形式(JSON/XML/二进制)
  • 反序列化->抽象(数据->对象) 反序列化主要是将数据抽象,便于业务逻辑处理

传播路径:[数据库] → 反序列化 → [程序处理(业务逻辑)] → 序列化 → [网络传输]

0x01 快速使用(5分钟)

 import java.io.*;
 ​
 // 第一步:实现Serializable接口(空接口)
 class User implements Serializable {  // [!code focus]
 // 第二步:添加版本号
     private static final long serialVersionUID = 1L;  // [!code focus]
     
     private String name;
     private transient String password; // transient不参与序列化
 }
 ​
 // 第三步:序列化对象
 try (ObjectOutputStream out = new ObjectOutputStream(
         new FileOutputStream("user.data"))) {  // [!code focus]
     out.writeObject(new User("张三", "123456"));
 }
 ​
 // 第四步:反序列化
 try (ObjectInputStream in = new ObjectInputStream(
         new FileInputStream("user.data"))) {
     User user = (User) in.readObject();  // [!code focus]
     System.out.println(user.getName()); // 输出"张三"
     System.out.println(user.getPassword()); // 输出null(因为transient)
 }

0x02 核心记忆点

✔️ 建议做

• 给每个类添加serialVersionUID (IDE可自动生成:Alt+Enter → Add serialVersionUID) • 敏感字段用transient修饰

❌ 不要做

• 序列化大对象(超过1MB要考虑其他方案) • 修改已序列化类的字段类型(会报错!)

💡 场景联想

 [数据库] → 反序列化 → [程序处理] → 序列化 → [网络传输]

0x03 常见问题

  1. 检查serialVersionUID是否一致
  2. 确认字段类型没有修改
  3. 删除旧的序列化文件重新生成

症状:反序列化后数据不对

• 检查是否有字段漏加transient • 验证序列化/反序列化代码顺序一致

0x04 新手实验室

实验1:修改serialVersionUID

 - private static final long serialVersionUID = 1L;
 + private static final long serialVersionUID = 2L;

观察反序列化时的报错信息

实验2:移除transient

 - private transient String password;
 + private String password;

查看反序列化后的密码值

0x05 未来升级入口(我将后续补充)

进阶预备区

• 高性能方案 → Protobuf • 安全方案 → 白名单校验 • 分布式方案 → 版本兼容策略

当前进度:🟢 基础掌握(可进行项目开发)

如何快速上手宝塔面板?

近期配了台服务器,但还没有系统尝试过Linux系统中的复杂部署,更不懂得运维,甚至连远程SSH连接都极少使用。本文将会以快速上手为目的,使用宝塔面板完成第一次服务器部署。

注意:安装宝塔面板前请确保服务器是全新的!此处服务器页面演示以阿里云为例,其余厂商名词基本相同,照着提示词做即可,无需追求页面一致。

  • 1.在云服务器厂商中获取服务器的公网IP(不用关闭网页,后面还会用到)
  • 2.修改服务器的密码,为自己所知
  • 3.打开云服务器页面,在左侧边栏找到安全组并点击进入(不用关闭网页,后面还会用到)
  • 4.打开宝塔网址,根据自己的系统(Linux/Windows)选择对应产品
  • 5.选择对应产品后,可能会被指引到此处
  • 6.不用急着操作,我们选择更加快捷的在线安装。你只需要继续往下滑动鼠标,就会看到:
  • 7.接下来,回到第一步的网站,把公网IP复制粘贴进来在线安装界面,并使用自己第二步设置好的密码。做到这里,请不要点击立即安装
  • 8.回到第三步的网站,点击管理规则
  • 9.开放两个端口:
    22–用于SSH连接
    8888–用于宝塔面板
    详细操作:
    在目的后填写端口号:22,源选择所有IPV4,然后保存。
    同样步骤,在目的后填写端口号8888端口,源选择所有IPV4,保存。
  • 10.回到第七步,可以点击立即安装。若需要注册宝塔账号则跟着注册即可。
  • 11.服务器端已经下载了宝塔面板,你可以通过[IP地址]:[端口号(一般就是8888)]进行访问,比如192.168.0.1:8888
    现在你已成功安装宝塔面板!