ruoyi改用mybatis-plus报错

本人某双非软工毕业生,大学四年跟着校内走没学到东西,先毕业重拾老本行,基本上处于半吊子零基础干开发,文章中出现皆为实际遇到的问题以及我本人的处理方法,仅供参考,没有实际教学意义。

在写完后端接口后,测试以及控制台报错

查找如何修改认证,发现多次尝试后无果

后发现可能是因为直接引入mybatis-plus依赖与ruoyi的mybatis依赖部分配置冲突

于是百度后修改MyBatisConfig文件中的代码,改红色部分

@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{
String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
String mapperLocations = env.getProperty("mybatis.mapperLocations");
String configLocation = env.getProperty("mybatis.configLocation");
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
VFS.addImplClass(SpringBootVFS.class);

// final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
return sessionFactory.getObject();
}

修改后发现页面控制台网络检测输出unknown column  xxxxxx  value in field list

百度之后,有帖子说可能是数据库驼峰命名造成的

于是修改各种驼峰命名

修改完成后unknown column 字段名变为unknown column ‘searchValue‘

在后端进行搜索后发现该searchValue是在BaseEntity.java类中的方法,按照网上教程分析原因是因为:实体类继承了BaseEntity,里面有一些字段用不上也找不着。将实体类继承BaseEntity删除,再在前面加上@TableName("表名")的注解,成功运行,在页面控制台输出数据。

