mybatis-plus 类型转化异常

文章讲述了在使用MyBatis-Plus操作数据库时,遇到将String类型的字段转化为Integer导致的类型转化异常,作者分析了原因并指出可能是MyBatis-Plus的bug,版本为3.5.3.1。

在操作数据库时,出现了类型转化异常
在这里插入图片描述

我的实体类




/**
 * <p>
 * 操作日志表
 * </p>
 *
 * @author tangxiang
 * @since 2023-09-11
 */
@Builder
@Data
@TableName(value = "sys_log", autoResultMap = true)
public class SysLogDO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

	/**
	 * 模块编码
	 */
	private String moduleCode;

	/**
	 * 模块名称
	 */
	private String moduleName;

	/**
	 * 操作类型
	 */
	private String methodType;

	/**
	 * 请求方法
	 */
	private String requestMethod;

	/**
	 * ip地址
	 */
	private String ip;

	/**
	 * 是否成功
	 */
	private Byte successFlag;

	/**
	 * uri
	 */
	private String requestUri;

	/**
	 * 操作方法,全限定名+方法名
	 */
	private String methodName;

	/**
	 * 方法参数
	 */
	private String requestParam;

	/**
	 * 返回参数
	 */
	private String returnObj;

	/**
	 * 错误信息
	 */
	private String errorMsg;

    /**
     * 创建人
     */
    private Long createBy;

    /**
     * 修改人
     */
    private Long updateBy;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 修改时间
     */
    private LocalDateTime updateTime;

    /**
     * 是否删除0未删除,1已删除
     */
    private Byte delFlag;
}



查询代码


LambdaQueryWrapper<SysLogDO> wrapper = Wrappers.lambdaQuery(SysLogDO.class);
		wrapper.eq(SysLogDO::getDelFlag, DelFlagEnum.FALSE.getFlag());
		wrapper.select(SysLogDO::getModuleCode, SysLogDO::getMethodType);
		List<SysLogDO> sysLogDOS = baseMapper.selectList(wrapper);


明明都是string类型,保存的时候没有问题,查询的时候缺出现了类型异常

报错信息是转化int
在这里插入图片描述
但是我的类型是String类型

debug到最开始,转int处

在这里插入图片描述
org.apache.ibatis.type.BaseTypeHandler#getResult(java.sql.ResultSet, java.lang.String)

这个BaseTypeHandler类型是Integer

继续查看这个handler哪里来的

在这里插入图片描述

从构造方法的第一个参数类型来的,所以 id 的类型是Integer,所以会出现类型转化异常。

删除wrapper.select(SysLogDO::getModuleCode, SysLogDO::getMethodType);即可

这个算是mybatis-plus的bug吗下面是版本号


        <mybatis-plus.version>3.5.3.1</mybatis-plus.version>

<dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
         
