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 再根据情况决定是否进行提交,这种方式更常用。因为我们可以根据业务
情况来决定提交是否进行提交。

 

posted @ 2022-03-09 17:02  CGGirl  阅读(57)  评论(0)    收藏  举报