天天看點

mybatis mysql 事務處理_mybatis 使用事務處理

mybatis預設開啟事務

以前使用JDBC的時候,如果要開啟事務,我們需要調用conn.setAutoCommit(false)方法來關閉自動送出,之後才能進行事務操作,否則每一次對資料庫的操作都會持久化到磁盤中。

而mybatis呢,如果底層使用JDBC(在mybatis.xml中配置的transactionManager标簽的type設為jdbc的話),那麼,mybatis會預設開啟事務,也就是說,mybatis預設是關閉自動送出的。

在mybatis中,如果我們執行了資料庫的修改操作(insert、update、delete),必須調用session.commit()方法,所做的修改才能持久化到磁盤。

怎麼讓mybatis開啟自動送出(關閉事務)

在openSession()時,傳入true,即可關閉事務。

舉個例子

有PeopleMapp.xml,配置有一個insert指令:

insert into people values (null, #{name}, #{age})

測試代碼如下:

package lixin.gan.test;

import java.io.IOException;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import lixin.gan.pojo.People;

public class TestTransaction {

public static void main(String[] args){

InputStream config = null;

try {

config = Resources.getResourceAsStream("mybatis.xml");

} catch (IOException e) {

e.printStackTrace();

}

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(config);

SqlSession session = factory.openSession();

People p = new People();

p.setName("王五3");

p.setAge(88);

try {

int affected_rows =session.insert("lixin.gan.mapper.PeopleMapper.insertPeople", p);

if (affected_rows <= 0) {

throw new Exception("第1個操作失敗");

} else {

System.out.println("第1個操作成功");

}

} catch (Exception e) {

// 捕獲到異常,将操作復原

//e.printStackTrace();

session.rollback();

}

p.setName("王五222222222222222222222222222");

p.setAge(77);

try {

int affected_rows =session.insert("lixin.gan.mapper.PeopleMapper.insertPeople", p);

if (affected_rows <= 0) {

throw new Exception("第2個操作失敗");

} else {

System.out.println("第2個操作成功");

}

} catch (Exception e) {

session.rollback();

}

session.commit();

session.close();

System.out.println("over");

}

}

第二次調用對象的setName設定的name屬性值,超過了people表中的name字段長度,是以插入操作會失敗,于是會抛出異常,一場被捕獲後,目前的session就會本次session存在期間的所有操作。

注意事項

1、要想使用事務,請将資料庫表的引擎設定為InnoDb,别用MyISAM。

2、如果是DML,請一定要記得commit(),否則操作不會生效。