MyBatis 教程

文章列表
简介 准备工作 回顾 JDBC 数据准备 查找id为1的用户信息 自定义连接池 不用MyBatis配置文件 查询密码为123的所有用户 如果Bean中成员变量和表中字段命名不一致 更多查询用户的方式 对查询结果排序 日志 添加、删除、修改数据 事务 动态SQL 一对一和一对多的实现 一对一和一对多的延迟加载 多对多的实现 分页查询 把SQL写在注解中 自动生成Mapper代码和映射XML mybatis generator 生成 select for update mybatis generator 支持数据版本号

MyBatis: 自定义连接池


本节示例代码在 mybatis-demo-002

1. mybatis 内置连接池

在上一节中 MyBatis 的配置文件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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/blog_db?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

其中<dataSource>用来配置数据库连接,它指定了type为POOLED,意思是将数据库连接放进「池子」里,也就是连接池。若type设置成UNPOOLED,则不使用连接池。各种服务中一般建议使用连接池,它可以帮助我们管理连接,通过资源重用以节省开销。

对于 mybatis 的连接池,除了配置数据库地址、用户名、密码,还有更多可以配置,例如配置成:

<dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/blog_db?useUnicode=true&amp;characterEncoding=utf8"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>

    <property name="poolMaximumActiveConnections" value="10" />
    <property name="poolTimeToWait" value="5000" />
    <property name="poolPingEnabled" value="true"/>
    <property name="poolPingQuery" value="select 1 from user" />
</dataSource>

这些属性的介绍,可以在 http://www.mybatis.org/mybatis-3/zh/configuration.html 找到。

2. 自定义连接池

POOLED 用的是mybatis自己实现的连接池。我们也可以自定义连接池。

比如我们用 DBCP 连接池。

第1步:

首先在 build.gradle 中增加依赖:

compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.5.0'

第2步:

编写实现org.apache.ibatis.datasource.DataSourceFactory接口的类:

package datasource;

import lombok.Data;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.datasource.DataSourceFactory;

import javax.sql.DataSource;
import java.util.Properties;

@Data
public class DBCPDataSourceFactory implements DataSourceFactory {

    private String username;
    private String password;
    private String driver;
    private String url;
    private int initialSize = 6;
    private int maxIdle = 8;
    private int minIdle = 6;

    @Override
    public void setProperties(Properties props) {
        username = props.getProperty("username");
        password = props.getProperty("password");
        driver = props.getProperty("driver");
        url = props.getProperty("url");

        initialSize = Integer.valueOf(props.getProperty("initialSize", ""+initialSize));
        maxIdle = Integer.valueOf(props.getProperty("maxIdle", ""+maxIdle));
        minIdle = Integer.valueOf(props.getProperty("minIdle", ""+minIdle));
    }

    @Override
    public DataSource getDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driver);
        dataSource.setInitialSize(initialSize);
        dataSource.setMaxIdle(maxIdle);
        dataSource.setMinIdle(minIdle);
        return dataSource;
    }

}

我们声明了 username、password、driver、url、initialSize、maxIdle、minIdle 7个属性。这些属性可以在 mybatis 配置文件中配置。见下一步。

第3步:

在 resources 目录新增 mybatis 配置文件 mybatis-config-dbcp.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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="datasource.DBCPDataSourceFactory">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/blog_db?useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
                <property name="maxIdle" value="20"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

注意,<dataSource> 的 type 属性值是上面定义的 DBCPDataSourceFactory 类的全路径。几个<property>标签中的 name值 和 DBCPDataSourceFactory 中的字段是一致的。

第4步:

在 Main 类中编写业务代码:

@Test
public void test_02() throws IOException {
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sessionFactory;
    sessionFactory = sqlSessionFactoryBuilder.build(
            Resources.getResourceAsReader("mybatis-config-dbcp.xml"),
            "development"
    );
    SqlSession sqlSession = sessionFactory.openSession();

    try {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.findById(1L);
        log.info("{}", user);
    } finally {
        sqlSession.close();
    }
}

执行结果:

 INFO [main] - User(id=1, name=letian, email=letian@111.com, password=123)

符合预期!😆


( 本文完 )

文章目录