云计算百科
云计算领域专业知识百科平台

day-8 MyBatis

MyBatis

一、自增 ID 插入规则

  • 数据库字段设为自增(如 MySQL AUTO_INCREMENT),INSERT 语句省略自增字段,数据库自动生成 ID;
  • 实体类中自增字段无需赋值(默认 null 即可),MyBatis 可通过@Options(useGeneratedKeys = true, keyProperty = "id")将生成的 ID 回显到实体;
  • 禁止传 0/-1 等非 null 无效值,会直接插入该值导致主键混乱。
  • 二、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. 避坑技巧

  • 开发期使用 IDEA 插件(如Free MyBatis Plugin),实时校验参数映射,编辑器标红错误,无需等到运行时;
  • 实体类搭配 Lombok 时,必须加@NoArgsConstructor + @Data(MyBatis 需要无参构造创建对象,getter/setter 赋值);
  • 全版本 / 全框架万能兼容写法:所有 Mapper 方法参数都加 @Param 注解,永无参数匹配问题。
  • 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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » day-8 MyBatis
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!