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 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存在期间的所有操作。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容