关于MyBatis读取Mapper文件的一个坑

最近在Idea上开发MyBatis,准备随便先写一点东西,结果一写就出了问题。

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.mybatis.mapper.UserMapper.selAll
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.mybatis.mapper.UserMapper.selAll

报错说没有在Mapped Statements collections里找到com.mybatis.mapper.UserMapper.selAll,第一反应是自己namespace和id上的某个字母写错了,回去仔细对了一遍,没问题。

然后仔细查看了一下项目,发现target的对应目录(com.mybatis包)下,压根没有mapper包(用来存放mapper.xml文件和接口),百度了之后明白,对Idea的Maven来说,xml文件应该是存放在resources下的,src/main/java下存放的应该全部都是源码文件,对于src/main/java下的xml文件,Idea是不去编译的。

好,问题找到,也找到了对应的解决方法,在pom文件里面添加对应的build,告诉Maven,src/main/java下也有xml文件需要编译。


        
            
                src/main/java
                
                    **/*.xml
                
               
            
        
    

标签的作用不知道是什么,网上很多都是有加该标签,但是不加也是可以的,在这里我没加。

好,启动项目,编译运行,target下出现UserMapper.xml文件,第一个问题顺利解决。
没错,第一个问题,项目继续报错。

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.mybatis.mapper.UserMapper.selAll
### Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for com.mybatis.mapper.UserMapper.selAll

而且还是一样的错。

?????

我写的怕不是假的代码吧???

通过定位排查,觉得可能是MyBatis配置文件中的指定mapper文件这部分有问题。

一开始使用的是标签,直接指定com.mybatis.mapper包。


	

然后换成直接指定Mapper.xml文件。


	

报错信息改变。

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error building SqlSession.
### The error may exist in com.mybatis.mapper.UserMapper.xml
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource com.mybatis.mapper.UserMapper.xml

变成无法找到对应的xml资源。

em…两种可能,一种是原来没错,我改错了,所以没有找到资源,一种是确实错了,我也改错了。

我倾向于第二种可能。

不管了,上开发文档,太久没写MyBatis,很多细节记不大清。

找到mappers映射章节,一看,果然是写错了。

MyBatis指定Mapper映射文件有四种方式,分辨针对接口和xml文件。



  
  
  

针对Mapper.xml文件,直接指定映射文件的全限定路径,我修改的第二次就是想使用这种方式,但是路径的连接符写错了,应该是“/”,我写的是“.”。



  
  
  

使用url全限定路径指定Mapper.xml文件。



  
  
  

使用Mapper接口类指定映射文件,这是针对接口的。



  

将对应的包下所有接口作为Mapper注册,我第一次使用的就是注册包,但是这个是针对接口的,我的项目只写了Mapper.xml文件,自然找不到对应的操作。

好,使用第一种方式修改映射路径,然后启动项目。

继续报错。

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
15:03:45.365 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required
### The error may exist in com/mybatis/mapper/UserMapper.xml
### The error may involve com.mybatis.mapper.UserMapper.selAll
### The error occurred while executing a query
### Cause: java.sql.SQLNonTransientConnectionException: CLIENT_PLUGIN_AUTH is required

报错前面的那段提示,让我们修改驱动类,新的驱动类会通过SPI自动注册,并且不需要手动加载,不过这个先不管,我们先看报错信息。

CLIENT_PLUGIN_AUTH is required

网上查询了一下,好像是MySQL和MySQL Connector版本不匹配。

去pom文件看一下。


	mysql
    mysql-connector-java

之前为了图方便,没去写版本号,Maven自动为我下载了最新的8.0.15。。。

赶紧改成5.1.34(之前在Eclipse开发使用的版本)。

启动项目,编译运行,终于正常。

15:15:20.687 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 410495873.
15:15:20.688 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@1877ab81]
15:15:20.693 [main] DEBUG com.mybatis.mapper.UserMapper.selAll - ==>  Preparing: select * from proticable 
15:15:20.769 [main] DEBUG com.mybatis.mapper.UserMapper.selAll - ==> Parameters: 
15:15:20.823 [main] DEBUG com.mybatis.mapper.UserMapper.selAll - <==      Total: 9

总结一下,

第一个问题是xml文件在Idea的Maven下无法被编译,需要手动在pom文件里面指定。

第二个问题是Mapper.xml文件路径写错,这个是太久没写MyBatis,看来接下来还要多看开发文档。

第三个问题是pom文件这边,对于任何需要的导包,最好都去指定版本号,免得发生不匹配的情况。

你可能感兴趣的:(四大地)