[Mybatis]Mybatis框架

一.标签作用

1.0MyBatis总体机制

1.1 @Mapper标签(声明持久化层组件)

1.1.1 @Mapper标签作用

标记为MyBatis的Mapper接口,Spring Boot自动创建代理实现类。

1.1.2 在对应的resource文件夹建立对应Mapper包,并赋值namespace

1.1.3 配置 Mapper 配置文件位置

Spring Boot 默认无法自动识别resources/mapper下的 XML 文件,需在application.properties中显式指定路径:

复制代码
# MyBatis配置:指定Mapper XML文件的存储路径
mybatis.mapper-locations=classpath:/mapper/*Mapper.xml

# 可选优化:开启驼峰命名自动映射(tiger_id → tigerId),可省略SQL中的AS别名
mybatis.configuration.map-underscore-to-camel-case=true

classpath:/mapper/*Mapper.xml:匹配resources/mapper目录下所有以Mapper.xml结尾的文件,批量加载所有 Mapper 配置。

1.2 打印执行日志

XML 复制代码
logging.level.com.example.demo.mapper=debug

1.3@Param标签

1.3.1、核心定位:给参数 "起名字",解决多参数引用问题

MyBatis 默认情况下:

  • 单参数 :无需命名,XML 中用#{任意名}(如#{id}/#{param})都能匹配;
  • 多参数 :参数名会被 MyBatis 重命名为param1param2...(失去原名称),直接用#{username}会报错Parameter 'username' not found

@Param的作用就是:为每个参数指定一个自定义名称,让 XML / 注解 SQL 中能通过这个名称精准引用参数

1.3.2、核心使用场景(3 种高频场景)

场景 1:多简单类型参数(必用 @Param)

这是最常用的场景,比如传入usernamestatus两个简单类型参数:

java

运行

复制代码
// Mapper接口:用@Param给每个参数命名
UserDO selectByUsernameAndStatus(
    @Param("username") String username,  // 命名为username
    @Param("status") Integer status      // 命名为status
);

xml

复制代码
<!-- XML:直接用@Param的名称引用,无需parameterType -->
<select id="selectByUsernameAndStatus" resultMap="BaseResultMap">
    SELECT * FROM user 
    WHERE username = #{username} AND status = #{status}
</select>
场景 2:多复杂类型参数(必用 @Param)

传入UserDOOrderDO两个复杂对象,通过@Param命名后,可引用对象的属性:

java

运行

复制代码
// Mapper接口:给复杂对象命名
List<RecordDO> selectByUserAndOrder(
    @Param("user") UserDO userDO,    // 命名为user
    @Param("order") OrderDO orderDO  // 命名为order
);

xml

复制代码
<!-- XML:通过"命名.属性名"引用复杂对象的字段 -->
<select id="selectByUserAndOrder" resultMap="RecordResultMap">
    SELECT * FROM record
    WHERE user_id = #{user.id}        <!-- 引用UserDO的id -->
    AND order_no = #{order.orderNo}  <!-- 引用OrderDO的orderNo -->
</select>
场景 3:混合参数(简单 + 复杂,必用 @Param)

传入pageNum(简单类型)+UserDO(复杂类型),统一命名:

java

运行

复制代码
// Mapper接口:混合参数命名
List<UserDO> selectPage(
    @Param("pageNum") Integer pageNum,  // 简单类型
    @Param("user") UserDO userDO        // 复杂类型
);

xml

复制代码
<!-- XML:分别引用不同命名的参数 -->
<select id="selectPage" resultMap="BaseResultMap">
    SELECT * FROM user 
    WHERE username LIKE CONCAT('%', #{user.username}, '%')
    LIMIT #{pageNum}, 10
</select>

三、不用 @Param 的例外场景(仅 2 种)

并非所有场景都需要 @Param,这 2 种情况可省略:

1. 单参数(无论简单 / 复杂类型)

java

运行

复制代码
// 单参数:无需@Param
UserDO selectById(Long id);
// XML直接用#{id}即可,MyBatis自动匹配
2. 单参数是 Map(用 Map 的 key 作为参数名)

java

运行

复制代码
// 单参数是Map:无需@Param
List<UserDO> selectByMap(Map<String, Object> paramMap);

xml

复制代码
<!-- XML用Map的key引用,如paramMap中有"username"键 -->
<select id="selectByMap" resultMap="BaseResultMap">
    SELECT * FROM user WHERE username = #{username}
</select>

四、关键语法规则(避坑核心)

  1. 注解位置 :必须加在 Mapper 接口方法的参数前 ,如@Param("username") String username
  2. 参数名大小写 :XML 中引用时和 @Param 的名称大小写一致(如 @Param ("UserName") → #{UserName});
  3. 特殊字符 :参数名不能含特殊字符(如@Param("user-name")会报错),建议用驼峰(userName)或下划线(user_name);
  4. 和 parameterType 的关系 :加了 @Param 后,XML 中无需写 parameterType(写了也无效)。

五、新手常见坑

  1. 多参数忘加 @Param :报错Parameter 'xxx' not found,解决方案:补加 @Param;
  2. 参数名拼写错误:如 @Param ("username") → XML 中写 #{userName},解决方案:核对名称大小写和拼写;
  3. 复杂对象引用错误:如 @Param ("user") → XML 中写 #{userId}(正确是 #{user.id}),解决方案:用 "命名。属性名" 引用。

总结

  1. @Param的核心作用是给多参数命名,让 XML / 注解 SQL 能精准引用参数名;
  2. 必用场景:多参数(无论简单 / 复杂 / 混合类型);
  3. 不用场景:单参数(简单 / 复杂 / Map);
  4. 加了 @Param 后,XML 中无需写 parameterType,MyBatis 自动识别参数类型。

二.配置需要注意的事项

2.1数据库名在没有驼峰自动映射的时候,必须As起的别名和entities保持一致

相关推荐
跟Tom学编程—一对一编程辅导1 小时前
基于 Java 的 SSM 架构电子商城项目毕业设计课题选型指导文档|名企高级开发工程师全程一对一指导(含详细文档+源码+部署)
java·架构·毕业设计·课程设计
tod1131 小时前
Redis 主从复制与高可用架构:从原理到生产实践
数据库·redis·架构
l1t2 小时前
DeepSeek辅助生成的PostgreSQL 表结构设计幻灯片脚本
数据库·postgresql
编程小风筝2 小时前
编写java代码如何写文档注释?
java·开发语言
橘子132 小时前
redis哨兵
数据库·redis·缓存
yzs872 小时前
OLAP数据库HashJoin性能优化揭秘
数据库·算法·性能优化·哈希算法
与衫2 小时前
如何将SQLFlow工具产生的血缘导入到Datahub平台中
java·开发语言·数据库
m0_475064502 小时前
SpringAI-1-集成DeepSeek
java
好家伙VCC2 小时前
**发散创新:编译器优化实战——从LLVM IR到性能飞跃的奇妙旅程**
java·开发语言·python·算法