告别MyBatis参数映射混乱:手把手教你用IDEA插件和单元测试提前揪出‘Parameter index out of range’

MyBatis参数映射单元测试IDEA插件
于 2026-06-02 12:06:37 修改
·本内容遵循CC 4.0 BY-SA版权协议

告别MyBatis参数映射混乱:工程化实践指南

在Java持久层框架中,MyBatis因其灵活性和直观的SQL映射能力而广受欢迎。然而,当项目规模扩大、团队协作增多时,XML映射文件中的参数匹配问题往往成为潜伏的"定时炸弹"——最常见的就是那个令人头疼的Parameter index out of range异常。这类问题通常在运行时才暴露,导致开发-测试-修复的循环成本居高不下。

本文将分享一套预防为主的工程化实践方案,帮助开发团队在代码提交前就捕获这些潜在问题。不同于事后排查的思路,我们聚焦于如何在开发阶段就建立安全网,通过工具链整合和自动化测试,将参数映射问题扼杀在萌芽状态。这套方法特别适合中大型项目团队和对代码质量有严格要求的开发者。

1. 理解MyBatis参数映射的核心机制

要有效预防参数映射问题,首先需要深入理解MyBatis处理SQL参数的核心原理。MyBatis通过OGNL表达式解析#{}${}占位符,将其转换为预编译语句中的参数标记。当出现以下情况时,就会抛出Parameter index out of range异常:

  • XML中定义的参数个数与方法调用时传入的参数不匹配
  • 动态SQL标签(如<if>, <foreach>)处理不当导致最终生成的SQL参数缺失
  • 注释格式不规范干扰了XML解析
  • 参数类型定义不明确导致类型处理器选择错误

常见问题模式示例

XML
<!-- 案例1:注释导致的问题 -->
<select id="findUser" resultType="User">
-- 这个注释会导致参数解析错误
SELECT * FROM users WHERE id = #{id} AND name = #{name}
</select>
 
<!-- 案例2:动态SQL问题 -->
<select id="searchProducts" resultType="Product">
SELECT * FROM products
<where>
<if test="category != null">
AND category = #{category} <!-- 当category为null时,这个参数不会生成 -->
</if>
AND price > #{minPrice} <!-- 但minPrice始终需要 -->
</where>
</select>

2. 开发阶段工具链集成

2.1 IDEA插件:MyBatisX的深度应用

MyBatisX是IntelliJ IDEA平台上一款强大的MyBatis支持插件,它不仅能提供代码导航功能,还能在开发阶段实时检测映射问题。

配置与使用指南

  1. 安装插件后,确保开启以下检查项:

    • XML与Mapper接口方法绑定验证
    • SQL参数占位符一致性检查
    • 动态SQL语法验证
  2. 关键功能演示:

    • 参数跳转:按住Ctrl点击#{param}可直接跳转到对应Java方法的参数定义
    • 实时提示:当参数不匹配时,编辑器会立即显示红色波浪线警告
    • 快速修复:Alt+Enter可快速生成缺失的参数或修正错误的参数名

提示:在团队中统一MyBatisX的配置,可以将插件配置导出为.idea目录下的XML文件,纳入版本控制。

2.2 MyBatis代码生成器的增强配置

MyBatis官方代码生成器可以通过定制模板来生成更安全的映射文件。建议修改默认模板,增加以下防护措施:

XML
<!-- 在generatorConfig.xml中添加以下配置 -->
<context id="MysqlTables" targetRuntime="MyBatis3">
<property name="javaFileEncoding" value="UTF-8"/>
<property name="autoDelimitKeywords" value="true"/>
<!-- 添加参数校验注释 -->
<commentGenerator>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!-- 配置生成的SQL映射更安全 -->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
</context>

生成器增强效果对比

特性 默认生成 增强后生成
参数注释 包含参数说明
SQL分隔符 普通引号 反引号包裹关键字
动态SQL 基础where标签 带非空检查的if条件
异常处理 简单映射 包含类型处理器提示

3. 构建自动化测试防护网

3.1 单元测试:SQL映射验证框架

