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中定义了两次了
不知道你这个问题是否已经解决, 如果还没有解决的话:
- 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();
}
}
}