[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保持一致

相关推荐
cur1es1 小时前
【JVM类加载&双亲委派模型&垃圾回收机制】
java·jvm·gc·垃圾回收·类加载·双亲委派模型
Mr.朱鹏1 小时前
JVM-GC垃圾回收案例
java·jvm·spring boot·算法·spring·spring cloud·java-ee
焦糖玛奇朵婷1 小时前
实测扭蛋机小程序:开发简单,互动有趣
java·大数据·程序人生·小程序·软件需求
Nan_Shu_6141 小时前
学习: 尚硅谷Java项目之小谷充电宝(3)
java·后端·学习
沙漏无语1 小时前
(二)TIDB搭建正式集群
linux·数据库·tidb
wzqllwy1 小时前
8 大经典排序算法(Java 实现):原理 + Demo + 核心分析
java·算法·排序算法
智能工业品检测-奇妙智能1 小时前
AIFlowy如何实现与现有Spring Boot项目的无缝集成?
java·spring boot·后端
從南走到北1 小时前
JAVA无人共享无人健身房物联网结合系统源码支持小程序+公众号+APP+H5
java·物联网·小程序
姚不倒1 小时前
三节点 TiDB 集群部署与负载均衡搭建实战
运维·数据库·分布式·负载均衡·tidb
Nuopiane1 小时前
MyPal3(3)
java·开发语言