MyBatis
一、自增 ID 插入规则
二、SQL 占位符核心规范
1. 优先使用#{}(预编译占位符)
- 天然防止 SQL 注入,自动做类型转换、加引号,是开发默认选择;
- 绝对禁止 Java 代码中用+号拼接 SQL 参数,存在严重注入风险。
2. 特殊场景使用${}(字符串拼接)
- 仅用于SQL 标识符 / 关键字动态替换(表名、列名、排序字段 / 方式),如order by ${sortField} ${sortType};
- 必须做白名单校验(仅允许合法值传入),禁止直接接收前端原始输入,避免注入。
3. AS 别名使用原则
- 普通单表 CRUD无需使用,查原生字段,后端 / 前端做字段适配,符合分层设计;
- 必须使用场景:聚合查询(count(*) as total)、联表查询(解决字段重名)、复杂子查询(外层需引用内层结果)。
三、MyBatis 核心传参规则(无 @Param)
1. 传单个实体类对象(最常用)
- #{占位符名} 必须与实体类属性名严格一致(MyBatis 通过 getter/setter 取值,区分大小写);
- 与 Mapper 方法入参变量名无关(如int add(User u),入参名 u 不影响匹配);
- 编译期无语法错误,属性名不匹配时运行时报错(提示找不到对应的getter方法)。
2. 传单个基本类型 / 字符串
- #{占位符名} 可任意写(MyBatis 对单个基本参数无命名要求),建议与形参名一致增强可读性。
3. 传 Map 对象
- #{占位符名} 必须与 Map 的key 值严格一致。
4. 多参数传参
- 无 @Param 时直接运行报错(提示Parameter 'xxx' not found),多参数必须加 @Param 注解。
四、@Param 注解核心使用
1. 核心作用
给 Mapper 方法的参数指定唯一别名,让 MyBatis 绑定#{占位符名},突破原生形参名限制,是多参数传参的标配。
2. 基础使用场景
(1)多基本类型参数
// @Param别名与#{占位符名}一致,与原形参名无关
@Delete("DELETE FROM t_user WHERE id = #{t_id}")
int deleteUserById(@Param("t_id") Integer id);
(2)实体类 + 基本类型混合传参
// 实体类加@Param后,占位符需写「别名.实体属性名」
@Insert("INSERT INTO t_user(username, create_time) VALUES (#{user.username}, #{createTime})")
int addUser(@Param("user") User user, @Param("createTime") LocalDateTime createTime);
3. 关键特性
- 加 @Param 后,#{占位符名} 仅与 @Param 的 value 值一致,与原形参名完全无关;
- 单个参数也可加 @Param(万能写法,无兼容问题),推荐团队开发统一使用。
4. 字节码层面原理
- @Param不会修改字节码中的原生形参名,默认编译(未开-parameters)下形参会被编译为arg0/arg1(而非 var1/var2);
- @Param 的别名以运行时可见的参数注解元数据存储在字节码中,MyBatis 运行时通过反射读取该元数据实现参数绑定,绕开原生形参名丢失问题。
五、编译参数-parameters与 MyBatis 版本关联
1. 核心差异(是否需要 @Param)
- MyBatis 3.4.0+(JDK8+):开-parameters可保留原生形参名,单基本参数可省略 @Param;多参数仍必须加;
- MyBatis 3.4.0 之前:无论是否开-parameters,所有参数(含单参数)必须加 @Param,否则运行报错。
2. 框架无关性
是否需要加 @Param与 Spring Boot 无关,仅由 MyBatis 版本和-parameters编译配置决定;
- Spring Boot 默认开启-parameters,且整合高版本 MyBatis,支持单参数省 @Param;
- 非 Spring Boot 项目默认未开-parameters,原生形参名会丢失,单参数建议加 @Param 避免报错。
3. 优先级
MyBatis 运行时优先读取 @Param 注解的别名,即使开启-parameters保留了原生形参名,也会忽略原生名。
六、常见运行时错误 & 避坑技巧
1. 典型报错类型
- Parameter 'xxx' not found:多参数无 @Param、@Param 别名与占位符名不匹配、Map key / 实体属性名与占位符名不匹配;
- 找不到对应的getter方法:实体属性名与占位符名不匹配、大小写不一致。
2. 避坑技巧
7. XML 映射配置
一、核心概念
MyBatis 支持两种 SQL 配置方式:注解配置和XML 配置文件。XML 映射配置是更常用的方式,尤其适合复杂 SQL 场景。
二、默认规则(必须遵守)
同包同名
XML 映射文件的名称必须与 Mapper 接口名称完全一致,并且要放在同一个包下。
例如:
UserMapper.java
和
UserMapper.xml
都在
com.mybatisdemo.mapper
包下。
namespace 一致
XML 映射文件中的
namespace
属性值,必须是对应 Mapper 接口的全限定名。
<mapper namespace="com.mybatisdemo.mapper.UserMapper">
ID 与返回值一致
XML 中 SQL 语句的
id
必须与 Mapper 接口中的方法名完全一致。
返回类型(
resultType
)也必须与接口方法的返回类型匹配。
// Mapper接口方法
List<User> findAll();
<!– XML中的对应SQL –>
<select id="findAll" resultType="com.mybatisdemo.pojo.User">
select id, username, password, name, age from user
</select>
三、关键配置说明
- 返回集合的特殊处理:当接口方法返回 List<User> 时,XML 中的 resultType 只需写单个实体类的全限定名(如 com.mybatisdemo.pojo.User),MyBatis 会自动将结果封装为 List 集合。
- 别名优化:如果在 MyBatis 全局配置中给实体类配置了别名,resultType 可以直接写别名(如 User),简化配置。
四、项目结构示例
mybatis-demo
└── src
└── main
├── java
│ └── com.mybatisdemo
│ ├── mapper
│ │ └── UserMapper.java
│ ├── pojo
│ │ └── User.java
│ └── MybatisDemoApplication.java
└── resources
├── com.mybatisdemo.mapper
│ └── UserMapper.xml
└── application.properties
网硕互联帮助中心




评论前必须登录!
注册