mybatis框架报错


E:\java\jdk17\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:E:\java\InterlliJ IDEA\IDEA\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=52948:E:\java\InterlliJ IDEA\IDEA\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath "E:\java\InterlliJ IDEA\IDEA\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar;E:\java\InterlliJ IDEA\IDEA\IntelliJ IDEA 2022.2.3\plugins\testng\lib\testng-rt.jar;E:\javeweb\java\mybatis\mybatis\target\classes;E:\software\apache-maven-3.6.1\mvn_resp\org\mybatis\mybatis\3.5.5\mybatis-3.5.5.jar;E:\software\apache-maven-3.6.1\mvn_resp\mysql\mysql-connector-java\8.0.28\mysql-connector-java-8.0.28.jar;E:\software\apache-maven-3.6.1\mvn_resp\com\google\protobuf\protobuf-java\3.11.4\protobuf-java-3.11.4.jar;E:\software\apache-maven-3.6.1\mvn_resp\junit\junit\4.13.2\junit-4.13.2.jar;E:\software\apache-maven-3.6.1\mvn_resp\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;E:\software\apache-maven-3.6.1\mvn_resp\org\slf4j\slf4j-api\1.7.20\slf4j-api-1.7.20.jar;E:\software\apache-maven-3.6.1\mvn_resp\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\software\apache-maven-3.6.1\mvn_resp\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\software\apache-maven-3.6.1\mvn_resp\org\testng\testng\7.7.1\testng-7.7.1.jar;E:\software\apache-maven-3.6.1\mvn_resp\com\beust\jcommander\1.82\jcommander-1.82.jar;E:\software\apache-maven-3.6.1\mvn_resp\org\webjars\jquery\3.6.1\jquery-3.6.1.jar" com.intellij.rt.testng.RemoteTestNGStarter -usedefaultlisteners false -socket52947 @w@C:\Users\18353\AppData\Local\Temp\idea_working_dirs_testng.tmp -temp C:\Users\18353\AppData\Local\Temp\idea_testng.tmp
23:46:43,749 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
23:46:43,749 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
23:46:43,749 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/E:/javeweb/java/mybatis/mybatis/target/classes/logback.xml]
23:46:43,832 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
23:46:43,840 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
23:46:43,844 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [CONSOLE]
23:46:43,850 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@8:19 - no applicable action for [Encoding], current ElementPath  is [[configuration][appender][Encoding]]
23:46:43,901 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - This appender no longer admits a layout as a sub-component, set an encoder instead.
23:46:43,901 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
23:46:43,901 |-WARN in ch.qos.logback.core.ConsoleAppender[CONSOLE] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
23:46:43,901 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
23:46:43,906 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]
23:46:43,907 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@17:19 - no applicable action for [Encoding], current ElementPath  is [[configuration][appender][Encoding]]
23:46:43,915 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@490150701 - No compression will be used
23:46:43,916 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@490150701 - Will use the pattern E:/log/myApp.log.%d{yyyy-MM-dd}.log for the active file
23:46:43,919 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - The date pattern is 'yyyy-MM-dd' from file name pattern 'E:/log/myApp.log.%d{yyyy-MM-dd}.log'.
23:46:43,919 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Roll-over at midnight.
23:46:43,926 |-INFO in c.q.l.core.rolling.DefaultTimeBasedFileNamingAndTriggeringPolicy - Setting initial period to Wed Apr 26 23:46:43 CST 2023
23:46:43,928 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - This appender no longer admits a layout as a sub-component, set an encoder instead.
23:46:43,928 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
23:46:43,928 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
23:46:43,930 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: E:/log/myApp.log.2023-04-26.log
23:46:43,930 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - File property is set to [null]
23:46:43,932 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to ALL
23:46:43,932 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [CONSOLE] to Logger[ROOT]
23:46:43,932 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[ROOT]
23:46:43,932 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
23:46:43,933 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@543c6f6d - Registering current configuration as safe fallback point

