一、数据库连接池
Mybatis有自己的连接池技术。在 Mybatis 的主配置文件中,通过<dataSource type=”pooled”>来实现 Mybatis 中连接池的配置
1.1、连接池分类
mybatis支持三种内置的数据源类型:
Pooled:
实现dataSource接口,并且使用了池的思想。UNPooled:
同样也是实现了dataSource接口,但是该类型并没有使用池的思想。JDNI:
采用服务器提供的JDNI技术实现的,并且在不同服务器之间获取的连接池是不一样的。
注意:如果项目不是web或者maven的war工程,则是无法使用的。比如Tomcat服务器采用的就是DBCP连接池
1.2、连接池数据源配置
<!-- 配置 mybatis 的环境 --> <environments default="development"> <!-- 配置 mysql 的环境 --> <environment id="development"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"/> <!-- 配置连接数据库的信息:用的是数据源(连接池) --> <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> </environment> </environments>
1.3、PooledDataSource源码分析流程图
参考文章:https://my.oschina.net/mengyuankan/blog/2664784
二、Mybatis事务管理
Mybatis 中事务的提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制
运行之前的代码:
package com.dianchou.test; import com.dianchou.dao.UserMapper; import com.dianchou.domain.QueryVo; import com.dianchou.domain.User; 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 org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; public class MybatisTest { private InputStream in = null; private SqlSessionFactoryBuilder builder =null; private SqlSessionFactory factory = null; private SqlSession sqlSession = null; private UserMapper mapper = null; @Before public void init() throws IOException { //1.读取配置文件 in = Resources.getResourceAsStream("mybatis-config.xml"); //2.创建SqlSessionFactory构建者对象 builder= new SqlSessionFactoryBuilder(); //3.创建SqlSessionFactory factory = builder.build(in); //4.使用 SqlSessionFactory 生产 SqlSession 对象 sqlSession = factory.openSession(); //5.使用 SqlSession 创建 dao 接口的代理对象 mapper = sqlSession.getMapper(UserMapper.class); } @Test public void testSaveUser2(){ User user = new User(); user.setUsername("AA"); user.setAddress("shenzhen"); user.setSex("女"); user.setBirthday(new Date()); System.out.println("保存之前: " + user ); mapper.saveUser(user); System.out.println("保存之后: " + user ); } @After public void destroy() throws IOException { //事务提交 sqlSession.commit(); //7.释放资源 sqlSession.close(); in.close(); } }
设置自动提交事务(不常用):