报错内容:
Method 'insert' not found or there is
an overload method (same name with different parameters) in
mapper interface dao.StudentDao
情景回顾:
解决方法:(在最下面)
原因分析(这是一种情况):
基本上很少有人遇到这个问题吧,不过还是索性写下来,如果正好有需要,或者自己做个备份
事情的经过是,我在配置Mapper文件之前,先写的configuration.xml里面,导入的db.properties这个文件,
一般来说Eclipse里面的properties文件编码都是ISO....编码的,想输入中文注释不太可能,所以我就改成了UTF-8编码
而且,我索性把Eclipse里面所有打开文件的编码都改成了UTF-8
而改的时候,我的项目进行到了一半,也就是中间出现了"混码"的情况
这也是后来为什么导致Mapper文件找不到java代码里的insert的原因了
附上修改所有Eclipse新建文件时的编码设置:(中文版Eclipse,英文版请自行对照翻译即可)
窗口→首选项→常规→内容类型→右侧上面的折叠框里,挨个选择→在下面"缺省编码"的位置填写 utf-8 即可→右下角 OK确定
项目控制的时候,编码也是个很大的问题啊,特此记录
2018.7.3 22.00.50
——————————————————————————————————
2018.07.05更新
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
### Error updating database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for insert
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for insert
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:200)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:180)
at dao.StudentDao.insert(StudentDao.java:41)
at test.Mains.main(Mains.java:9)
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for insert
at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:875)
at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:708)
at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:701)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
... 4 more
发现又出现新的问题
刚开始以为是编码的问题(好像还真是编码的问题)
发了这篇文章之后,我心血来潮,把文件类型编码都改成了utf-8
结果又出现了片头的问题
所以按照流程新建项目,重跑一遍
结果有意思了,出现了如上这个提示
千回百转发现问题出现在mapper.xml文件指向上
如果用resource指向
可以正常运行
如果用package name
那么必然报错
言外之意就是没有解析到mapper里面的xml文件
log4j记录的是:
DEBUG - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
DEBUG - Class not found: org.jboss.vfs.VFS
DEBUG - JBoss 6 VFS API is not available in this environment.
DEBUG - Class not found: org.jboss.vfs.VirtualFile
DEBUG - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
DEBUG - Using VFS adapter org.apache.ibatis.io.DefaultVFS
DEBUG - Find JAR URL: file:/D:/UltimateEclipse/WorkSpace/2018.06.25FixMybatis/build/classes/po
DEBUG - Not a JAR: file:/D:/UltimateEclipse/WorkSpace/2018.06.25FixMybatis/build/classes/po
DEBUG - Reader entry: Student.class
DEBUG - Listing file:/D:/UltimateEclipse/WorkSpace/2018.06.25FixMybatis/build/classes/po
DEBUG - Find JAR URL: file:/D:/UltimateEclipse/WorkSpace/2018.06.25FixMybatis/build/classes/po/Student.class
DEBUG - Not a JAR: file:/D:/UltimateEclipse/WorkSpace/2018.06.25FixMybatis/build/classes/po/Student.class
DEBUG - Reader entry: ����
暂时没有找到问题原因和解决办法
——————————————————————————————————
2018.07.12补充:
其实出现问题的原因,不仅仅是上文提到的那种情况
如果出现本文标题的警告错误,那么很可能你的Mybatis的configuration.xml文件里
的mapper是用的扫描包的方式
而用
为什么?写本文的时候我没有详细叙述
我在刚出现这个问题的时候,用的是原生sqlSession方式,也就是说,在目录结构上
我只有 configuration.xml StudentMapper.xml 而并没有StudentMapper.java这个接口类
所以在扫描包的时候,没有扫描到StudentMapper.java,也就没有对应的insert方法继而报错
而且,如果想在configuration.xml的里面用
这种方式的话,前提必须是用接口Mapper的方式,即:
必须有 StudentMapper.xml
和 StudentMapper.java
这两个文件