(12)基于注解实现的sql

✅ 一、注解写 SQL(无需 Mapper.xml

MyBatis 支持直接在 Mapper 接口上用注解写 SQL:

java 复制代码
public interface UserMapper {

    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectById(Long id);

    @Insert("INSERT INTO user(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);

    @Update("UPDATE user SET name = #{name} WHERE id = #{id}")
    int update(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    int delete(Long id);
}

✅ 优点:简单、轻量、无 XML 文件

❌ 缺点:复杂 SQL 难维护(比如多表关联、动态条件)


✅ 二、XML 写 SQL(传统方式)

SQL 写在 UserMapper.xml 中:

xml 复制代码
<select id="selectByCondition" resultType="User">
  SELECT * FROM user
  <where>
    <if test="name != null">AND name LIKE CONCAT('%', #{name}, '%')</if>
    <if test="age != null">AND age = #{age}</if>
  </where>
</select>

✅ 优点:支持动态 SQL(<if> <foreach> 等)、可读性强、易调试

❌ 缺点:需要额外 XML 文件


🎯 三、使用场景对比(大厂真实实践)

场景 推荐方式 原因
简单 CRUD(单表、无条件) ✅ 注解 快速开发,减少文件数量
带动态条件的查询(如搜索) ✅ XML 注解不支持 <if>,拼字符串易错且难维护
多表关联 / 复杂 JOIN ✅ XML SQL 长,XML 更清晰
需要 <resultMap> 处理字段映射 ✅ XML 注解中写 @Results 极其繁琐
团队协作 / 代码审查 ✅ XML SQL 集中管理,便于 DBA 审核
SQL 需要频繁调整 ✅ XML 不用改 Java 代码,热更新更方便

⚠️ 四、大厂规范建议

  1. 禁止在注解里拼接动态 SQL (如 "SELECT * FROM user WHERE 1=1 " + (name != null ? "AND name=..." : ""))→ 容易出错、无法预编译、有注入风险。
  2. 统一风格 :一个 Mapper 要么全用注解,要么全用 XML,不要混用(除非极特殊场景)。
  3. Spring Boot 项目 :即使使用注解,也建议开启 mapUnderscoreToCamelCase,避免字段名不匹配。

✅ 五、一句话总结

简单 SQL 用注解,复杂 SQL 用 XML。
大厂项目 90% 以上用 XML ------ 可维护性 > 少写一个文件。

如果你只是学习或写 demo,注解很方便;但一旦进入真实业务(尤其是带搜索、分页、关联查询),XML 是唯一合理的选择

相关推荐
那个失眠的夜1 天前
Mybatis延迟加载策略
xml·java·数据库·maven·mybatis
身如柳絮随风扬1 天前
MyBatis 插件原理详解:从拦截器到动态代理,手写一个分页插件
java·mybatis
小江的记录本2 天前
【JEECG Boot】 JEECG Boot——数据字典管理 系统性知识体系全解析
java·前端·spring boot·后端·spring·spring cloud·mybatis
wuqingshun3141592 天前
说一下mybatis里面#{}和${}的区别
java·spring·mybatis
小江的记录本2 天前
【JEECG Boot】 《JEECG Boot 数据字典使用教程》(完整版)
java·前端·数据库·spring boot·后端·spring·mybatis
小江的记录本2 天前
【JEECG Boot】 JEECG Boot 数据字典管理——六大核心功能(内含:《JEECG Boot 数据字典开发速查清单》)
java·前端·数据库·spring boot·后端·spring·mybatis
小江的记录本2 天前
【JEECG Boot】 JEECG Boot——Online表单 系统性知识体系全解
java·前端·spring boot·后端·spring·低代码·mybatis
MaCa .BaKa2 天前
44-校园二手交易系统(小程序)
java·spring boot·mysql·小程序·maven·intellij-idea·mybatis
java1234_小锋2 天前
Java高频面试题:MyBatis如何实现动态数据源切换?
java·开发语言·mybatis
小旭95272 天前
SpringBoot + 七牛云 + Quartz:图片存储与定时清理
java·spring boot·后端·mybatis