组团学

MyBatis事务

阅读 (838171)

1、MyBatis事务提交

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

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

@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); } }
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; }

查询执行结果:

image20200325162025534.png
删除(CUD)执行结果:

image20191113154116737.png

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

注意:

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

<settings> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings>

2、MyBatis事务自动提交

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

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

SqlSession session = factory.openSession(true);

@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(); }

增加执行结果:

image20191113155531874.png

需要 登录 才可以提问哦