学到Mybatis我个人似乎好像到了一些瓶颈期,是由以前的刷题模式转变到了做项目的模式,在开始学Mybatis时就遇到的不少的问题,花了很久去解决问题也为果。一度想冷静冷静不想去碰这玩意儿。但是该来的总是得来,下午花了两小时时间把我入门Mybatis时遇到的问题都解决了(有些问题目前没遇到,后续如果遇到了会补)
1.
根据报错原因提示就是缺少映射,每一个xml文件都需要在recources当中注册,所以在recources包的xml文件中补上如下格式的代码即可:
<mappers> <!-- recource = "这是xml文件的具体路径,注意包与包之间用'/'隔开,不是'.'"--> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers>
2.
Mon Apr 19 16:07:32 CST 2021 WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
运行后出现这个问题,这是一个警告,并不影响数据库的连接和使用,但是强迫症兄弟们肯定不会撒手不管它,其实解决办法也能简单,在recources配置文件当中给url属性赋值时在最后加上
&useSSL=false
3.最常见的也是困惑我最久的一个问题
java.lang.ExceptionInInitializerError
at cn.silentcow.dao.UserDaoTest.test(UserDaoTest.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效。
首先,出现这个问题的最主要的原因是运行时无法映射到java目录下的xml文件,因为一般xml文件都是放在recources下,别的包下的xml文件是无法映射到的,要让java包下的xml文件也被映射到,我们就要在pom.xml文件提前配置
<!--在build中配置resuorces,来防止我们的资源导出失败--> <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources> </build>
“filtering”标签的属性要为true,我看到网上有些解决方案写的false,但是在我这儿并不可行,改为true就好了。
如何确定自己的工程已经能够映射到xml文件呢,只需要在编译的时候查看target目录下跟你源xml文件相同包下是否有编译好的xml文件即可
如果发现有target下有xml文件说明问题就解决了。
另外如果这样还没有解决问题,那希望读者好好去看看自己之前配置的xml文件,里面的各种配置有没有问题,当然,如果按照上面的方法做了,即便是再遇到问题,报错提示也会反映出问题的所在,可以很快的解决。
最后一个问题:
1 字节的 UTF-8 序列的字节 1 无效。
这个问题只需要在xml文件上稍作修改即可
<?xml version="1.0" encoding="UTF-8" ?>
改为:
<?xml version="1.0" encoding="UTF8" ?>