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

相关推荐
lUie INGA5 分钟前
在2023idea中如何创建SpringBoot
java·spring boot·后端
极客on之路5 分钟前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家13 分钟前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE13 分钟前
开启mysql的binlog日志
数据库·mysql
yejqvow1222 分钟前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO28 分钟前
nacos2.3.0 接入pgsql或其他数据库
数据库
geBR OTTE30 分钟前
SpringBoot中整合ONLYOFFICE在线编辑
java·spring boot·后端
m0_7436239231 分钟前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python
Porunarufu35 分钟前
博客系统UI自动化测试报告
java