MyBatis 外接 HikariCP 连接池 (无Spring)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/elyacc/article/details/79952851

尝试MyBatis连接HikariCP连接池, 资料基本都来自于 MyBatis官网手册以及 HikariCP Github页面的readme.md教学文件

笔者用的是MySql数据库, 首先根据hikariCP的要求, 选择适合的插入依赖
Java 8/9 maven artifact:

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>2.7.8</version>
    </dependency>

Java 7 maven artifact (*maintenance mode*):

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP-java7</artifactId>
        <version>2.4.13</version>
    </dependency>

Java 6 maven artifact (*maintenance mode*):

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP-java6</artifactId>
        <version>2.3.13</version>
    </dependency>

然后我们查看官方文档, 要求我们写一个继承org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory 的类

public class HikariCPDataSourceFactory extends UnpooledDataSourceFactory {
    public HikariCPDataSourceFactory() {
        this.dataSource = new HikariDataSource();
    }
}

HikariCP 的文档要求我们配置properties, 这个我们不需要担心, 在MyBatis中, 我们只要和不引入外接数据源一样, 配置MyBatis的数据库连接文件就可以了, 唯一变化的, 只是配置文件中的属性, 是我们这个外接数据源的属性即可. 新建hikari.properties(名称不固定)在rescourses文件夹下, 配置

jdbcUrl=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
username=root
password=admin

这里只配置了3个足够的参数, 多余的参数请查阅HikariCP 在 Github上的文档. 这3个参数和我们正常配置的参数还不太一样, 也和正常HikariCP的配置不同, 我们下面分条讲述:

  1. 没有配置driverClassName
  2. HikariCP已经引入了dataSourceClassName作为 jdbcUrl的替代, 但是我们仍然配置了jdbcUrl

问题1: 官方文档如下
driverClassName:
HikariCP will attempt to resolve a driver through the DriverManager based solely on the jdbcUrl,
but for some older drivers the driverClassName must also be specified. Omit this property unless
you get an obvious error message indicating that the driver was not found.
大意就是说, HikariCP会根据jdbcUrl这个属性来帮我们找到 driver, 但是一些旧的driver并不能被找到, 报错的时候我们再来手动添加这个属性.

问题2: 官方文档如下
dataSourceClassName:
We recommended using dataSourceClassName instead of jdbcUrl, but either is acceptable. We’ll say that again, either is acceptable.
Spring Boot auto-configuration users, you need to use jdbcUrl-based configuration.
The MySQL DataSource is known to be broken with respect to network timeout support. Use jdbcUrl configuration instead.
dataSourceClassName 这个属性可以提供JDBC驱动, 并且是官方推荐我们使用这个属性 替代使用 jdbcUrl. 但是 MySQL 数据库在网络超时的支持上有崩溃的可能, 所以我们使用MySQL数据库时还是使用jdbcUrl, 另外, spring 自定义扩展 也要使用jdbcUrl这一个属性

关于数据库的dataSourceClassName, 各个数据库的值也是固定的, 也请翻阅hikariCP的官方文档.

接下来我们配置MyBatis的SqlMapConfig.xml, 加入

<properties resource="hikari.properties"></properties>

然后配置dataSource

<dataSource type="com.itheima.utils.HikariCPDataSourceFactory" >
        <property name="jdbcUrl" value="${jdbcUrl}" />
        <property name="username" value="${username}" />
        <property name="password" value="${password}" />
</dataSource>

这里的name以及${}需要和我们在hikari.properties中设置的属性一致, 配置完成我们利用jUnit和Log日志进行测试,
项目构建以及数据库user表如下:
项目构建数据库

<!-- UserMapper.xml 配置 -->
<mapper namespace="com.itheima.builder.UserMapper">
  <select id="getUserById" resultType="user"  parameterType="int">
    select * from user where id = #{id}
  </select>
</mapper>
public class Demo01 {
    private SqlSession sqlSession;

    @Before
    public void init() throws IOException {
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(Resources.getResourceAsStream("SqlMapConfig.xml"));
        sqlSession = factory.openSession();
    }

    @Test
    public void selectUserById2() throws IOException {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);
    }

    @After
    public void close() {
        sqlSession.close();
    }
}

输出(一部分):
输出结果
已经查找到了我们存放的数据, 并且还看到了 dataSource的属性

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页