一、问题描述
最近重新创建项目,在配置数据库进行连接测试时犯了一连串十分低级的错误,特此记录一下。
- 启动类错误
【沉浸式解决问题】java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use - DataSource错误
【沉浸式解决问题】No qualifying bean of type ‘javax.sql.DataSource‘ available: expected at least 1 bean which - 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());
}
}
其他文件可以看第二个连接
三、原因分析
- 最开始以为是数据库配置的问题,但是后来通过DataSource连接成功了,可以验证yml中的配置正确
- 有说是缺少@TableName注解的,加上没用
- 有说要在实体类重写方法的,加上没用:
@Override
public Serializable pkVal() {
return this.id;
}
- 试了之前项目的mybatis-plus在yml中的全局配置项,也不是这个原因
- 又找了一些关于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注解,看到这里总算是想起来了
四、解决方案
- 在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> {
}
- 在配置类或者启动类上使用@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 {
}
- 创建mapper.xml文件
这种方法其实是回归传统的模式了
五、总结
如果是单体项目推荐使用@MapperScan注解,毕竟一劳永逸
如果是微服务项目,暂时比较推荐@Mapper注解,有时候mapper文件和实体类可能都不在一个包下
虽然问题十分的简单无聊,但是解决问题的思路和过程还是值得记录的,记录一下至少几年内都不会再犯了><
另外,ActiveRecord模式适用于小项目或者个人项目,企业项目或者微服务项目还是不推荐使用,会造成耦合性比较高,实体类比较重。