<think>好的,我现在需要解决用户在使用MyBatis-Plus进行插入操作时遇到的“Type handler was null on parameter mapping for property 'params'”错误。首先,我得理解这个错误的原因。根据用户提供的引用内容,这个错误通常与参数映射中的类型处理器缺失有关,尤其是在处理Map类型的参数时。 首先,用户提到错误信息涉及属性'params',类型是java.util.Map,而jdbcType未指定。可能是在Mapper XML文件中,某个参数没有正确指定类型处理器,或者MyBatis-Plus无法自动推断出合适的处理器。例如,当使用Map作为参数时,如果没有显式配置类型处理器,MyBatis可能不知道如何将Map中的值转换为对应的JDBC类型。 接下来,参考用户提供的第二个引用,问题可能出在Mapper XML中的foreach标签使用不当。比如在动态SQL中,如果foreach内的参数引用不正确,比如直接使用#{id}而不是#{param.id},就会导致类型处理器找不到。不过用户现在的问题是插入操作,可能不涉及foreach,但需要检查插入语句中的参数是否正确。 可能的解决方案包括: 1. **检查参数类型和字段映射**:确保插入操作中使用的实体类或Map参数中的属性名称与数据库字段正确映射。如果使用Map,可能需要指定具体的jdbcType,或者在配置中注册相应的类型处理器。 2. **显式指定jdbcType或typeHandler**:在插入语句的参数占位符中,如#{property, jdbcType=OTHER},或者直接指定typeHandler。例如,对于Map中的某些复杂类型,可能需要自定义类型处理器。 3. **检查MyBatis-Plus的全局配置**:确认是否配置了默认的类型处理器,或者是否有缺失的配置导致无法自动处理Map类型。 4. **使用实体类代替Map**:如果可能的话,使用明确的实体类而不是Map作为参数,这样MyBatis-Plus可以更好地推断类型信息,避免类型处理器的问题。 5. **检查SQL语句的语法**:确认插入语句中的字段和参数占位符是否正确,没有拼写错误或结构错误。 然后,结合用户的具体情况,插入操作可能涉及将Map作为参数传入,而MyBatis在处理Map时,特别是当Map中的值类型不明确时,可能无法找到合适的类型处理器。例如,如果Map中包含自定义对象或复杂类型,而没有相应的类型处理器注册,就会报错。 例如,用户的插入代码可能类似于: ```java Map<String, Object> params = new HashMap<>(); params.put("name", "test"); params.put("age", 25); mapper.insert(params); ``` 而在Mapper XML中,插入语句可能没有正确指定各个参数的jdbcType或typeHandler: ```xml <insert id="insert"> INSERT INTO user (name, age) VALUES (#{name}, #{age}) </insert> ``` 在这种情况下,MyBatis可能无法确定如何将Map中的name和age转换为对应的JDBC类型,尤其是当某些值为null时,jdbcType无法推断,导致类型处理器为空。因此,解决方法可能是在参数中显式指定jdbcType: ```xml <insert id="insert"> INSERT INTO user (name, age) VALUES (#{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}) </insert> ``` 或者,在MyBatis的配置文件中注册全局的类型处理器,以处理Map中的特定类型。例如,为java.util.Map配置一个自定义的类型处理器,尽管这通常不是推荐的做法,因为Map的结构可能多变。 此外,用户提到使用的是MyBatis-Plus,可能需要检查是否使用了正确的注解或配置。例如,使用@Param注解来明确参数名称,或者在实体类中使用@TableField注解指定字段映射,避免直接使用Map带来的不确定性。 总结来说,解决步骤可能包括检查Mapper XML中的参数引用是否正确,显式指定jdbcType或typeHandler,使用实体类替代Map,以及检查全局配置是否正确。同时,参考用户提供的引用中的类似问题,确保没有在动态SQL中错误地引用参数,例如在插入语句中正确使用属性路径。</think>### 解决MyBatis-Plus插入操作类型处理器为空的方案 **问题分析** 当MyBatis-Plus执行插入操作时,若参数为`java.util.Map`类型且未正确配置类型处理器,会抛出`Type handler was null`错误[^1]。此问题通常由以下原因导致: 1. 参数类型未明确指定`jdbcType`或`typeHandler`; 2. 动态SQL中参数引用不规范; 3. 全局配置缺少类型处理器支持。 --- ### 逐步解决方案 #### 1. **显式指定参数类型** 在Mapper XML的插入语句中,为每个参数添加`jdbcType`声明,明确告诉MyBatis如何转换数据类型: ```xml <insert id="insertData"> INSERT INTO table (name, value) VALUES ( #{params.name, jdbcType=VARCHAR}, #{params.value, jdbcType=INTEGER} ) </insert> ``` 若参数是`Map<String, Object>`类型,需确保键名与占位符名称一致,并通过`params.`前缀访问(如`#{params.name}`)[^1]。 --- #### 2. **使用实体类替代Map** 改用MyBatis-Plus的`BaseMapper`默认支持的实体类传参,避免直接操作Map: ```java // 实体类定义 @Data @TableName("user") public class User { @TableId private Long id; private String name; private Integer age; } // 插入操作 User user = new User(); user.setName("test"); user.setAge(25); userMapper.insert(user); // 直接调用BaseMapper的insert方法 ``` 实体类通过注解自动映射字段,无需手动处理类型转换。 --- #### 3. **检查动态SQL参数引用** 若必须使用Map传参,确保动态SQL中正确引用嵌套属性: ```xml <insert id="insertByMap" parameterType="map"> INSERT INTO user <foreach collection="params.keys" item="key" open="(" close=")" separator=","> ${key} </foreach> VALUES <foreach collection="params.values" item="value" open="(" close=")" separator=","> #{value, jdbcType=VARCHAR} <!-- 根据实际类型调整jdbcType --> </foreach> </insert> ``` 避免直接使用`#{key}`而缺少路径修饰(如`#{params.key}`)[^2]。 --- #### 4. **注册自定义类型处理器** 若Map中包含复杂类型(如枚举、JSON对象),需实现`TypeHandler`并注册: ```java // 自定义处理器 @MappedTypes(Map.class) public class MapTypeHandler extends BaseTypeHandler<Map<String, Object>> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Map<String, Object> parameter, JdbcType jdbcType) { ps.setString(i, JSON.toJSONString(parameter)); // 示例:转为JSON存储 } // 其他方法略... } // 在配置类或mybatis-config.xml中注册 @Configuration public class MybatisConfig { @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> { configuration.getTypeHandlerRegistry().register(MapTypeHandler.class); }; } } ``` --- #### 5. **检查全局配置** 在`application.yml`中确保MyBatis-Plus已启用类型处理器自动扫描: ```yaml mybatis-plus: type-handlers-package: com.example.handler # 自定义类型处理器所在包 configuration: default-scripting-language: freemarker map-underscore-to-camel-case: true ``` --- ### 总结 通过以上步骤,可解决因类型处理器缺失导致的插入操作异常。优先推荐使用**实体类传参**,若必须用Map,则需显式声明`jdbcType`或自定义类型处理器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值