背景:
这个是spring boot项目,做restful API。 编辑器是IDEA, 数据源是远程mysql5.7, 在idea里可以做表的怎删改查,连接配置应该没问题。
症状:
项目启动OK, 当访问:http://127.0.0.1:8089/skus/1 ,回车,编辑器控制报错:大致意思是找不到selectByPrimaryKey()方法。
网上搜了很多答案,说是mybatis配置问题,还有命名和包空间一致,还有空格问题... ...结果还是然并卵,这个报错怎么解决啊啊
控制台报错:
2023-10-19 18:56:46.414 ERROR 2846 --- [nio-8089-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.demo.api.service.SkuService.selectByPrimaryKey] with root cause
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.demo.api.service.SkuService.selectByPrimaryKey at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235) ~[mybatis-3.5.4.jar:3.5.4] at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:53) ~[mybatis-3.5.4.jar:3.5.4] at org.apache.ibatis.binding.MapperProxy.lambda$cachedInvoker$0(MapperProxy.java:107) ~[mybatis-3.5.4.jar:3.5.4] at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) ~[na:1.8.0_372] at org.apache.ibatis.binding.MapperProxy.cachedInvoker(MapperProxy.java:94) ~[mybatis-3.5.4.jar:3.5.4] at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85) ~[mybatis-3.5.4.jar:3.5.4] at com.sun.proxy.$Proxy60.selectByPrimaryKey(Unknown Source) ~[na:na] ... ...
-------------------【增】10/20----------------------------- 找不到方法,因需要将“SQL语句映射注册到SqlSession中”, 所以需要在resources下新建xml文件, 编写如下形式的配置: <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath*:mybatis/*Mapper.xml"/> </bean> 当然,也有配置mapperscan,如果在启动类上已有,酒不需要了。 但是问题好没解决, 一些基础的spring boot知识已购买黑马的书籍。 ... ...
//SkuServiceImpl.java //---------------------------- package com.demo.api.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.demo.api.domain.Sku; import com.demo.api.dao.SkuMapper; import javax.annotation.Resource; @Service public class SkuServiceImpl implements SkuService { @Autowired @Resource private SkuMapper skuMapper; @Override public Sku selectByPrimaryKey(Integer id){ return skuMapper.selectByPrimaryKey(id); } // @Override // public void addSku(Sku sku){ // skuMapper.insertSelective(sku); // } // // @Override // public void updateSku(Sku sku) { // skuMapper.updateByPrimaryKeySelective(sku); // } // // @Override // public void deleteSku(Integer id) { // skuMapper.deleteByPrimaryKey(id); // } }
在pom.xml配置文件的<build>标签中配置<resources>,并将 /dao/Mapper.xml配置
json 数据来自远程云服务器
1.先测试其他方法是否能跑通,确定mapper的 xml配置文件被正确加载了。
2.再打断点debug。
新手挺常见的问题,原因看是来是Mapper和xml的映射有问题,或者是参数有问题.建议不要手撸sql了,难以维护,升级困难,直接上mybatis-plus或tk-mybatis
是这问题。我去看看那插件,谢谢。
很明显。你的.xml文件在dao里面,但是你并没指定位置,老项目中一般会写个sql-map.xml去一一指定。新的都是放在resource了或者考虑使用mybatis-plus
谢谢关注,我去了解下。
Invalid bound statement (not found): com.demo.api.service.SkuService.selectByPrimaryKey
检查一下 mybatis的sql和接口的绑定?