zoukankan      html  css  js  c++  java
  • 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存在期间的所有操作。

      

    注意事项

      1、要想使用事务,请将数据库表的引擎设置为InnoDb,别用MyISAM。

      2、如果是DML,请一定要记得commit(),否则操作不会生效。

  • 相关阅读:
    二维线性表 list实现
    行测题
    邻接表
    链表中插入和删除结点
    linux监控指标和命令
    lr测试结果分析
    python 装饰器 decorator
    并查集 PID331 / 家族
    素数环 dfs+回溯
    catch the cow bfs
  • 原文地址:https://www.cnblogs.com/-beyond/p/10130300.html
Copyright © 2011-2022 走看看