錯誤代碼以下:java
@Test public void testInsertOne(){ SqlSession sqlSession = MyBatisUtils.getSession(); UserInfo userInfo = new UserInfo(); userInfo.setNickname("sunny"); userInfo.setPhoneNum("18936896033"); sqlSession.insert("insertUser", userInfo); LOG.log(Level.INFO, "userId:"+userInfo.getId()); sqlSession.close(); }
緣由是會話沒有被提交而是被回滾了,修改代碼以下:sql
@Test public void testInsertOne(){ SqlSession sqlSession = MyBatisUtils.getSession(); UserInfo userInfo = new UserInfo(); userInfo.setNickname("sunny"); userInfo.setPhoneNum("18936896033"); sqlSession.insert("insertUser", userInfo); sqlSession.commit(); //注意提交事物 LOG.log(Level.INFO, "userId:"+userInfo.getId()); sqlSession.close(); }
源碼解讀:首先看看openSession的幾種方式:ide
SqlSession openSession() SqlSession openSession(boolean autoCommit) SqlSession openSession(Connection connection) SqlSession openSession(TransactionIsolationLevel level) SqlSession openSession(ExecutorType execType,TransactionIsolationLevel level) SqlSession openSession(ExecutorType execType) SqlSession openSession(ExecutorType execType, boolean autoCommit) SqlSession openSession(ExecutorType execType, Connection connection)
從地一個和第二個就可看出區別:get
openSession()會建立一個事物,可是不會自動提交源碼
openSession(true)會建立一個事物,並自動提交it
openSession(Connection connection),不使用數據元配置,而是自定義的一個連接io
openSession(TransactionIsolationLevel level)事物的隔離級別:class
(NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEA TABLE_READ,SERIALIZA BLE)test
openSession(ExecutorType execType):配置
ExecutorType.SIMPLE: 這個執行器類型不作特殊的事情。它爲每一個語句的執行建立一個新的預處理語句。
ExecutorType.REUSE: 這個執行器類型會複用預處理語句。
ExecutorType.BATCH: 這個執行器會批量執行全部更新語句,若是 SELECT 在它們中間執行還會標定它們是 必須的,來保證一個簡單並易於理解的行爲。