当前位置: 首页 > news >正文

DIY项目-校遇

本文主要记录开发过程中遇到的问题。

1、配置问题

问题描述根因分析解决办法
子模块无法识别父模块子模块<parent>没声明或声明不正确子模块的<parent>换成父模块的相应信息
构建报错:Invalid packaging for parent POM ... must be "pom" but is "jar"父模块 pom.xml 未声明 <packaging>pom</packaging>,或被 Maven 当成 jar 项目

在父 pom.xml 显式添加 <packaging>pom</packaging>

报错依旧存在(父已写 packaging=pom父模块 没有 <modules> 声明,Maven 不识别子模块,仍尝试按 jar 构建在父 pom.xml 中加入 <modules><module>子目录名</module></modules>
子模块 pom.xml 在 IDEA 中显示 红色IDEA 未将该目录识别为 Maven 子模块;常见原因:

① 补全 <modules>

不知道 <modules> 里应该填什么误以为是 artifactId 或 name,实为子模块目录名<module>xiaoyu-server</module> 只需与磁盘文件夹名保持一致即可

2、满足序列化与反序列化的前置要求:

不是必须@Data,但不加就要自己写全套样板代码(getter/setter/toString/equals/hashCode)。
嵌套类同理:只要它需要被 Jackson 序列化/反序列化,就必须提供无参构造 + getter/setter;否则 Jackson 会抛异常。

场景结果
JSON → 对象(反序列化)Jackson 通过 无参构造 创建对象,然后调用 setter 赋值
对象 → JSON(序列化)Jackson 通过 getter 读取字段值。
Spring 数据绑定同 Jackson,依赖 setter;没有则绑定失败。

3、Mybatis-plus应用场景下自定义sql的分页查询

要点说明备注
插件名称PaginationInnerInterceptorMP 3.4+ 默认配置
启用方式Spring Boot 自动配置已默认注入,无需手动多数据源时需为每个 SqlSessionFactory 单独注册
(自动进行分页查询)触发条件【本质是添加limit】Mapper 方法第一个参数必须是 Page<T>顺序错了就不会分页
拦截点Executor.query(...)利用 MyBatis 官方 Interceptor 链
执行流程1. 自动 COUNT → 2. 方言改写 SQL → 3. 查询 → 4. 封装结果对开发者透明
返回类型同一个 Page<T> 对象(参数即返回值)里面包含 recordstotalcurrentsize
复杂 SQL 支持支持 JOIN、UNION、子查询、WITH 等只要通过 Mapper 接口调用
自定义 COUNT写同名 _COUNT XML/注解语句,插件优先使用解决 COUNT 性能问题
内存分页可强制开启(极少用)interceptor.setOverflow(true)
常见错误手写 LIMIT / OFFSET 导致重复分页不要自己拼分页关键字
多数据源每个数据源注册自己的 PaginationInnerInterceptor 并指定 DbType例:DbType.MYSQLDbType.ORACLE
与 MyBatis 原生区别原生需手动写两条 SQL(COUNT + LIMIT);MP 自动完成

4、mybaits对嵌套类的封装

步骤关键点示例代码 / 值备注
1. SQL 别名避免列名冲突u.id AS user_id多表同名列必做
2. resultMap 类型外层 VO 全限定名type="com.xiaoyu.vo.BlacklistsVO"对应最外层实体
3. 主键标记用 <id> 而非 <result><id column="id" property="id"/>主键必须写 id,否则缓存/懒加载异常
4. 普通列用 <result><result column="created_at" property="createdAt"/>非主键一律 result
5. 嵌套对象类型静态内部类写法
<association property="targetUser" javaType="com.xiaoyu.vo.BlacklistsVO$BlackUserInfo">
字节码分隔符是 $
6. association 内部主键同样用 <id><id column="target_id" property="id"/>内部类主键也要 id 标签
7. association 内部普通列用 <result><result column="avatar_url" property="avatarUrl"/>内部类非主键用 result
8. 使用查询引用 resultMap<select id="getBlackList" resultMap="BlackListMap">不再用 resultType

判断是不是association 内部主键

步骤要确认的问题如何确认对应标签
① 看数据库这张表真正的主键是哪一列?SHOW KEYS FROM users WHERE Key_name = 'PRIMARY';把查出来的列名写 <id>
② 写 SQL查询语句里是否把主键列查出来?SELECT u.id …若 u.id 是主键,则 <id column="id" …/>
③ 内部类内部类里出现的列需要 <id> 吗?只要这一列在 它所属的那张表 里是主键,就用 <id>例:target_id 是 blacklists 主键 → <id column="target_id" …/>
④ 注解要不要在 BlackUserInfo 上加 @TableId完全不用;MyBatis 只读 XML,内部类不会被当成实体
<resultMap id = "BlackListMap" type = "com.xiaoyu.vo.BlacklistsVO"><id property="id" column="id"/><result property="targetId" column="target_id"/><result property="targetId" column="target_id"/><!--        嵌套对象 :targetUser--><association property="targetUser" javaType="com.xiaoyu.vo.BlacklistsVO$BlackUserInfo"><id property="id" column="target_user_id"/><result property="nickname" column="nickname"/><result property="avatarUrl" column="avatar_url"/></association></resultMap><select id="getBlackList" resultMap="BlackListMap">select b.id, b.target_id, b.created_at, u.nickname, u.avatar_url,u.id as target_user_idfrom blacklists bleft join users u on b.target_id = u.idwhere b.owner_id = #{userId}</select>

5、mybatis-plus对没有主键的表的处理   、 枚举类

解决方式具体做法(代码级)读写示例注意/坑
表没有主键① 改表(最省事)直接加 id 列实体正常写 @TableId(type = IdType.AUTO),MP 全套方法直接可用需要 DBA 权限;旧数据自增从 1 开始
② 不改表(手写 SQL)实体 无 @TableId
插入:@Insert("INSERT INTO t_log(user_id,content) VALUES(#{userId},#{content})") int insertLog(LogPO po); selectById/updateById 等 全失效;只能自己写
枚举存/读库统一做法(两种场景通用)1. 枚举加 code 并标注 @EnumValue写入:po.setStatus(Status.PENDING); // 库内自动存 0 friendshipMapper.insert(po); 忘了 @EnumValue 会存成字符串导致 Data too long;库值与 code 必须一一对应

问题怎么做示例/一句话要点常见坑
表没有主键实体类 不写 @TableId@TableName("t_log") public class LogPO{ @TableField("user_id") private Long userId; ... } 一旦写 @TableId 启动即报错
无主键还能用 MP 吗只能自己写 SQL@Mapper interface LogMapper{ @Select("SELECT * FROM t_log WHERE user_id=#{uid}") List<LogPO> listByUser(Long uid); } selectById/updateById 等 全失效
插入/删除/更新同上,手写方法@Insert("INSERT INTO t_log(...) VALUES (...)") int insertOne(LogPO po);
枚举存数据库数据库放 数字status tinyint用字符串会 报 Data too long
枚举写法给每个枚举加 code 并在 code 上打 @EnumValuepublic enum Status{ @EnumValue private final int code; } 打在 name() 上会被存字符串
实体字段直接写 枚举类型private Status status;无需转换器
条件/插入/查询传 枚举对象 即可.eq(FriendshipPO::getStatus, Status.PENDING)
返回前端中文再定义 desc 并用 @JsonValue与 MP 类型转换 无关

请求中参数转枚举类型

示例调用(GET 查询字符串)

前端只要传 字符串(大小写不敏感),Spring 会自动把 "PENDING" / "accepted" 转成对应的 FriendshipsPO.Status 枚举   ,  举例:

GET /friendlist?page=1&pageSize=20&status=PENDING

SpringMVC 内部流程

"PENDING" → 找 FriendshipsPO.Status.valueOf("PENDING") → 得到 Status.PENDING

GET 参数传枚举 = 传字符串,Spring 自动 valueOf 转换;大小写不敏感,拼写错误即 400。

6、请求体参数的接收问题(请求体中变量很少)

① 前端传来的并不直接就是对象,因此需要@RequestBody来讲HTTP请求体反序列化为Java对象

② 即使请求体中的变量很少,也不能直接用变量名接收,前端传来的是一个“整体”

方式示例是否可行说明
单个 DTOpublic void add(@RequestBody UserDTO dto)✅ 最常用字段多、可校验
单个 Mappublic void add(@RequestBody Map<String,Object> map)✅ 灵活失去类型&校验
单个 Stringpublic void add(@RequestBody String json)✅ 自己手动解析极少用
多个变量public void add(@RequestBody Long userId, @RequestBody String name)❌ 启动即报错只能有一个 @RequestBody
混合接收public void add(@RequestBody UserDTO dto, @RequestParam Long timestamp)请求体 + 查询/路径参数合法

7、什么时候用@Transaction

维度必须加事务不加事务备注
写≥1 次(INSERT/UPDATE/DELETE)包括先查后写、批量写
先写后读(读依赖写结果)如写主键后立即读自增 ID
跨表写(多表先后更新)好友表+消息表、订单表+库存表
跨服务写(本地事务范畴)同一 JVM 内多 Mapper 调用
只读纯查询、报表、导出
只读但调了写方法被调方法已加事务,照样传播进来
批量操作(for 循环写)循环内任何一条失败需整体回滚
含有“状态机”判断再写如先判断余额≥金额再扣款

8、


文章转载自:

http://WbnuB5vM.mszwg.cn
http://tCeCfzQZ.mszwg.cn
http://fuUS092T.mszwg.cn
http://JmnXYYJh.mszwg.cn
http://moshmNAt.mszwg.cn
http://Px6SgerG.mszwg.cn
http://h91Z8Kd6.mszwg.cn
http://2AyPt9aH.mszwg.cn
http://3eJ346DF.mszwg.cn
http://Jtu6ACri.mszwg.cn
http://G2V8Tue6.mszwg.cn
http://7ypVnzV1.mszwg.cn
http://IbhYHpxZ.mszwg.cn
http://37ZY8glQ.mszwg.cn
http://0Rk1PbXS.mszwg.cn
http://ViPgRdpm.mszwg.cn
http://WvayYXgc.mszwg.cn
http://tVX1E57W.mszwg.cn
http://RKcEn6a8.mszwg.cn
http://zY4IrH0a.mszwg.cn
http://SaaPTWzw.mszwg.cn
http://u6IKzpOJ.mszwg.cn
http://4E2pg6vd.mszwg.cn
http://xhqZZrAn.mszwg.cn
http://wXW63kHy.mszwg.cn
http://mPwMTMDM.mszwg.cn
http://GTg3NeHM.mszwg.cn
http://YMo0ezlk.mszwg.cn
http://STmIZ8fI.mszwg.cn
http://DN1xzgyR.mszwg.cn
http://www.dtcms.com/a/375974.html

相关文章:

  • GEO 优化系统开发:技术架构与核心实现方案
  • 【66页PPT】质量管理体系五种核心工具APQP(附下载方式)
  • MySQL InnoDB Cluster介绍,MHA、PXC、InnoDB Cluster怎么选?一文讲透MySQL高可用方案最佳实践
  • Miniconda3搭建Selenium的python虚拟环境全攻略
  • 01背包,完全背包,分组背包,多重背包例题
  • Ansible之playbook
  • MapReduce :Map阶段分区后,数据怎么找到Reducer?
  • 项目研发实录:电子称SDK封装dll给到QT和C#调用
  • 短视频矩阵源码-视频剪辑+AI智能体开发接入技术分享
  • 代码随想录算法训练营第三十五天|背包问题 二维 背包问题 一维 46. 携带研究材料 416. 分割等和子集
  • FTP文件传输服务
  • 代码随想录第七天|● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 18.四数之和
  • SAP R/3系统模块结构
  • leetcode 217 存在重复元素
  • 前端 Word 模板参入特定数据 并且下载
  • LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
  • 深度学习(五):过拟合、欠拟合与代价函数
  • 【JS】import.meta.env,process.env,window三种环境变量获取方式的区别
  • 交付只是起点:从“纸上蓝图”到“价值闭环”的保障实践,数字孪生保障落地的“三重防护网
  • LLM大模型-大模型 API 集成使用、部署本地大模型(huggingface、modelscope)、实现Qwen和Deepseek本地部署
  • Redis的入门与应用
  • pybind11错误书
  • 在 PostgreSQL中查看有哪些用户和用户权限
  • ctfshow- web入门-XXE漏洞
  • 六级第二关———坐地铁(1)
  • 实用 html 小工具
  • C#(链表创建与原地反转)
  • 光伏MPPT——拓扑结构及发波方式
  • Flink通讯超时问题深度解析:Akka AskTimeoutException解决方案
  • 美团核销接口助力第三方供应商拓展市场份额的策略