本节示例代码在 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&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&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&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)
符合预期!😆