2023-04-26 23:46:44.006 [main] DEBUG org.testng.TestNG - suiteXmlPath: "C:\Users\18353\AppData\Local\JetBrains\IntelliJIdea2022.2\temp-testng-customsuite.xml"
2023-04-26 23:46:44.287 [main] TRACE org.testng.internal.Graph - [Graph] ADDING NODE MyBatisDemo4.SelectAll()[pri:0, instance:com.wyl.MyBatisDemo4@610f7aa] -95229183
2023-04-26 23:46:44.288 [main] TRACE org.testng.internal.Graph - [Graph] ================ SORTING
2023-04-26 23:46:44.291 [main] TRACE org.testng.internal.Graph - [Graph] =============== DONE SORTING
2023-04-26 23:46:44.291 [main] TRACE org.testng.internal.Graph - [Graph] ====== SORTED NODES
2023-04-26 23:46:44.291 [main] TRACE org.testng.internal.Graph - [Graph] ====== END SORTED NODES
2023-04-26 23:46:44.297 [main] INFO  org.testng.internal.Utils - [TestNG] Running:
  C:\Users\18353\AppData\Local\JetBrains\IntelliJIdea2022.2\temp-testng-customsuite.xml

2023-04-26 23:46:44.429 [main] DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
2023-04-26 23:46:44.431 [main] DEBUG org.apache.ibatis.io.VFS - Class not found: org.jboss.vfs.VFS
2023-04-26 23:46:44.431 [main] DEBUG org.apache.ibatis.io.JBoss6VFS - JBoss 6 VFS API is not available in this environment.
2023-04-26 23:46:44.432 [main] DEBUG org.apache.ibatis.io.VFS - Class not found: org.jboss.vfs.VirtualFile
2023-04-26 23:46:44.432 [main] DEBUG org.apache.ibatis.io.VFS - VFS implementation org.apache.ibatis.io.JBoss6VFS is not valid in this environment.
2023-04-26 23:46:44.433 [main] DEBUG org.apache.ibatis.io.VFS - Using VFS adapter org.apache.ibatis.io.DefaultVFS
2023-04-26 23:46:44.433 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/pojo
2023-04-26 23:46:44.433 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/pojo
2023-04-26 23:46:44.481 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: Brand.class
2023-04-26 23:46:44.481 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: User.class
2023-04-26 23:46:44.482 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Listing file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/pojo
2023-04-26 23:46:44.482 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/pojo/Brand.class
2023-04-26 23:46:44.482 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/pojo/Brand.class
2023-04-26 23:46:44.483 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: ����   = I
2023-04-26 23:46:44.484 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/pojo/User.class
2023-04-26 23:46:44.485 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/pojo/User.class
2023-04-26 23:46:44.486 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: ����   = D
2023-04-26 23:46:44.487 [main] DEBUG org.apache.ibatis.io.ResolverUtil - Checking to see if class com.wyl.pojo.Brand matches criteria [is assignable to Object]
2023-04-26 23:46:44.488 [main] DEBUG org.apache.ibatis.io.ResolverUtil - Checking to see if class com.wyl.pojo.User matches criteria [is assignable to Object]
2023-04-26 23:46:44.514 [main] DEBUG o.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-04-26 23:46:44.515 [main] DEBUG o.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-04-26 23:46:44.515 [main] DEBUG o.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-04-26 23:46:44.515 [main] DEBUG o.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2023-04-26 23:46:44.518 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper
2023-04-26 23:46:44.518 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper
2023-04-26 23:46:44.520 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: BrandMapper.class
2023-04-26 23:46:44.520 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: BrandMapper.xml
2023-04-26 23:46:44.520 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: UserMapper.class
2023-04-26 23:46:44.521 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: UserMapper.xml
2023-04-26 23:46:44.521 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Listing file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper
2023-04-26 23:46:44.521 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper/BrandMapper.class
2023-04-26 23:46:44.521 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper/BrandMapper.class
2023-04-26 23:46:44.522 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: ����   = #  com/wyl/mapper/BrandMapper  java/lang/Object     selectAll ()Ljava/util/List;     Signature (()Ljava/util/List<Lcom/wyl/pojo/Brand;>; 
2023-04-26 23:46:44.523 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper/BrandMapper.xml
2023-04-26 23:46:44.524 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper/BrandMapper.xml
2023-04-26 23:46:44.525 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
2023-04-26 23:46:44.525 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper/UserMapper.class
2023-04-26 23:46:44.526 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper/UserMapper.class
2023-04-26 23:46:44.526 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: ����   =   com/wyl/mapper/UserMapper  java/lang/Object     selectAll ()Ljava/util/List;     Signature '()Ljava/util/List<Lcom/wyl/pojo/User;>; 
2023-04-26 23:46:44.528 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Find JAR URL: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper/UserMapper.xml
2023-04-26 23:46:44.528 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Not a JAR: file:/E:/javeweb/java/mybatis/mybatis/target/classes/com/wyl/mapper/UserMapper.xml
2023-04-26 23:46:44.529 [main] DEBUG org.apache.ibatis.io.DefaultVFS - Reader entry: <?xml version="1.0" encoding="UTF-8" ?>
2023-04-26 23:46:44.530 [main] DEBUG org.apache.ibatis.io.ResolverUtil - Checking to see if class com.wyl.mapper.BrandMapper matches criteria [is assignable to Object]
2023-04-26 23:46:44.530 [main] DEBUG org.apache.ibatis.io.ResolverUtil - Checking to see if class com.wyl.mapper.UserMapper matches criteria [is assignable to Object]

