mybatis版本:3.4.6。
mybatis默認的SqlSessionFactory是DefaultSqlSessionFactory,它openSession()的源碼是:
public SqlSession openSession() { return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false); }
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; DefaultSqlSession var8; try { Environment environment = this.configuration.getEnvironment(); TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment); tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); Executor executor = this.configuration.newExecutor(tx, execType); var8 = new DefaultSqlSession(this.configuration, executor, autoCommit); } catch (Exception var12) { this.closeTransaction(tx); throw ExceptionFactory.wrapException("Error opening session. Cause: " + var12, var12); } finally { ErrorContext.instance().reset(); } return var8; }
可以看到,mybatis默認每次獲取session都會開啟一個事務,且不自動提交事務。如果更新操作完成后不手動commit,則在連接斷開時會將更新操作回滾。
SqlSession session = MybatisUtil.getSession(); UserMapper userMapper = session.getMapper(UserMapper.class); try{ UserDomain newUserDomain = new UserDomain(); newUserDomain.setAge(10); newUserDomain.setName("scp2"); newUserDomain.setSchool("高中"); userMapper.insert(newUserDomain); session.commit();// 如果不commit,連接斷開時操作會被回滾 } catch (Exception e){ System.out.println(e); } finally { if (null != session) {session.close();} }