报错信息如下:
错误原因是:
在Java中,当你尝试在静态上下文中调用非静态方法时,会遇到编译错误。错误信息 Non-static method 'selectById(java.io.Serializable)' cannot be referenced from a static context 就是在告诉你,你正在尝试从一个静态环境中访问一个非静态方法。
而上下文中错误的代码是这部分:
在MyBatis Plus框架中,selectById 方法通常定义在一个接口中,如 BaseMapper<T> 接口,这个接口被继承或实现到具体的 Mapper 接口中。BaseMapper<T> 中的 selectById 方法是一个非静态方法,它需要实例化的 Mapper 对象来调用。
如果你在静态方法或静态初始化块中尝试调用 selectById 方法,那么你需要确保你有一个指向具体 Mapper 实例的引用。这通常意味着你需要通过Spring的依赖注入机制获取这个实例。
所以最后错误的原因是因为没有将Mapper对象实例化正确注入到服务类中。regionMapper 是一个非静态的成员变量,它通过Spring的@Autowired注解被自动注入。这样,就可以在非静态方法中安全地调用 selectById 方法了。
关于静态非静态的原理:
静态的方法可以在没有创建实例时使用,而申明为非静态的成员变量是一个对象属性,它只有在对象存在时引用,因此如果在对象未创建实例时我们在静态方法中调用了非静态成员方法自然是非法的,所以会报错。