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 id="insertPeople" parameterType="People">
insert into people values (null, #{name}, #{age})
</insert>
测试代码如下:
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存在期间的所有操作。