<think>好的,用户的问题是关于如何将项目从MyBatis-Plus迁移到纯MyBatis的实现方式。我需要先仔细分析用户提供的引用内容,看看里面有没有相关的迁移经验或者步骤。 首先,用户提供的引用[3]和[4]提到了从MyBatis迁移到MyBatis-Plus的过程,里面提到了一些配置文件的冲突问题,比如configuration和configLocation不能同时存在,还有字段名驼峰转换的问题。这些可能反过来对迁移到MyBatis有帮助,比如可能需要恢复某些配置。 然后,用户现在的情况是要反过来,从MyBatis-Plus回到MyBatis。所以需要考虑以下几点: 1. 依赖管理:需要移除MyBatis-Plus相关的依赖,比如mybatis-plus-boot-starter,并添加MyBatis的核心依赖。可能还需要添加MyBatis-Spring整合库,因为MyBatis-Plus已经内置了这些,但换成纯MyBatis可能需要显式引入。 2. 代码修改:项目中使用MyBatis-Plus特有的功能,比如BaseMapper、IService、ServiceImpl等,这些都需要替换成原生的MyBatis接口和实现。例如,原来的Mapper接口可能继承了BaseMapper,现在需要改为自定义的Mapper接口,并且需要手动编写对应的XML映射文件或注解SQL。 3. 配置调整:MyBatis-Plus的配置项在application.yml或application.properties中,比如mybatis-plus.mapper-locations,这些需要改为MyBatis的配置,如mybatis.mapper-locations。同时,之前因为迁移到MyBatis-Plus而注释掉的配置可能需要恢复,比如驼峰命名规则的设置。 4. 功能替换:MyBatis-Plus提供的便利功能,如分页插件、自动填充、逻辑删除等,都需要用原生的MyBatis方式重新实现。比如分页可能需要使用PageHelper,或者手动编写分页SQL。 5. XML文件调整:如果在MyBatis-Plus中使用了条件构造器(如QueryWrapper),这些在原生MyBatis中不可用,需要转换为动态SQL标签,如<if>、<choose>等,或者在Java代码中构造参数。 6. 测试和验证:迁移后需要全面测试,确保所有CRUD操作正常,特别是之前依赖MyBatis-Plus自动生成SQL的部分,需要手动验证是否正确转换。 此外,用户提到的引用[3]中提到的迁移到MyBatis-Plus时遇到的问题,比如配置文件冲突和驼峰命名设置,可能在逆向迁移时需要恢复原来的配置。例如,如果之前注释掉了mapUnderscoreToCamelCase的配置,可能需要重新启用或调整。 还需要考虑是否有第三方库或工具可以辅助迁移,比如是否有逆向工具将MyBatis-Plus的代码转换为原生MyBatis,或者是否需要手动重写大部分代码。另外,团队对原生MyBatis的熟悉程度也是一个因素,可能需要培训或文档支持。 最后,用户可能关心迁移过程中的常见错误和解决方法,比如依赖冲突、配置错误、SQL异常等,需要提供相应的解决方案或排查步骤。</think>### 从 MyBatis-Plus 迁移到原生 MyBatis 的步骤与注意事项 #### 一、迁移步骤 1. **依赖调整** - **移除 MyBatis-Plus 依赖**:在 `pom.xml` 或 `build.gradle` 中删除所有 MyBatis-Plus 相关依赖(如 `mybatis-plus-boot-starter`)。 - **添加原生 MyBatis 依赖**:引入 MyBatis 核心库及与框架整合的依赖,例如: ```xml <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.10</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency> ``` 2. **代码改造** - **Mapper 接口重构**:将继承自 `BaseMapper<T>` 的接口改为自定义接口,例如: ```java // 原 MyBatis-Plus 写法 public interface UserMapper extends BaseMapper<User> {} // 改造为原生 MyBatis public interface UserMapper { User selectById(Long id); List<User> selectAll(); // 其他自定义方法 } ``` - **Service 层调整**:若使用了 `IService` 和 `ServiceImpl`,需手动实现业务逻辑,例如替换批量操作方法[^1]。 3. **配置修正** - **配置文件替换**:将 `mybatis-plus` 前缀的配置改为 `mybatis`,例如: ```yaml # 原 MyBatis-Plus 配置 mybatis-plus: mapper-locations: classpath:mapper/*.xml # 改为 MyBatis 配置 mybatis: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true # 恢复驼峰映射[^3] ``` - **移除 MyBatis-Plus 特有配置**:如分页插件、自动填充等。 4. **SQL 迁移** - **XML 文件重写**:将 MyBatis-Plus 的条件构造器(如 `QueryWrapper`)转换为动态 SQL,例如: ```xml <!--MyBatis-Plus 条件查询 --> <select id="selectByCondition" resultType="User"> SELECT * FROM user ${ew.customSqlSegment} </select> <!-- 改造为原生 MyBatis --> <select id="selectByCondition" resultType="User"> SELECT * FROM user <where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age = #{age}</if> </where> </select> ``` #### 二、注意事项 1. **功能替代方案** - **分页查询**:使用 `PageHelper` 插件代替 MyBatis-Plus 的分页功能[^2]。 - **逻辑删除**:手动在 SQL 中添加 `WHERE deleted=0` 条件。 - **自动填充**:通过 AOP 或拦截器实现字段自动赋值(如 `create_time`)。 2. **常见问题排查** - **依赖冲突**:确保移除所有 MyBatis-Plus 相关 JAR 包,避免与原生 MyBatis 冲突[^4]。 - **SQL 语法错误**:检查 XML 中是否残留 MyBatis-Plus 特有语法(如 `${ew.customSqlSegment}`)。 - **驼峰映射失效**:在配置中显式启用 `map-underscore-to-camel-case`[^3]。 3. **迁移测试** - **单元测试覆盖**:重点测试涉及数据库操作的 Service 和 Mapper 层。 - **性能比对**:验证原生 MyBatis 在批量操作、复杂查询场景下的性能是否达标。 #### 三、示例对比 **MyBatis-Plus 代码** ```java public interface UserMapper extends BaseMapper<User> {} // Service 层直接调用 BaseMapper 方法 userMapper.selectById(1L); ``` **原生 MyBatis 代码** ```java public interface UserMapper { User selectById(Long id); } // XML 中实现 SQL <select id="selectById" resultType="User"> SELECT * FROM user WHERE id = #{id} </select> ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值