Mybatis整合Druid连接池,及相关说明。
目录
(1)第一步:通过maven引入Druid的依赖
(2)第二步:创建Druid和Mybatis兼容所需的数据源工厂类:DruidDataSourceFactory类
(3)第三步:在mybatis-config.xml中设置一下
(4)第四步:测试
(1)第一步:通过maven引入Druid的依赖
(2)第二步:创建Druid和Mybatis兼容所需的数据源工厂类:DruidDataSourceFactory类
DruidDataSourceFactory:
package com.imooc.oa.datasource;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* Druid的数据源工厂类
*/
public class DruidDataSourceFactory extends UnpooledDataSourceFactory {
/**
* 一个默认的构造函数:用意是通过代码手动的去实例化数据源对象;
*/
public DruidDataSourceFactory(){
this.dataSource = new DruidDataSource();
}
@Override
public DataSource getDataSource() {
try {
((DruidDataSource) this.dataSource).init();
} catch (SQLException e) {
throw new RuntimeException(e); // 如果产生错误,直接把其包装成一个运行异常抛出去;
}
return this.dataSource;
}
}
说明:
(1)DruidDataSourceFactory类:需要集成UnpooledDataSource父类,重新给dataSource对象赋值;
(2)DruidDataSourceFactory类:对于Druid连接池来说,需要重写父类(UnpooledDataSource类)的getDataSource方法
(3)DataSource数据源接口:说明1
所以,getDataSource()方法的返回值DataSource其实际上就是DruidDataSource这个实现了DataSource接口的实现类
(4)DataSource数据源接口:说明2
DataSource接口是行业的标准,是一个规则,,,,每一个数据库连接池产品都要按这个接口的标准来去定义与之对应的实现类。
这样设计的好处:当我们某天不使用Druid,改用其他的数据库连接池,只需要实例化不同的DataSource实现类就可以了:
(3)第三步:在mybatis-config.xml中设置一下
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--开启驼峰命名转换-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<environments default="dev">
<!--开发环境配置-->
<environment id="dev">
<!--事务管理器采用JDBC方式-->
<transactionManager type="JDBC"></transactionManager>
<!--暂时利用Mybatis自带连接池管理连接-->
<dataSource type="com.imooc.oa.datasource.DruidDataSourceFactory">
<!--以下几项,就是JDBC连接属性了-->
<!--设置MySQL驱动类;因为我们使用的MySQL驱动是8版本,所以这儿的value需要加上"cj"-->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<!--设置url数据库连接字符串。。。其中【characterEncoding=UTF-8】(采用UTF-8编码进行数据传输)
和【serverTimezone=Asia/Shanghai】(设置当前服务器的时区,这样才数据库中存储的时间才是正确的。)-->
<property name="url" value="jdbc:mysql://localhost:3306/imooc-oa ? useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
<!--连接池初始连接数-->
<property name="initialSize" value="10"/>
<!--连接池最大连接数-->
<property name="maxActive" value="20"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/test.xml"/>
</mappers>
</configuration>
说明:
预:和原先内容的对比:
(1)首先,设置type属性,让其指向设置的那个属性
(2)driverClassName等属性名修改了:这些属性名为什么要修改???
其还有其他属性名:
想表达的意思就是:当使用Druid连接池的时候,mybatis-config.xml中设置的属性的名字必须要和DruidDataSource类内部定义好的那些属性名。
(3)DruidDataSourceFactory类的深入分析1:实例化dataSource对象
(4)DruidDataSourceFactory类的深入分析2:setProperties方法
这样以后,setProperties方法执行完了之后,这个DataSource的实现类DruidDataSource中就包含了在mybatis-config.xml中配置的连接信息了。
(5)DruidDataSourceFactory类的深入分析3:对于Druid连接池来说,还需要调用init()方法;来对数据源进行初始化;因此,需要重写getDataSource方法
这儿只是Druid连接池进行了初始化,而前面遇到的C3P0连接池就不需要调用init()方法去初始化。
是否需要重写getDataSource()方法是根据【对应的连接池产品是否需要在获取数据源时进行某些额外的操作】决定的。。。。。因为,Druid连接池在获取连接时,需要调用init()方法对这个数据源进行检查和初始化的工作,所以,这儿需要重写getDataSource()方法。。。。。。。。
(6)上面的执行顺序
这样以后:
(4)第四步:测试