关于mybatis中继承Druid的问题
2618
2021.01.18
发布于 未知归属地

最近在学习mybatis框架,我们知道mybatis中DataSource标签中的type属性可以定义POOLED,UNPOOLED, JNDI 三种属性,分别代表了使用连接池,不使用连接池, 从在应用服务器向配置好的 JNDI 数据源 dataSource 获取数据库连接。(浅显的理解)

那么除了这三种方式外,我想使用阿里开源的durid连接池技术。我使用了如下的方式进行配置:

1.首先实现实现mybatis中DataSourcesFactory接口,重写其中的setProperties()方法和getDataSource()方法

package com.AITCL.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.DataSourceFactory;
import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 为了使用阿里开源的druid数据连接池而创建的类
 * @author xuning
 */
public class useDruidDataSourceFactory implements DataSourceFactory {
    private Properties properties;
    public void setProperties(Properties props) {
        this.properties = props;
    }

    public DataSource getDataSource() {
        InputStream in = useDruidDataSourceFactory.class.getClassLoader().getResourceAsStream("druid.properties");
        DataSource dataSource = null;
        try {
            this.properties.load(in);
            dataSource = DruidDataSourceFactory.createDataSource(this.properties);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return dataSource;
    }
}

2.在config.xml中配置type属性

<?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">
<!--mybatis的主配置文件-->
<configuration>
    <!--只能配置domain中类的别名-->
    <typeAliases>
        <!--用于指定要配置别名的包,当指定后,该包下的实体类都会注册别名,并且类名就是别名,不再区分大小写-->
        <package name="com.AITCL.domain"/>
    </typeAliases>
    <!--配置环境-->
    <environments default="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置事务的类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--
                配置数据源
                使用阿里巴巴开源的数据库连接池
                com.AITCL.config.useDruidDataSourceFactory
            -->
            <dataSource type="com.AITCL.config.useDruidDataSourceFactory">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatislearn?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="09161549"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置 每个dao独立的配置文件-->
    <mappers>
        <!--UserDao的配置文件-->
       <mapper resource="com/AITCL/dao/UserDaoMapper.xml"/>
        <!--RoleDao的配置文件-->
        <mapper resource="com/AITCL/dao/RoleDaoMapper.xml"/>
        <!--用于指定dao接口所在的包,当指定完成之后就不用谢mapper-->
        <!--<package name="com.AITCL.dao"/>-->
    </mappers>
</configuration>

3.写测试类

 @Test
    public void findUserByidTest(){
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        UserDaoI mapper = sqlSession.getMapper(UserDaoI.class);
        User userById = mapper.findUserById(48);
        System.out.println(userById);
    }

4.运行结果
2021-01-18 22:16:29,813 226 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
2021-01-18 22:16:30,854 1267 [ main] INFO aba.druid.pool.DruidDataSource - {dataSource-1} inited
2021-01-18 22:16:30,857 1270 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7205765b]
2021-01-18 22:16:30,861 1274 [ main] DEBUG .AITCL.dao.UserDaoI.deleteUser - ==> Preparing: delete from user where id = ?
2021-01-18 22:16:30,914 1327 [ main] DEBUG .AITCL.dao.UserDaoI.deleteUser - ==> Parameters: 50(Integer)
2021-01-18 22:16:30,917 1330 [ main] DEBUG .AITCL.dao.UserDaoI.deleteUser - <== Updates: 0
2021-01-18 22:16:30,917 1330 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Committing JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7205765b]
2021-01-18 22:16:30,917 1330 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7205765b]
2021-01-18 22:16:30,918 1331 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7205765b]
1.使用druid,查看日志信息我们发现,Connection连接并没有放会连接池,而是直接被销毁,这是为什么呢?

评论 (4)