编写专门的映射测试类,可以在构建阶段捕获参数问题。以下是一个基于Spring Boot Test的示例:

JAVA
@SpringBootTest
public class MyBatisMapperTest {
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Test
void testAllSelectStatements() {
try (SqlSession session = sqlSessionFactory.openSession()) {
Configuration configuration = session.getConfiguration();
for (MappedStatement ms : configuration.getMappedStatements()) {
if (ms.getSqlCommandType() == SqlCommandType.SELECT) {
// 验证SQL可解析性
BoundSql boundSql = ms.getBoundSql(ms.getParameterMap().getType());
String sql = boundSql.getSql();
assertNotNull(sql);
// 验证参数匹配
ParameterMapping[] mappings = boundSql.getParameterMappings();
if (mappings != null) {
for (ParameterMapping mapping : mappings) {
assertNotNull(mapping.getProperty());
}
}
}
}
}
}
}

3.2 集成测试:真实参数模拟

结合Testcontainers创建真实的数据库环境,测试各种边界条件下的参数传递:

JAVA
@Testcontainers
@SpringBootTest
public class MyBatisIntegrationTest {
@Container
static MySQLContainer<?> mysql = new MySQLContainer<>("mysql:8.0");
@DynamicPropertySource
static void registerPgProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", mysql::getJdbcUrl);
registry.add("spring.datasource.username", mysql::getUsername);
registry.add("spring.datasource.password", mysql::getPassword);
}
@Test
void testParameterBindingWithNullValues() {
// 测试各种参数组合
Map<String, Object> params = new HashMap<>();
params.put("id", 1);
params.put("name", null);
// 应该正常执行而不抛参数越界异常
assertDoesNotThrow(() -> userMapper.findByComplexCondition(params));
}
}

4. CI/CD流水线中的质量门禁

将MyBatis映射检查纳入持续集成流程,可以设置以下质量关卡:

  1. 编译阶段检查

    BASH
    # 在pom.xml中添加mybatis-validator插件
    mvn org.mybatis:mybatis-migrations:validate
  2. 测试阶段增强

    • 执行专门的SQL映射测试套件
    • 对测试覆盖率设置阈值(如映射测试覆盖率达到90%)
  3. 代码审查规则

    • 禁止直接修改XML而不更新对应Mapper接口
    • 所有动态SQL必须包含null检查
    • 参数注释必须与Java方法同步更新

Jenkins流水线示例

GROOVY
pipeline {
agent any
stages {
stage('Build & Validate') {
steps {
sh 'mvn clean compile mybatis:validate'
}
}
stage('Test') {
steps {
sh 'mvn test -Dmybatis.coverage.threshold=90'
}
}
}
post {
failure {
emailext body: 'MyBatis映射验证失败,请检查参数匹配问题',
subject: '构建失败: ${JOB_NAME} - ${BUILD_NUMBER}',
to: 'dev-team@example.com'
}
}
}

5. 高级防护策略

对于特别关键的系统,可以考虑以下增强方案:

运行时监控:通过MyBatis拦截器记录参数绑定异常,实时报警

JAVA
@Intercepts({
@Signature(type= ParameterHandler.class, method="setParameters", args={PreparedStatement.class})
})
public class ParameterMonitorInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
try {
return invocation.proceed();
} catch (SQLException e) {
if (e.getMessage().contains("Parameter index out of range")) {
// 发送报警通知
AlertService.send("MyBatis参数越界异常", e);
}
throw e;
}
}
}

架构级解决方案

  • 引入QueryDSL或JOOQ替代部分复杂动态SQL
  • 对关键Mapper接口实现自动化契约测试
  • 使用数据库迁移工具管理SQL变更历史
