此文参考为读后理解,如有错误,欢迎指出
原文https://blog.csdn.net/luanlouis/article/details/37671851
1.Mybatis数据源 DataSource分为三类:
- UNPOOLED 不使用连接池
- POOLED 使用连接池
- JNDI 使用JNDI实现
2.DataSource的创建过程
datasource对象的创建发生在Mybatis初始化的过程中,在XML配置文件中使用<dataSource>元素来配置:
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</dataSource>
- MyBatis在初始化时,解析此文件,根据<dataSource>的type属性来创建相应类型的的数据源DataSource
- MyBatis是通过工厂模式来创建数据源DataSource对象的,MyBatis定义了抽象的工厂接
口:org.apache.ibatis.datasource.DataSourceFactory,通过其getDataSource()方法返回数据源DataSource
- MyBatis创建了DataSource实例后,会将其放到Configuration对象内的Environment对象中, 供以后使用
3. DataSource创建Connection对象
当我们需要创建SqlSession对象并需要执行SQL语句时,MyBatis才会去调用dataSource对象来创建java.sql.Connection对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.selectList("SELECT * FROM users");
上述代码,执行到第五行的时候才会创建connection对象,下面是创建connection对象的方法:
protected void openConnection() throws SQLException {
if (log.isDebugEnabled()) {
log.debug("Opening JDBC Connection");
}
connection = dataSource.getConnection();
if (level != null) {
connection.setTransactionIsolation(level.getLevel());
}
setDesiredAutoCommit(autoCommmit);
}
4.UNPOOLED DataSource
MyBatis首先会实例化一个UnpooledDataSourceFactory工厂实例,然后通过.getDataSource()方法返回一个UnpooledDataSource实例对象引用
使用UnpooledDataSource的getConnection(),每调用一次就会产生一个新的Connection实例对象
getConnection()方法代码如下:
public Connection getConnection() throws SQLException
{
return doGetConnection(username, password);
}
private Connection doGetConnection(String username, String password) throws SQLException
{
//封装username和password成properties
Properties props = new Properties();
if (driverProperties != null)
{
props.putAll(driverProperties);
}
if (username != null)
{
props.setProperty("user", username);
}
if (password != null)
{
props.setProperty("password", password);
}
return doGetConnection(props);
}
/*
* 获取数据连接
*/
private Connection doGetConnection(Properties properties) throws SQLException
{
//1.初始化驱动
initializeDriver();
//2.从DriverManager中获取连接,获取新的Connection对象
Connection connection = DriverManager.getConnection(url, properties);
//3.配置connection属性
configureConnection(connection);
return connection;
}
5.对于连接池的理解
暂时理解为 相当于JDBC中的连接池一个概念,具体的,等以后再理解,如释放资源等;
6.JNDI
暂时放着