org.apache.ibatis.exceptions.PersistenceException: 
### Error building SqlSession.
### The error may exist in com/wyl/mapper/BrandMapper.xml
### The error occurred while processing mapper_resultMap[brandResultMap]
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/wyl/mapper/BrandMapper.xml'. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.wyl.mapper.BrandMapper.deleteById. please check com/wyl/mapper/BrandMapper.xml and com/wyl/mapper/BrandMapper.xml

    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
    at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)
    at com.wyl.MyBatisDemo4.SelectAll(MyBatisDemo4.java:28)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
    at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:677)
    at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:221)
    at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
    at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:969)
    at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:194)
    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:1511)
    at org.testng.TestRunner.privateRun(TestRunner.java:829)
    at org.testng.TestRunner.run(TestRunner.java:602)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:437)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:431)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:391)
    at org.testng.SuiteRunner.run(SuiteRunner.java:330)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1256)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1176)
    at org.testng.TestNG.runSuites(TestNG.java:1099)
    at org.testng.TestNG.run(TestNG.java:1067)
    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 parsing Mapper XML. The XML location is 'com/wyl/mapper/BrandMapper.xml'. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.wyl.mapper.BrandMapper.deleteById. please check com/wyl/mapper/BrandMapper.xml and com/wyl/mapper/BrandMapper.xml
    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:78)
    ... 29 more
Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/wyl/mapper/BrandMapper.xml'. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.wyl.mapper.BrandMapper.deleteById. please check com/wyl/mapper/BrandMapper.xml and com/wyl/mapper/BrandMapper.xml
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:123)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:95)
    at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.loadXmlResource(MapperAnnotationBuilder.java:179)
    at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse(MapperAnnotationBuilder.java:118)
    at org.apache.ibatis.binding.MapperRegistry.addMapper(MapperRegistry.java:72)
    at org.apache.ibatis.binding.MapperRegistry.addMappers(MapperRegistry.java:106)
    at org.apache.ibatis.binding.MapperRegistry.addMappers(MapperRegistry.java:118)
    at org.apache.ibatis.session.Configuration.addMappers(Configuration.java:815)
    at org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement(XMLConfigBuilder.java:367)
    at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:120)
    ... 31 more
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for com.wyl.mapper.BrandMapper.deleteById. please check com/wyl/mapper/BrandMapper.xml and com/wyl/mapper/BrandMapper.xml
    at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:992)
    at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:948)
    at org.apache.ibatis.session.Configuration.addMappedStatement(Configuration.java:746)
    at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:297)
    at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:113)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:138)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:131)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:121)
    ... 40 more