mybatis Parameter index out of range (2 > number of parameters, which is 1)
本文记录了一次在使用MyBatis框架时遇到的参数设置异常问题,详细解析了错误信息,指出在XML文件中注释SQL语句时,MyBatis处理上的潜在问题,并提供了解决方案。
平行宇宙i
7276
Caused by: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1
本文介绍了一种常见的MyBatis使用过程中遇到的错误——Parameter index out of range,并提供了有效的解决办法。该错误通常由于SQL语句中的参数数量与实际传入的数量不匹配引起。文中给出了具体的解决方案,即调整SQL语句的注释部分。
qs_266
532
告别996】你会用开发神器IDEAIDEA常用插件推荐
本文详细介绍了IntelliJ IDEA的使用技巧,包括逆天Find、代码格式化、自动删除未使用的引用、自定义Live Template、快捷键、调试、重构生成单元测试。特别推荐了如Key Promoter X、Free Mybatis Plugin、JsonFormat等实用插件,帮助开发者提升工作效率。
Exrick
812
IDEA_MyBatis_SQLException:Parameter index out of range
本文解决了MyBatis中因参数设置不当导致的数据库错误,包括参数数量不匹配及使用LIKE语句时的常见问题。
weixin_30609331
229
idea:Cause: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is1
本文详细解析了在使用MyBatis框架时遇到的参数设置错误,具体表现为在执行SQL查询时出现的参数索引越界异常。通过分析错误堆栈,指出问题可能源于XML配置文件中的SQL语句存在注释导致的参数错位,并提供了相应的解决策略。
gao_jun1
670
SQLException: Parameter index out of range (2 > number of parameters, which is 1)
本文记录了一次使用MyBatis过程中遇到的注释格式错误导致的问题及解决方法。在IDEA环境下编写MyBatis映射文件时,使用了MySQL风格的注释(--注释),而正确的格式应为HTML注释格式(&lt;!-- --&gt;)。
倔强的小板凳
477
IDEA+Mybatis(四)ResultMap结果集映射
本文详细介绍了Mybatis中的ResultMap元素,它是Mybatis最强大的映射工具,允许零配置处理简单查询,通过描述字段间的关系处理复杂查询。文章通过实例展示了如何配置ResultMap进行多对一一对多的映射,包括子查询结果嵌套两种处理方式,并强调了在实际使用中应注意的细节优化点。
yyxx99881199
2012
java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
本文详细记录了一次使用MyBatis过程中遇到的参数索引越界错误,并给出了修改SQL语句的方法来解决该问题。
weixin_30781631
1616
springboot 整合 mybatis 以及 idea 安装 MybatisCodeHelper 插件
本文介绍了如何在SpringBoot 2.x项目中集成Mybatis,并分享了如何安装使用MybatisCodeHelperPro插件以自动生成Mapper和服务层代码。提供了数据库配置、Mapper配置、插件安装及破解方法的详细步骤,帮助开发者提高效率。
路克森
1015
The index 2 is out of range.报错解决方案
博客指出Mybatis的xml中存在注释会引发异常,解决办法是将注释删掉。涉及Java、Mybatis等信息技术相关内容。
0刀剑如梦
1383
index out of range (228 」 number of parameters, which is 227)
本文解决了一个在MyBatis查询中遇到的IndexOutOfRangeException错误,问题源于XML文件中未正确删除的注释。IDEA中使用--进行注释的方式在某些情况下可能不会被正确解析,导致运行时报错。
csdn_ttk
180
SpringBoot集成Mybatis-plusMybatisX插件
文章介绍了如何在IDEA中安装MybatisX插件和引入mybatis-plus依赖,通过配置数据源Druid,使用MybatisX生成domain、xml、接口和服务文件,简化开发流程。同时提到了mybatis-plus提供的常见数据库操作接口,以及通过配置mybatis-plus的相关参数优化数据库交互。文章提供了详细的步骤示例代码,适合快速入门。
yangnk42
623
HBuilderXIntelliJ IDEA实现简单登录认证功能
本文基于HBuilderX搭建前端页面(login.html、index.html及对应JS逻辑),使用IntelliJ IDEA开发Spring Boot后端服务,实现前后端分离的简单登录认证功能。后端采用三层架构(Controller-Service-Mapper),集成MyBatis操作数据库,通过Ajax提交用户凭证,返回统一JSON响应,并包含全局异常处理与DTO封装。
沐雨橙风ιε
13326
使用mybatis执行sql的时候为什么会出现Parameter index out of range (1 > number of parameters, which is 0)?...
本文详细解析了在MyBatis框架中正确使用LIKE语句的方法,强调了在动态SQL中使用${name}
chengliang1874
222
Mybatis 一对多 结果集映射 简单入门 易懂
本文介绍如何使用MyBatis实现一对多的数据映射,包括数据库表设计、项目搭建步骤、Mapper接口定义及XML配置等关键环节,并提供具体测试案例。
宁在春
948
mybatis的分页插件
本文详细介绍了如何在MyBatis中配置使用PageHelper分页插件,包括在mybatis-config.xmlSpring application.xml中的配置方式,以及在service层、mapper层Controller层的具体应用实例。
HuToolS
398
MyBatis注解开发多表代码操作——手把手教你实战操作
本文详细介绍了如何使用MyBatis的注解进行一对一、一对多多对多的复杂映射开发。从项目准备、建表、配置到测试,每个步骤都配合具体的SQL语句注解配置,手把手教你实现MyBatis的注解开发。
清河大善人
1599
idea分页插件pagehelper--springmvc
本文介绍了在IDEA环境下,如何将PageHelper分页插件集成到SpringMVC项目中,包括web.xml配置、pom.xml引入依赖、applicationContext.xml、mybatis-config.xml、springmvc.xml的设置,以及DAO接口、Service、Controller的实现,还有实体类的创建前后端页面(index.jsp、list.jsp)的展示。适合初学者参考。
柳长吟
1045
Intellij Idea无法更新maven插件索引的解决
本文介绍在IntelliJ IDEA中使用Maven构建Spring+SpringMVC+MyBatis项目时,如何解决Maven依赖自动补全问题。通过更新远程仓库索引并设置代理,确保索引更新成功。
ziven2012
34550
手把手调试 RuoYi-Vue-Plus 数据权限IDEA断点摸清 PlusDataPermissionInterceptor 的完整工作流
本文基于IntelliJ IDEA断点调试,深入剖析RuoYi-Vue-Plus中PlusDataPermissionInterceptor的工作流程,涵盖拦截器入口(beforeQuery、processSelect)、权限上下文构建(用户信息获取、注解解析)及SQL动态重写(原始SQL对比、多条件拼接)等核心环节,聚焦MyBatis Plus数据权限机制的实现原理与调试方法。
詹小布
680
Parameter index out of range (2 〉 number of parameters, which is 1).
本文详细分析了SQL异常'Parameter index out of range'的常见原因,并提供了相应的解决方案。原因包括未设置必要的输入参数映射配置不匹配以及动态SQL编写不当。建议检查并修正Mapper接口方法签名XML配置的一致性,开启MyBatis日志记录,使用IDE插件辅助排查,以及复核业务逻辑流程控制。
你去找小鱼吧
SQLException: Parameter index out of range (7 > number of parameters, which is 6).
ljf8838
"nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='postName', mode=IN, javaType=class java.lang.Object, jdbcType=VARCHAR, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType VARCHAR . Try setting a different JdbcType for this parameter or a different configuration property. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType VARCHAR . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0)."
任亚兵
IntelliJ IDEA有哪些关键特性,它如何提高开发效率?
IntelliJ IDEA作为JetBrains公司推出的旗舰级集成开发环境(IDE),是当今Java生态乃至全栈开发领域最具代表性的生产力工具之一。其核心价值不仅在于“能用”,更在于“智能、精准、预见性地赋能开发者”,从而在编码、重构、调试、测试、部署等全生命周期中系统性提升开发效率与代码质量。首先,IntelliJ IDEA最广为人知且最具革命性的特性是其**深度语义感知的智能代码补全(Smart Code Completion)**它并非简单基于字符前缀匹配,而是结合项目上下文、变量类型、方法签名、继承关系、Spring Bean依赖、Maven/Gradle依赖图谱乃至注解元数据进行多维度推理。例如,在Spring Boot项目中输入`@Autowi`,IDEA不仅能补全`@Autowired`,还能自动识别当前类中所有符合条件的Bean并按注入优先级排序;在流式API调用链中(如`list.stream().filter(...).map(...)`),它能精准推断中间操作返回的泛型类型,提供完全类型安全的后续方法建议。这种补全准确率远超传统IDE,大幅减少记忆成本与拼写错误。其次,**代码重构(Code Refactoring)能力达到工业级精度**。IntelliJ IDEA支持超过50种安全重构操作,包括重命名(Rename)、提取方法(Extract Method)、内联变量(Inline Variable)、将字段转为参数(Introduce Parameter)、迁移类(Move Class)、安全删除未使用代码(Safe Delete)等。所有重构均基于完整的项目索引与控制流/数据流分析,确保跨模块、跨文件、跨语言(如Java调用Kotlin)的引用一致性。例如执行“重命名一个public方法”时,IDEA会自动定位所有子类重写、接口实现、反射调用(含字符串字面量中的方法名)、Spring AOP切点表达式、JUnit测试方法名(若遵循命名约定)甚至MyBatis XML映射中的id属性,并全部同步更新——且每一步均可预览变更差异,支持选择性确认,彻底杜绝因手动修改导致的隐性Bug。第三,**静态代码分析(Static Code Analysis)已深度融入编辑体验**。IDEA内置的Inspection引擎实时扫描语法、语义、性能、并发、安全性、国际化、可维护性等数百项规则(如空指针解引用、资源未关闭、循环引用、硬编码字符串、过深嵌套、未使用的import等),并在编辑器中以不同颜色波浪线高亮,悬停即显示修复建议(Quick-Fix),一键应用即可自动修正。更关键的是,这些检查支持项目级配置、自定义规则、Severity分级(Warning/Error/Weak Warning)及抑制策略(@SuppressWarnings或注释标记),并与SonarQube、Checkstyle、PMD等外部工具无缝集成,形成从编码阶段即介入的质量防线。第四,**项目索引优化(Project Indexing Optimization)是高效响应的底层基石**。IDEA采用增量式、后台异步、分层缓存的索引机制首次打开大型Maven多模块项目时,它会构建符号表(Symbol Table)、继承图(Inheritance Graph)、依赖图(Dependency Graph)、注解索引(Annotation Index)及字符串字面量索引(String Literal Index)。此后所有导航(Ctrl+Click跳转)、查找(Find Usages)、结构视图(Structure View)、全局搜索(Double Shift)均基于内存索引毫秒级响应。即使面对百万行级代码库,其“Go to Declaration”与“Find in Path”依然保持亚秒级延迟,远超Eclipse或VS Code原生Java支持。此外,**多语言支持(Multi-language Support)体现其架构先进性**通过Language Injection机制,可在Java字符串中嵌入SQL、JSON、HTML、RegExp等片段并获得对应语言的语法高亮、补全与校验;对Kotlin、Scala、Groovy、JavaScript/TypeScript、Python、Go、Rust等提供原生级支持,共享统一UI与快捷键体系;而**IDE插件生态(IDE Plugin Ecosystem)** 则通过开放的Platform SDK与丰富的API,使社区贡献了超万款插件——从Alibaba Java Coding Guidelines、GitToolBox到Rainbow Brackets、Key Promoter X,极大延展了IDE边界。最后,**调试工具(Debugger)** 集成动态断点、条件断点、断点命中计数、热替换(HotSwap)、内存快照(Memory View)、线程堆栈可视化、远程调试加密隧道等企业级功能;配合**集成开发环境(IDE)本身的高度可定制性**(主题、快捷键、窗口布局、Live Templates、Postfix Completion),开发者可构建完全贴合个人思维习惯的“第二大脑”。综上,IntelliJ IDEA绝非普通编辑器升级版,而是以编译器级语义分析为引擎、以开发者认知模型为设计原点、以工程化质量保障为目标的智能协作中枢,其每一项特性都直击软件开发中重复性劳动、上下文切换损耗、理解成本高昂、缺陷发现滞后等核心痛点,真正实现“让机器多思考,让人专注创造”。
2401_85763803
MyBatis插入数据
使用${}插入数据成功,但是使用#{}失败,想请教一下为什么使用#{}会失败。 Emp类如下 @Data @NoArgsConstructor @AllArgsConstructor public class Emp { private Integer id; private String username; private String password; private String name; private Short gender; private String image; private Short job; private LocalDate entrydate; private Integer deptId; private LocalDateTime createTime; private LocalDateTime updateTime; } 测试类如下 //新增员工 @Test public void testInsert(){ //构造员工对象 Emp emp = new Emp(); emp.setUsername("fanyao"); emp.setName("范遥"); emp.setImage("1.jpg"); emp.setGender((short)1); emp.setJob((short)1); emp.setEntrydate(LocalDate.of(2016,1,1)); emp.setCreateTime(LocalDateTime.now()); emp.setUpdateTime(LocalDateTime.now()); emp.setDeptId(1); //执行新增员工信息操作 empMapper.insert(emp); System.out.println(emp.getId()); } 使用#{}插入数据 @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" + "VALUES ('#{username}', '#{name}', '#{gender}', '#{image}', '#{job}', '#{entrydate}', '#{deptId}', '#{createTime}', '#{updateTime}')") public void insert(Emp emp); 运行结果如下 主要报错提示 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='username', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). 使用${}插入数据 @Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" + "VALUES ('${username}', '${name}', '${gender}', '${image}', '${job}', '${entrydate}', '${deptId}', '${createTime}', '${updateTime}')") public void insert(Emp emp); 运行结果 D:\dev\wcjdk11\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar=3161:D:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\wc189\.m2\repository\org\junit\platform\junit-platform-launcher\1.8.2\junit-platform-launcher-1.8.2.jar;C:\Users\wc189\.m2\repository\org\junit\platform\junit-platform-engine\1.8.2\junit-platform-engine-1.8.2.jar;C:\Users\wc189\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\wc189\.m2\repository\org\junit\platform\junit-platform-commons\1.8.2\junit-platform-commons-1.8.2.jar;C:\Users\wc189\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\lib\idea_rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\plugins\junit\lib\junit5-rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2022.1.3\plugins\junit\lib\junit-rt.jar;D:\codes\JavaWeb\itheima_JavaWeb\springboot-mybatis-crud\target\test-classes;D:\codes\JavaWeb\itheima_JavaWeb\springboot-mybatis-crud\target\classes;D:\dev\apache-maven-3.6.1\mvn_repo\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.2.2\mybatis-spring-boot-starter-2.2.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\boot\spring-boot-starter\2.7.5\spring-boot-starter-2.7.5.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\boot\spring-boot\2.7.5\spring-boot-2.7.5.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\spring-context\5.3.23\spring-context-5.3.23.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\spring-aop\5.3.23\spring-aop-5.3.23.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\spring-expression\5.3.23\spring-expression-5.3.23.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\boot\spring-boot-autoconfigure\2.7.5\spring-boot-autoconfigure-2.7.5.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\boot\spring-boot-starter-logging\2.7.5\spring-boot-starter-logging-2.7.5.jar;D:\dev\apache-maven-3.6.1\mvn_repo\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;D:\dev\apache-maven-3.6.1\mvn_repo\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;D:\dev\apache-maven-3.6.1\mvn_repo\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\boot\spring-boot-starter-jdbc\2.7.5\spring-boot-starter-jdbc-2.7.5.jar;D:\dev\apache-maven-3.6.1\mvn_repo\com\zaxxer\HikariCP\4.0.3\HikariCP-4.0.3.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\spring-jdbc\5.3.23\spring-jdbc-5.3.23.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\spring-beans\5.3.23\spring-beans-5.3.23.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\spring-tx\5.3.23\spring-tx-5.3.23.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.2.2\mybatis-spring-boot-autoconfigure-2.2.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\mybatis\mybatis\3.5.9\mybatis-3.5.9.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\mybatis\mybatis-spring\2.0.7\mybatis-spring-2.0.7.jar;D:\dev\apache-maven-3.6.1\mvn_repo\com\mysql\mysql-connector-j\8.0.31\mysql-connector-j-8.0.31.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\projectlombok\lombok\1.18.24\lombok-1.18.24.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\boot\spring-boot-starter-test\2.7.5\spring-boot-starter-test-2.7.5.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\boot\spring-boot-test\2.7.5\spring-boot-test-2.7.5.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\boot\spring-boot-test-autoconfigure\2.7.5\spring-boot-test-autoconfigure-2.7.5.jar;D:\dev\apache-maven-3.6.1\mvn_repo\com\jayway\jsonpath\json-path\2.7.0\json-path-2.7.0.jar;D:\dev\apache-maven-3.6.1\mvn_repo\net\minidev\json-smart\2.4.8\json-smart-2.4.8.jar;D:\dev\apache-maven-3.6.1\mvn_repo\net\minidev\accessors-smart\2.4.8\accessors-smart-2.4.8.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\ow2\asm\asm\9.1\asm-9.1.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;D:\dev\apache-maven-3.6.1\mvn_repo\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;D:\dev\apache-maven-3.6.1\mvn_repo\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\assertj\assertj-core\3.22.0\assertj-core-3.22.0.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\junit\jupiter\junit-jupiter\5.8.2\junit-jupiter-5.8.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\junit\jupiter\junit-jupiter-api\5.8.2\junit-jupiter-api-5.8.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\junit\platform\junit-platform-commons\1.8.2\junit-platform-commons-1.8.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\junit\jupiter\junit-jupiter-params\5.8.2\junit-jupiter-params-5.8.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\junit\jupiter\junit-jupiter-engine\5.8.2\junit-jupiter-engine-5.8.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\junit\platform\junit-platform-engine\1.8.2\junit-platform-engine-1.8.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\mockito\mockito-core\4.5.1\mockito-core-4.5.1.jar;D:\dev\apache-maven-3.6.1\mvn_repo\net\bytebuddy\byte-buddy\1.12.18\byte-buddy-1.12.18.jar;D:\dev\apache-maven-3.6.1\mvn_repo\net\bytebuddy\byte-buddy-agent\1.12.18\byte-buddy-agent-1.12.18.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\objenesis\objenesis\3.2\objenesis-3.2.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\mockito\mockito-junit-jupiter\4.5.1\mockito-junit-jupiter-4.5.1.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\skyscreamer\jsonassert\1.5.1\jsonassert-1.5.1.jar;D:\dev\apache-maven-3.6.1\mvn_repo\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\spring-core\5.3.23\spring-core-5.3.23.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\spring-jcl\5.3.23\spring-jcl-5.3.23.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\springframework\spring-test\5.3.23\spring-test-5.3.23.jar;D:\dev\apache-maven-3.6.1\mvn_repo\org\xmlunit\xmlunit-core\2.9.0\xmlunit-core-2.9.0.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 com.wangchen.SpringbootMybatisCrudApplicationTests,testInsert 17:22:49.914 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate] 17:22:49.924 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)] 17:22:49.959 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [com.wangchen.SpringbootMybatisCrudApplicationTests] from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper] 17:22:49.971 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [com.wangchen.SpringbootMybatisCrudApplicationTests], using SpringBootContextLoader 17:22:49.975 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [com.wangchen.SpringbootMybatisCrudApplicationTests]: class path resource [com/wangchen/SpringbootMybatisCrudApplicationTests-context.xml] does not exist 17:22:49.975 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [com.wangchen.SpringbootMybatisCrudApplicationTests]: class path resource [com/wangchen/SpringbootMybatisCrudApplicationTestsContext.groovy] does not exist 17:22:49.975 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [com.wangchen.SpringbootMybatisCrudApplicationTests]: no resource found for suffixes {-context.xml, Context.groovy}. 17:22:49.976 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [com.wangchen.SpringbootMybatisCrudApplicationTests]: SpringbootMybatisCrudApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 17:22:50.016 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.springframework.test.context.ActiveProfiles] and class [com.wangchen.SpringbootMybatisCrudApplicationTests] 17:22:50.088 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file [D:\codes\JavaWeb\itheima_JavaWeb\springboot-mybatis-crud\target\classes\com\wangchen\SpringbootMybatisCrudApplication.class] 17:22:50.089 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration com.wangchen.SpringbootMybatisCrudApplication for test class com.wangchen.SpringbootMybatisCrudApplicationTests 17:22:50.181 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [com.wangchen.SpringbootMybatisCrudApplicationTests]: using defaults. 17:22:50.182 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.event.ApplicationEventsTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener] 17:22:50.191 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required dependencies available. Offending class: [javax/servlet/ServletContext] 17:22:50.201 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@4b45dcb8, org.springframework.test.context.event.ApplicationEventsTestExecutionListener@7216fb24, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@2072acb2, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@50ecde95, org.springframework.test.context.support.DirtiesContextTestExecutionListener@35a9782c, org.springframework.test.context.transaction.TransactionalTestExecutionListener@70a36a66, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@45815ffc, org.springframework.test.context.event.EventPublishingTestExecutionListener@732f29af, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@d3957fe, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@6622fc65, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@299321e2, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@23fb172e, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@64ba3208, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener@158a3b2e] 17:22:50.206 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@56303b57 testClass = SpringbootMybatisCrudApplicationTests, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@4b2a01d4 testClass = SpringbootMybatisCrudApplicationTests, locations = '{}', classes = '{class com.wangchen.SpringbootMybatisCrudApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@9816741, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2f67a4d3, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5c86dbc5, org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@24105dc5, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@18317edc, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@5f71c76a], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]], class annotated with @DirtiesContext [false] with mode [null]. 17:22:50.221 [main] DEBUG org.springframework.test.context.support.DependencyInjectionTestExecutionListener - Performing dependency injection for test context [[DefaultTestContext@56303b57 testClass = SpringbootMybatisCrudApplicationTests, testInstance = com.wangchen.SpringbootMybatisCrudApplicationTests@61ce23ac, testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@4b2a01d4 testClass = SpringbootMybatisCrudApplicationTests, locations = '{}', classes = '{class com.wangchen.SpringbootMybatisCrudApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@9816741, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@2f67a4d3, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@5c86dbc5, org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@24105dc5, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@18317edc, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@5f71c76a], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]]]. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.5) 2023-08-24 17:22:50.533 INFO 45524 --- [ main] .w.SpringbootMybatisCrudApplicationTests : Starting SpringbootMybatisCrudApplicationTests using Java 11.0.15.1 on wangchen with PID 45524 (started by wc189 in D:\codes\JavaWeb\itheima_JavaWeb\springboot-mybatis-crud) 2023-08-24 17:22:50.534 INFO 45524 --- [ main] .w.SpringbootMybatisCrudApplicationTests : No active profile set, falling back to 1 default profile: "default" Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. Property 'mapperLocations' was not specified. 2023-08-24 17:22:51.451 INFO 45524 --- [ main] .w.SpringbootMybatisCrudApplicationTests : Started SpringbootMybatisCrudApplicationTests in 1.207 seconds (JVM running for 2.161) Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@39666e42] was not registered for synchronization because synchronization is not active 2023-08-24 17:22:51.788 INFO 45524 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2023-08-24 17:22:52.248 INFO 45524 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. JDBC Connection [HikariProxyConnection@366098173 wrapping com.mysql.cj.jdbc.ConnectionImpl@6b9c42bd] will not be managed by Spring ==> Preparing: insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)VALUES ('fanyao', '范遥', '1', '1.jpg', '1', '2016-01-01', '1', '2023-08-24T17:22:51.731918700', '2023-08-24T17:22:51.731918700') ==> Parameters: <== Updates: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@39666e42] null 2023-08-24 17:22:52.307 INFO 45524 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2023-08-24 17:22:52.313 INFO 45524 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. 进程已结束,退出代码0
Trp_Cys
Mybatis数据插入调试点类型数据问题排查与解决指南
SW_孙维
MyBatis常见问题及解决方案快速排查与修复错误
SW_孙维
Mybatis与MySQL数据交互5分钟搞定点类型数据插入
SW_孙维
Mybatis+Geneater新手入门必看5步搭建开发环境与基础配置,不走弯路!
SW_孙维
org.jetbrains.idea.tomcat.TomcatModuleDeploymentModel@5ce286a5我也分不清哪个是哪个,就给我个报错,说是聚合报错,这个是我准备分页的报错
孤独!卓落