MyBatis事务

2022-09-14 21:31:22 浏览数 (1)

1、MyBatis事务提交

在 JDBC 中我们可以通过手动方式将事务的提交改为手动方式,通过 setAutoCommit()方法就可以调整。

MyBatis中事务的提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制。

代码语言:javascript复制
@Test
public void addUser(){
        User u=new User();
        u.setUsername("李四");
        u.setBirthday(new Date());
        u.setSex("男");
        u.setAddress("北京海淀");
        userDao.addUser(u);
}

@Test
public void findAll(){
        List<User> list=userDao.findAll();
        for(User u :list){
            System.out.println(u);
        }
}
代码语言:javascript复制
public int addUser(User u) {
        SqlSession session=factory.openSession();
        int n=session.insert("com.tyschool.mb002.user.dao.IUserDao.addUser",u);
        session.commit();
        session.close();
        return n;
}

public List<User> findAll() {
        SqlSession session=factory.openSession();
        List<User> list=session.selectList("com.tyschool.mb002.user.dao.IUserDao.findAll");
        session.close();
        return list;
}

查询执行结果:

删除(CUD)执行结果:

这是我们的 Connection 的整个变化过程,通过分析我们能够发现之前的 CUD 操作过程中,我们都要手动进行事务的提交,原因是 setAutoCommit()方法,在执行时它的值被设置为 false 了,所以我们在 CUD 操作中,必须通过 session.commit()方法来执行提交操作。

注意:

如果想在控制台显示MyBatis的整个操作过程,我们需要在SqlMapConfig.xml中用到settings全局配置

代码语言:javascript复制
<settings>
  <setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

2、MyBatis事务自动提交

前面我们通过分析发现我们在CUD 操作过程中,都要手动进行事务的提交,原因是 setAutoCommit()方法,在执行时它的值被设置为 false 了,所以我们在 CUD 操作中,必须通过 session.commit()方法来执行提交操作。

那么要想自动提交,我们则需要将setAutoCommit(false)改为true,设置如下

SqlSession session = factory.openSession(true);

代码语言:javascript复制
 @Test
    public void testAddUser(){
        User_old user=new User_old();
        user.setUsername("王小红");
        user.setBirthday(new Date());
        user.setAddress("北京昌平");
        user.setSex("女");
        System.out.println("保存前:" user);
        int id=userDao.addUser(user);
        System.out.println("保存后:" user);
        System.out.println(user.getId());
    }
    @Before
    //在测试方法执行之前执行
    public void init()throws Exception {
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.创建 SqlSession 工厂对象
        factory = builder.build(in);
        // 4.创建 SqlSession 对象
        session = factory.openSession(true);
        //5.创建 Dao 的代理对象
        userDao = session.getMapper(IUserDao.class);

    }
    @After//在测试方法执行完成之后执行
    public void destroy() throws Exception{
        //session.commit();
        //7.释放资源
        session.close();
        in.close();
    }

增加执行结果:

0 人点赞