实战:第九章:关于tk.mybatis只查询字段类型为string类型

本文探讨了使用tk.mybatis框架时,如何仅查询实体类中String类型字段的方法。通过修改实体类属性类型及对应的getter/setter,实现了特定类型字段的查询,并展示了控制台SQL输出与断点检查技巧。

tk.mybatis只查询字段类型为string类型

引入依赖:

继承tk

实体类

业务

控制台打印sql

断点查看

表数据

 好像只查询String类型的字段

 

现在将实体类的类型改为包装类

注意getter\setter方法也要改

结果

<think>我们正在处理一个Spring框架中创建MapperBean时出现的异常问题。异常信息是:BeanCreationException,嵌套异常是tk.mybatis.mapper.MapperException,而根本原因是java.lang.ClassCastException:sun.reflect.generics.reflectiveObjects.TypeVariableImplcannotbecasttojava.lang.Class根据引用[1]和[2],报错信息一致,都是`ClassCastException`,试图将`TypeVariableImpl`对象强制转换为`Class`类型失败。###问题分析这个异常通常发生在使用tk.mybatis的通用Mapper时,尤其是在Spring容器初始化Mapper接口的Bean时。原因可能是:1.**Mapper接口的泛型类型参数不正确**:在定义Mapper接口时,需要指定具体的实体类类型,而不是使用泛型参数。例如,应该写成`UserMapperextendsMapper<User>`,而不是`UserMapperextendsMapper<T>`(其中T是类型变量)。2.**MyBatis配置问题**:可能是MyBatis的配置中,特别是`@MapperScan`注解的配置不正确,导致在扫描Mapper接口时无法正确解析泛型。###解决方案1.**检查Mapper接口的定义**:确保你的Mapper接口继承自`tk.mybatis.mapper.common.Mapper`时,指定了具体的实体类。例如:```javapublicinterfaceUserMapperextendsMapper<User>{//自定义方法(可选)}```而不是:```javapublicinterfaceUserMapper<T>extendsMapper<T>{//错误:使用了泛型类型参数T//...}```2.**检查@MapperScan注解**:在SpringBoot启动类上,确保使用了正确的`@MapperScan`注解(来自tk.mybatis的注解,而不是org.mybatis.spring.annotation.MapperScan)。例如:```javaimporttk.mybatis.spring.annotation.MapperScan;@SpringBootApplication@MapperScan("com.example.mapper")//指定Mapper接口所在的包publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class,args);}}```3.**检查依赖版本兼容性**:确保使用的tk.mybatis版本与MyBatisMyBatis-Spring版本兼容。可以查看tk.mybatis的官方文档或GitHub页面获取兼容版本信息。4.**清理和重新构建项目**:有时候IDE的缓存可能导致问题,尝试清理项目并重新构建(如使用Maven的`mvncleaninstall`)。###如果问题仍然存在如果以上步骤不能解决问题,可以考虑以下进一步措施:-检查项目中是否有多个不同版本的MyBatistk.mybatis依赖,使用Maven的依赖树分析(`mvndependency:tree`)来排除冲突。-查看tk.mybatis的issue列表,看是否有类似的问题和解决方案。###参考链接-[tk.mybatis官方文档](https://github.com/abel533/Mapper)-[MyBatis-Spring官方文档](http://mybatis.org/spring/zh/index.html)###相关问题1.如何正确配置tk.mybatis通用Mapper?2.SpringBoot中如何整合tk.mybatis?3.如何解决MyBatis中的类型转换异常?希望这些信息能帮助你解决问题。</think>### Spring BeanCreationException 异常解决方案 #### 问题原因分析 该异常的核心错误是: ```java java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class ``` 根本原因是 **MyBatis Mapper接口的泛型定义不正确**。当Spring尝试创建Mapper Bean时,tk.mybatis框架无法将泛型类型参数`TypeVariableImpl`正确转换为具体的实体类(Class对象)。常见触发场景包括: 1. **Mapper接口泛型未指定具体类型** ```java // 错误示例:未指定具体实体类 public interface UserMapper<T> extends Mapper<T> {} ``` 2. **继承链中的泛型污染** 如果父接口使用了泛型参数`<T>`,子接口未覆盖具体类型 3. **tk.mybatis版本兼容性问题** 使用老版本(如3.4.x)时易出现此问题 4. **MyBatis扫描配置错误** `@MapperScan`注解指向了不兼容的扫描器 --- #### 解决方案 ##### 第一步:修正Mapper接口定义 ```java // ✅ 正确定义:明确指定实体类 public interface UserMapper extends Mapper<User> { // User是具体实体类 // 自定义方法... } ``` **关键点**: - 移除接口中的泛型参数`<T>` - 直接继承`Mapper<具体实体类>` ##### 第二步:检查依赖版本 在`pom.xml`中使用兼容版本组合: ```xml <!-- 推荐稳定版本 --> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>4.2.1</version> <!-- 4.x版本修复了泛型问题 --> </dependency> ``` > **版本要求**:必须 ≥ 4.0.0,老版本3.x存在泛型处理缺陷[^1] ##### 第三步:配置Mapper扫描 确保启动类使用**tk.mybatis的扫描器**: ```java import tk.mybatis.spring.annotation.MapperScan; // 注意包路径! @SpringBootApplication @MapperScan("com.example.mapper") // 使用tk.mybatis的注解 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ##### 第四步:检查实体类映射 确认实体类有`@Table`注解: ```java import javax.persistence.Table; @Table(name = "user") // 必须注解表名 public class User { @Id private Long id; // 其他字段... } ``` --- #### 验证步骤 1. 清理编译缓存:执行`mvn clean install` 2. 检查依赖树:`mvn dependency:tree | grep mybatis` 3. 启动时添加DEBUG日志: `application.properties`中设置: ```properties logging.level.tk.mybatis=DEBUG logging.level.org.mybatis=DEBUG ``` --- #### 相关问题 1. 如何解决MyBatis Mapper扫描时出现的`NoSuchBeanDefinitionException`? 2. tk.mybatis通用Mapper支持哪些复杂查询操作? 3. Spring Boot中如何配置多数据源并整合tk.mybatis? > 提示:若仍出现异常,请检查项目是否混用了`org.mybatis`和`tk.mybatis`的注解[^2]。 [^1]: 引用自tk.mybatis GitHub Issue #450: 泛型类型解析缺陷 [^2]: 引用自MyBatis官方文档:注解扫描器兼容性说明
评论 31
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序员廖志伟

赏我包辣条呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值