【沉浸式解决问题】com.baomidou.mybatisplus.*.exceptions.MybatisPlusException: *.Test Not Found TableInfoCache

一、问题描述

最近重新创建项目,在配置数据库进行连接测试时犯了一连串十分低级的错误,特此记录一下。

第二篇里面提到,在进行数据库连接测试时,开始因为在yml中配置好了mysql信息但是无法连接,报DataSource的错误,想到用mybatis-plus连接测试,所以又犯了另一个更简单的错误,配置了entity和mapper的类以后使用ActiveRecord模式进行查询测试,错误如下:

com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: com.gwyy.ybws.common.core.entity.Test Not Found TableInfoCache.

提示实体类的表找不到,这是个很常见的错误
在这里插入图片描述


二、场景还原

1. 测试实体类entity/Test.class

@Data
public class Test extends Model<Test> {
    private Integer id;
}

测试表很简单,只有一个id字段,插入两条数据
在这里插入图片描述

2. mapper/TestMapper.class

public interface TestMapper extends BaseMapper<Test> {
}

3. 测试类

@SpringBootTest
public class MysqlTest {

    @Test
    void test3() {
        ConnectTest connectTest = new ConnectTest();
        List<ConnectTest> connectTests = connectTest.selectAll();
        System.out.println(connectTests.size());
        System.out.println(connectTests.get(0).getId());
    }
}

其他文件可以看第二个连接


三、原因分析

  1. 最开始以为是数据库配置的问题,但是后来通过DataSource连接成功了,可以验证yml中的配置正确
  2. 有说是缺少@TableName注解的,加上没用
  3. 有说要在实体类重写方法的,加上没用:
    @Override
    public Serializable pkVal() {
        return this.id;
    }
  1. 试了之前项目的mybatis-plus在yml中的全局配置项,也不是这个原因
  2. 又找了一些关于ActiveRecord的教程示例,确实只需要一个实体类和对应的mapper

尝试加上mapper.xml后,虽然能执行查询了,但是很明显,之前的问题并没有解决,印象中mybatis-plus确实可以不用xml文件
resources/mapper/ConnectTestMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gwyy.ybws.common.core.mapper.ConnectTestMapper">

</mapper>

到这里觉得应该是mapper.class没有发挥作用,查看原来项目的mapper文件和启动类也没有异常,最后想起了之前还写过单独的mybatis-plus的配置类,里面有分页插件等内容,配置类最上面设置了@MapperScan注解,看到这里总算是想起来了


四、解决方案

  1. 在mapper文件上使用@Mapper注解
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.***.entity.ConnectTest;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ConnectTestMapper extends BaseMapper<ConnectTest> {
}
  1. 在配置类或者启动类上使用@MapperScan注解

2.1 启动类

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.***.mapper") //设置mapper接口的扫描包
public class ApplicationTests {
}

2.2 配置类

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;

@Configuration // 配置类
@MapperScan("com.***.mapper") //设置mapper接口的扫描包
public class MybatisPlusConfig {
}
  1. 创建mapper.xml文件
    这种方法其实是回归传统的模式了

五、总结

如果是单体项目推荐使用@MapperScan注解,毕竟一劳永逸
如果是微服务项目,暂时比较推荐@Mapper注解,有时候mapper文件和实体类可能都不在一个包下
虽然问题十分的简单无聊,但是解决问题的思路和过程还是值得记录的,记录一下至少几年内都不会再犯了><

另外,ActiveRecord模式适用于小项目或者个人项目,企业项目或者微服务项目还是不推荐使用,会造成耦合性比较高,实体类比较重。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值