Mybatis配置insert時,插入數據失敗

錯誤代碼以下: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 在它們中間執行還會標定它們是 必須的,來保證一個簡單並易於理解的行爲。

相關文章
相關標籤/搜索