mybatis支持通过注解(如@select、@insert等)直接在mapper接口中编写sql,替代xml,适用于简单静态场景;提供五类核心注解对应crud操作,支持内联参数、自增主键获取及@provider实现动态sql,但复杂查询、长sql和高级映射仍推荐xml。

MyBatis 支持直接在 Mapper 接口方法上使用注解(如 @Select、@Update 等)写 SQL,完全替代 XML 文件。这种方式适合简单、静态的 SQL 场景,代码更紧凑,省去维护 XML 的开销。
常用 SQL 注解及基本用法
MyBatis 提供了五类核心注解,对应增删改查操作:
-
@Select:用于查询,值为 SQL 字符串,支持内联参数(如
#{id}或${name}) -
@Insert:用于插入,可配合
@Options(useGeneratedKeys = true, keyProperty = "id")获取自增主键 - @Update 和 @Delete:分别执行更新和删除语句
- @SelectProvider、@UpdateProvider 等:适用于动态 SQL,通过外部类生成 SQL 字符串(比 XML 更 Java 化)
单参数与多参数传参方式
接口方法参数默认按名称绑定,但需注意规则:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 单个参数(如
Long id)可直接用#{id}或#{value}引用 - 多个参数必须用
@Param显式命名,否则无法识别:public User selectByNameAndAge(@Param("name") String name, @Param("age") int age);
对应 SQL:@Select("SELECT * FROM user WHERE name = #{name} AND age = #{age}") - 参数是实体类时,直接用属性名:
#{username}、#{email}
处理动态 SQL(不依赖 XML)
纯注解不支持 <if></if> 这类标签,但可通过以下方式实现动态逻辑:
- 用 @SelectProvider 指向一个方法,该方法返回拼好的 SQL 字符串:
@SelectProvider(type = UserSqlBuilder.class, method = "buildSelect") - 在
UserSqlBuilder类中编写 Java 方法,用 StringBuilder 或条件判断拼接 SQL(推荐用 MyBatis 提供的SQL类,更安全):public static String buildSelect(@Param("name") String name, @Param("minAge") Integer minAge) {<br> return new SQL(){{<br> SELECT("*"); FROM("user");<br> if (name != null) WHERE("name = #{name}");<br> if (minAge != null) WHERE("age >= #{minAge}");<br> }}.toString();<br>}
注意事项与限制
注解方式简洁,但也有明显边界:
- 复杂嵌套查询、多表关联且含大量动态条件时,XML 可读性和可维护性更高
- SQL 长度受限于 Java 字符串字面量,超长语句易降低可读性
- 不支持
<resultmap></resultmap>复杂映射定义,若需字段别名、嵌套结果、类型处理器等,仍建议用 XML 或结合@Results注解手动配置 - 所有注解 SQL 在编译期确定,无法运行时修改;而 XML 可热加载(配合刷新机制)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










