x
又来牢java了,现在倒计时5天了,我觉得我应该先至少看完web了再来写,不然纯无头苍蝇,但是没时间了www
comId为什么要设计成整数类型,万一一个队长参加多个比赛呢,是不是说明可以用comId作为查询参数查询比赛信息和团队信息
那就是说 一个用户只能属于一个比赛
team表里面的captainId是不是对应user里面的user Code
team.captainId 应该对应 member 表里的 id
User 里:
userCode是 string- 但 team.captainId 是 integer
类型就对不上(除非你强行转换,但那属于反常设计)。
而且 Member 里已经有 isCaptain 字段,说明“队长身份”是在 Member 这一层表达的,不是在 User 这一层。
创建队伍时,会先插入 member(队长那条),拿到 member.id
然后把这个 member.id 存到 team.captainId
并且 member.isCaptain=1
实体比dto多个创建时间
如果实体和要设计的dto属性完全一样,是不是可以不写dto直接传实体
那为什么还要 DTO?
因为:
实体 ≠ 接口参数模型
实体是:
👉 数据库模型
👉 持久层对象
👉 直接映射表结构
DTO 是:
👉 接口交互模型
👉 业务输入输出模型
👉 专门为接口设计
什么时候必须用 DTO?
当出现:
- 有密码字段
- 有权限字段
- 有隐藏字段
- 有组合字段
- 前端字段和数据库字段不完全一样
- 要做接口版本控制
那就必须用 DTO。
那我 那我建个dto吧
controller里写的方法和service写和调用的方法尽量保持一致
1 | @Insert("INSERT INTO member(name, studentId, teamId, academyId, phone, isCaptain) values(#{name}, #{studentId}, #{teamId}, #{academyId}, #{phone}, #{isCaptain})") |
写一个小小insert还要用到自动填充和枚举,不太懂什么时候用
如何让添加成员的id自增
建表时这样写
1 | CREATE TABLE member ( |
关键就是:
1 | AUTO_INCREMENT |
如果表已经创建怎么办?
用 ALTER:
1 | ALTER TABLE member |
我想根据member里面的teamid查team信息,但是不知道怎么传进去,那还说啥,用comid传吧
id不是自增的吗
dto里面不加data注解的后果就是收不到post传参值
没有 setter = 无法赋值 = 全 null
试了半天我觉得是apifox的问题,结果py脚本上了还是不行,那就是我代码写错了
最近在测试一个接口的时候出现了一个参数不管怎么传都进去的问题,巨坑!!!
一开始我以为是参数名写错了,我又复制了一遍没有问题。结果用 postman 请求还是不行,后面又debug拦截异常捕获的代码。
搞了好久,各种重启、清楚缓存,还是没解决这问题。后面才发现原来是这个 @RequestBody 包引入成了 Swagger 的了
1 | #{}是传过来的值 |
惨痛教训要按逻辑顺序来,先建表再查表
方法和对象开头别大写
这个错误表明Spring AOP无法找到名为autoFillPointCut的切入点定义。让我检查并修复相关的Aspect类。
发现问题了!在第30行的autoFillPointCut()方法缺少@Pointcut注解。这是导致错误的根本原因。
这种默认返回:
1 | { |
说明 请求体反序列化失败 / 校验失败 / 参数绑定失败。
DTO 字段类型/命名对不上(导致 JSON 转对象失败)
你发送的 JSON 里有:
memberIds: [7]instructorIds: [64, 40]createTime: "2026-02-24 13:25:04"
如果你的 UpdateTeamDTO 里:
memberIds不是List<Integer/Long>(而是 String 或别名)createTime是LocalDateTime但没有正确格式注解
就会直接 400。
最快验证:看控制台有没有类似:
HttpMessageNotReadableExceptionJSON parse errorFailed to convert value
问题分析: MyBatis不知道如何将List
解决方案:
修改UpdateTeamMapper,将List转换为JSON字符串:
BeanUtils 只能复制:
✔ 字段名相同
✔ 类型相同
如果类型不同(String → List 或 List → String)
它是不会帮你转换的。
所以就成了 null。
这个错误表明getByTeamId方法返回了多条记录,但使用的是selectOne()方法,该方法期望只返回一条记录或null。
错误分析:
TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
说明根据teamId查询到了3条记录,但代码期望只有一条
解决方案:
方案1:修改Mapper方法返回List(推荐)
然后是修改成员信息
body 里又传了 teamId,其实是多余的,路径里已经有了。
mapper.xml 文件是 MyBatis 中的 映射文件,用于定义 SQL 语句、SQL 查询 和 SQL 操作,并将它们与 Mapper 接口 中的方法绑定。简而言之,mapper.xml 使得 MyBatis 能够执行自定义的 SQL,并将 SQL 查询与 Java 方法进行关联。
什么时候使用 mapper.xml?
1. 需要编写复杂 SQL 时
当你需要编写复杂的 SQL 查询、更新、删除等操作,尤其是涉及 多表联查、子查询、复杂条件判断等情况下,mapper.xml 会非常有用。在这些情况下,写 SQL 语句的灵活性远大于在 Java 代码中写注解的方式。
2. 自定义 SQL 语句
如果你想对 SQL 语句进行精细控制,或想将一些特定的查询分开处理,可以通过 mapper.xml 编写自定义 SQL。
3. 避免代码冗余
当需要在多个方法中复用相同的 SQL 时,使用 mapper.xml 可以集中管理 SQL 语句,避免重复代码。
4. 动态 SQL
MyBatis 提供了 <if>、<choose>、<foreach> 等动态 SQL 标签,这些标签在 XML 文件中使用时可以更加灵活地处理复杂的 SQL 条件查询。
何时不需要 mapper.xml?
-
简单的 SQL 操作
如果你的操作非常简单,只涉及基本的增、删、改、查,且不需要太复杂的 SQL 逻辑,你完全可以直接通过 注解 来定义 SQL,而不需要创建mapper.xml文件。这样写法简单,代码清晰。1
2
3
4
5
6
7
8@Mapper
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
void insertUser(User user);
} -
使用 MyBatis-Plus 等框架
如果你使用了 MyBatis-Plus 等框架,这些框架已经封装了很多常见的操作(例如select、insert、update等),在这种情况下,你通常不需要手动编写mapper.xml,因为框架会自动帮你生成 SQL。
mapper.xml 示例
1. 基础的增、删、改、查
1 | <mapper namespace="com.julien.mapper.UserMapper"> |
2. 动态 SQL(<if>、<where>、<foreach> 等)
1 | <mapper namespace="com.julien.mapper.UserMapper"> |
3. 批量插入
1 | <mapper namespace="com.julien.mapper.UserMapper"> |
这回我搞个高级的xml if判断
等等,还得学习自动填充切面,算了先简单的做好再做别的吧
1 | java: com.julien.service.impl.PlayServiceImpl不是抽象的, 并且未覆盖com.julien.service.PlayerService中的抽象方法update(java.lang.Integer,com.julien.dto.UpdateMemberDTO |
member比vo属性多并且属性和vo有不同的academy,所以返回null吗,要求返回academy名字,所以还要根据academy_id查询academy表,图片是academy表
Member 类和 VO 类的属性不完全一致,特别是 academyId,它可能是一个外键,指向 academy 表,但在返回数据时没有通过查询 academy 表来获取实际的 academy 名字。
需要在查询数据时联结 academy 表,通过 academyId 来获取对应的 academy 名字。
现在队长功能正式完结,开始做超级管理员的
如有错误,多多指教