===============================================
Default Suite
Total tests run: 1, Passes: 0, Failures: 1, Skips: 0
===============================================


Process finished with exit code 0

你是不是deleteById这个方法在xml中定义了两次了

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7453713
  • 这篇博客也不错, 你可以看下mybatis框架入门
  • 除此之外, 这篇博客: Mybatis框架中的 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    • Resource:用于获得读取配置文件的IO对象,耗费资源,建议通过IO一次性读取所有所需要的数据。
    • SqlSessionFactory:SqlSession工厂类,内存占用多,耗费资源,建议每个应用只创建一个对象。
    • SqlSession:相当于Connection,可控制事务,应为线程私有,不被多线程共享。
    • 将获得连接、关闭连接、提交事务、回滚事务、获得接口实现类等方法进行封装。

    封装工具类

    /**
     * MyBatis工具类
     * 
     * 封装了获取连接,关闭连接,获取接口实现类对象的方法
     */
    public class MyBatisUtils {
        // 准备SqlSession工厂对象
        private static SqlSessionFactory factory;
    
        // 创建ThreadLocal绑定当前线程中的SqlSession对象
        private static final ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
    
        // 通过静态代码块加载SqlSession工厂对象
        static {
            try {
                // 读取配置文件
                InputStream resource = Resources.getResourceAsStream("mybatis-config.xml");
    
                // 获取工厂对象
                factory = new SqlSessionFactoryBuilder().build(resource);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // 获得连接(从ThreadLocal中获得当前线程SqlSession)
        private static SqlSession openSession() {
            // 从ThreadLocal中获取连接
            SqlSession sqlSession = threadLocal.get();
    
            // 如果连接为null
            if (sqlSession == null) {
    
                // 从工厂对象中获取连接
                sqlSession = factory.openSession();
    
                // 将连接存入ThreadLocal
                threadLocal.set(sqlSession);
            }
    
            return sqlSession;
        }
    
        // 释放连接(释放当前线程中的SqlSession)
        private static void closeSession() {
            // 从ThreadLocal中获取连接
            SqlSession sqlSession = threadLocal.get();
    
            // 关闭连接
            sqlSession.close();
    
            // 从ThreadLocal中移除连接
            threadLocal.remove();
        }
    
        // 提交事务(提交当前线程中的SqlSession所管理的事务)
        public static void commit() {
            // 获取连接
            SqlSession session = openSession();
    
            // 提交事务
            session.commit();
    
            // 关闭资源
            closeSession();
        }
    
        // 回滚事务(回滚当前线程中的SqlSession所管理的事务)
        public static void rollback() {
            // 获取连接
            SqlSession session = openSession();
    
            // 回滚事务
            session.rollback();
    
            // 关闭资源
            closeSession();
        }
    
        // 获取接口实现类对象
        public static <T> T getMapper(Class<T> clazz) {
            // 获取连接
            SqlSession session = openSession();
    
            // 获取接口代理对象
            return session.getMapper(clazz);
        }
    }
    

    【注意】这个代码以后复制粘贴直接用

    测试工具类案例代码

    public class MyBatisUtilsTest {
        @Test
        public void testSelectAllStudent() {
            try {
                // 通过工具类获取接口实现类对象
                StudentDao mapper = MyBatisUtils.getMapper(StudentDao.class);
    
                // 执行对应的方法
                List<Student> students = mapper.selectAllStudents();
    
                // 提交
                MyBatisUtils.commit();
    
                // 增强for循环遍历
                for (Student student : students) {
                    System.out.println(student);
                }
            } catch (Exception e) {
                // 回滚
                MyBatisUtils.rollback();
                e.printStackTrace();
            }
    
        }
    }
    
  • 您还可以看一下 冯三老师的mybatis精讲课程中的 常用框架讲解小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^