🍓🍓 问题截图:
🍓🍓报错内容
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
## Error building SqlSession.
## The error may exist in com/iflytek/mapper
## Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:82)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:66)
at com.iflytek.util.sqlSessionCreate.getsqlSession(sqlSessionCreate.java:23)
at com.iflytek.homework.testDemo1(homework.java:18)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:664)
at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:227)
at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:957)
at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:200)
at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148)
at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at org.testng.TestRunner.privateRun(TestRunner.java:848)
at org.testng.TestRunner.run(TestRunner.java:621)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:443)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:437)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:397)
at org.testng.SuiteRunner.run(SuiteRunner.java:336)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1280)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1200)
at org.testng.TestNG.runSuites(TestNG.java:1114)
at org.testng.TestNG.run(TestNG.java:1082)
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:122)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:99)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
... 30 more
Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:263)
at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:127)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.<init>(XMLMapperBuilder.java:81)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement(XMLConfigBuilder.java:379)
at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:120)
... 32 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允许有内容。
at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:204)
at java.xml/com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:178)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1471)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:978)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:534)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)
at java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:261)
... 36 more
Default Suite
Total tests run: 1, Passes: 0, Failures: 1, Skips: 0
Process finished with exit code 0
产生原因:
mapper映射文件出现错误
🍓🍓解决方案:
🍓🍓问题产生其他原因
或者还有其它的地方出现问题,例如
总而言之,基本上都是xml文件的问题
🍓🍓mybatis面试题
嗯~~~~,为了文章质量不是50分我也是拼了\
1. 什么是MyBatis?
答案:
MyBatis是一个开源的Java持久层框架,它通过提供基于映射文件和注解的方式,简化了数据库访问的过程。MyBatis将数据库操作与Java对象的映射解耦,使得开发人员可以通过简单的配置来执行SQL语句并处理结果集。
2. MyBatis的优点是什么?
答案:
MyBatis具有以下优点:
- 简化数据库访问:通过配置文件或注解的方式来定义数据库操作,减少了传统的JDBC编码工作量。
- 灵活性:支持自定义SQL语句,可以编写复杂的SQL语句来满足特定的需求。
- 易于集成:与其他流行的框架(如Spring)很好地集成,可以无缝地与现有的应用程序集成。
- 可扩展性:MyBatis提供了插件机制,可以方便地扩展其功能。
- 缓存支持:MyBatis支持本地缓存和二级缓存,可以提高性能。
- 映射灵活性:可以灵活地指定Java对象与数据库表之间的映射关系,支持高级映射技术。
3. MyBatis中的三级缓存是什么?
答案:
MyBatis中的三级缓存指的是一级缓存(本地缓存)、二级缓存(全局缓存)和三级缓存(分布式缓存)的组合。一级缓存是在会话级别上的缓存,可以提高单个会话中同一对象的查询效率。二级缓存是在多个会话之间共享的缓存,可以提高不同会话中相同SQL语句的查询效率。三级缓存是在分布式环境下的缓存解决方案,可以使用第三方缓存框架如Redis或Ehcache来实现。
4. MyBatis中的一级缓存是如何工作的?
答案:
一级缓存是MyBatis默认开启的,在同一个会话中有效。当执行相同的SQL语句查询时,MyBatis会先检查一级缓存中是否已经存在结果,如果存在,则直接从缓存中获取,减少了对数据库的查询操作。一级缓存的作用范围仅限于当前会话,当会话关闭或进行了更新操作时,一级缓存被清空。
5. 如何配置MyBatis的二级缓存?
答案:
要配置MyBatis的二级缓存,需要在MyBatis配置文件中添加<cache>
元素,并指定相应的缓存实现类。MyBatis内置了多种缓存实现,如PerpetualCache、FifoCache、LRUCache等。在映射文件中,可以通过在<select>
或<insert>
等元素上添加useCache="true"
属性来启用二级缓存。需要注意的是,使用二级缓存需要考虑并发访问和数据更新的问题,确保缓存的一致性。
6. MyBatis中的动态SQL是什么?它可以用于哪些场景?
答案:
动态SQL是指在SQL语句中根据不同条件动态生成不同的SQL片段。MyBatis提供了一些特殊的标签如if
、choose
、when
、otherwise
等,用于在XML映射文件中进行条件判断和SQL片段的拼接。动态SQL可以用于动态构建查询条件、动态排序、动态更新等场景,使得SQL语句更加灵活和可复用。
7. MyBatis中的一对一和一对多关系如何映射?
答案:
MyBatis中的一对一关系可以通过嵌套查询或嵌套结果映射来实现。嵌套查询是通过在XML映射文件中定义多个查询语句,然后使用<association>
标签将两个实体类关联起来。嵌套结果映射是通过使用<resultMap>
标签配置联合属性,使得在查询结果中可以直接获取关联实体类的相应属性。一对多关系可以通过定义集合属性和使用<collection>
标签来实现,将关联实体类映射到主实体类的集合属性中。
8. MyBatis中的懒加载和立即加载有何区别?
答案:
懒加载和立即加载是两种不同的加载策略。懒加载指的是在需要使用关联对象时才进行加载,而立即加载是在查询主对象时同时将关联对象也进行加载。默认情况下,MyBatis采用的是立即加载策略。但可以通过配置<association>
、<collection>
标签的fetchType
属性来指定使用懒加载。懒加载可以提高查询的性能,但也可能引发N+1查询问题,需要在实际开发中进行权衡和选择。
9. MyBatis中的延迟加载是指什么?如何配置延迟加载?
答案:
延迟加载指的是在访问对象的关联属性时才会触发真正的数据库查询操作。延迟加载可以减少查询的开销,并提高性能。在MyBatis中,可以使用<association>
和<collection>
标签的fetchType
属性来配置延迟加载。将fetchType
属性设置为lazy
即可开启延迟加载功能。
10. MyBatis中的动态SQL如何使用foreach循环?
答案:
在MyBatis中,可以使用<foreach>
标签来实现对集合类型的循环操作。通过指定迭代的集合属性、循环时的分隔符、循环的起始位置等参数,可以动态地生成SQL语句的一部分。<foreach>
标签可以嵌套在其他标签内部(如<select>
、<delete>
、<update>
等),使得SQL语句的组装更加灵活。
11. MyBatis中的插件机制是什么?如何使用插件?
答案:
MyBatis的插件机制允许开发人员在MyBatis的执行过程中拦截和修改SQL语句的处理过程。使用插件可以对MyBatis的行为进行扩展和定制,以满足特定的需求。要使用插件,需要实现Interceptor
接口,并在MyBatis配置文件中配置插件的拦截器。插件可以对SQL语句的解析、参数的处理、结果的处理等进行拦截和修改。
12. MyBatis中的#和$的区别是什么?
答案:
在MyBatis中,#和KaTeX parse error: Expected 'EOF', got '#' at position 29: …数。但它们的处理方式是不同的。#̲表示使用预编译的方式,参数会被…表示直接替换参数的值,不进行任何处理。使用#可以提高应用程序的安全性,而使用$可以灵活地动态生成SQL语句。
13. MyBatis中的标签是用来做什么的?
答案:
在插入数据时,可能需要获取数据库生成的主键值并回填到Java对象中。这时可以使用标签来定义获取主键的方式。可以通过指定SQL语句、查询的结果类型、主键属性等来完成主键的回填。在插入操作执行之前,标签会先执行对应的SQL语句,获取主键值并回填到对象中。
14. MyBatis中的分页查询如何实现?
答案:
MyBatis中提供了一种简单的分页查询方法。可以使用LIMIT
关键字(MySQL)或ROWNUM
关键字(Oracle)来指定查询结果的起始位置和数量。同时,配合使用<foreach>
标签和动态SQL,可以实现更复杂的分页查询。另外,还可以使用插件或自定义的分页拦截器来实现分页功能。