Mybatis04_连接池和事务
Mybatis提供了自己的连接池技术,是在核心配置文件的DataSource标签中配置
1、Mybatis连接池的分类

通过Mybatis的jar包中可以看出,Mybatis将它的数据源分为三类

Mybatis内部提供了实现了java.sql.DataSource接口的实现类:UnpooledDatasource和PooledDatasource,分别来表示UNPOOLED和POOLED类型数据源
2、Mybatis数据源的配置
我们的数据源配置就是在mybatis的核心配置文件 SqlMapConfig.xml 文件中,具体配置如下: <!-- 配置数据源(连接池)信息 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> MyBatis 在初始化时,根据<dataSource>的 type 属性来创建相应类型的的数据源 DataSource,即: type=”POOLED”:MyBatis 会创建 PooledDataSource 实例 type=”UNPOOLED” : MyBatis 会创建 UnpooledDataSource 实例 type=”JNDI”:MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用
3、Mybatis中连接获取的过程分析
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); SqlSession sqlSession = factory.openSession(); List<User> list = sqlSession.selectList("findUserById",41); System.out.println(list.size());
当我们创建SqlSession对象并且要执行SQL语句的时候,mybatis才会去调用DataSource对象来创建java.sql.Connection对象。即Connection对象的创建一直延迟到指定SQL语句的时候
通过分析原码,得出PooledDataSource工作原理如下:

Mybatis的事务控制:
1、JDBC中事务控制:
在JDBC中通过手动更改setAutoCommit()为false就可以开启事务。
2、Mybatis事务控制
1)分析:由于Mybatis是对JDBC的封装,所以本质上也是调用setAutoCommit()来开启事务
一个简单的事务控制: @Test public void testSaveUser() throws Exception { User user = new User(); user.setUsername("mybatis user09"); //6.执行操作 int res = userDao.saveUser(user); System.out.println(res); 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(); //5.创建 Dao 的代理对象 userDao = session.getMapper(IUserDao.class); } @After//在测试方法执行完成之后执行 public void destroy() throws Exception{ //7.提交事务 session.commit(); //8.释放资源 session.close(); in.close(); }
查看控制台的输出:

这是我们的 Connection 的整个变化过程,通过分析我们能够发现之前的 CUD 操作过程中,我们都要手动进 行事务的提交,原因是 setAutoCommit()方法,在执行时它的值被设置为 false 了,所以我们在 CUD 操作中, 必须通过 sqlSession.commit()方法来执行提交操作。
2)设置Mybatis的事务自动提交
通过以上分析我们知道,Mybatis默认的时候事务自动提交时关闭的,所以需要手动commit
设置自动提交:
session = factory.openSession(true);
控制台输出:

我们发现,此时事务就设置为自动提交了,同样可以实现CUD操作时记录的保存。虽然这也是一种方式,但就 编程而言,设置为自动提交方式为 false 再根据情况决定是否进行提交,这种方式更常用。因为我们可以根据业务 情况来决定提交是否进行提交。

浙公网安备 33010602011771号