MyBatis——(四)分页 c3p0连接池

2018-11-29 16:34:22     

PageHelper是一款犀利的Mybatis分页插件,使用了这个插件之后,分页开发起来更加简单容易。更多详细介绍请点击查看:PageHelper官方

C3P0连接池会根据你的配置来初始化N个数据库连接,空闲时间后连接过期又会自动新建K个连接使得连接池总有空闲的数据库连接等待被取用。我们只需通过dataSourse.getConnection() 即可从线程池中取用一个已经连接好的空闲连接,执行数据库操作。然后“断开”(放回)这个连接,把这个连接的使用权放回连接池。真正的数据库连接的创建与释放是由C3P0在后台自动完成的,我们花的只是取用与释放占用权的时间。全程耗时10+毫秒,比原来提高了几十倍。

这里是基于mybatis第一篇博客MyBatis——(一)CRUD 讲解

PageHelper分页

 jar包准备:

先往老师表(teacher)中插入2o条数据

SqlSession session = sessionFactory.openSession();
for(int i=1;i<20;i++){
    Teacher teacher = new Teacher();
    teacher.setName("test"+i);
    session.insert("addTeacher", teacher);
}
    session.commit();
    session.close();

mybatis-config.xml文件中开启PageHelper插件

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor" />
</plugins>

测试类只需要增加一句PageHelper.offsetPage(0, 5),表示从下标0开始,每页5条数据

// 分页查询
@Test
public void testOne() throws IOException {
	// 获取配置文件
	String resource = "config/mybatis-config.xml";
	// 利用一个叫Resources的类的getResourceAsStream方法从配置文件xml中获取里面的内容资源
	InputStream is = Resources.getResourceAsStream(resource);
	// 然后用SqlSessionFactoryBuilder工厂构建者把获取的资源传进去就构建出了我们需要使用的工厂
	SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
	// 工厂生产产品
	SqlSession session = sessionFactory.openSession();
	//0表示下标,5表示每页5条数据
	PageHelper.offsetPage(0, 5);
	// 产品实现相应的功能(listTeacher这个就是在配置文件teacher.xml中那条sql语句设置的id)
	List<Teacher> list = session.selectList("listTeacher");
	for (Teacher t : list) {
		logger.debug(t);
	}
	PageInfo<Teacher> pageInfo = new PageInfo<>(list);
	//得到teacher表的总条数
        System.out.println("总数:"+pageInfo.getTotal());
	session.commit();
	// 使用session执行完SQL之后需要关闭session
	session.close();
}

c3p0连接池

jar包准备:

Mybatis使用C3P0有点怪怪的,需要自己写个类继承UnpooledDataSourceFactory,然后指定dataSource 为ComboPooledDataSource。这个ComboPooledDataSource就是c3p0的数据源。

package c3p0;

import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
	public C3P0DataSourceFactory() {
		this.dataSource = new ComboPooledDataSource();
	}
}

配置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>
	<!--引入外部properties文件 -->
	<properties resource="config/db.properties" />
	<!-- 自动扫描dao包下的类型,使得在后续配置文件Teacher.xml中使用resultType的时候 
	可以直接使用Teacher,而不必写全dao.Teacher -->
	<typeAliases>
		<package name="dao" />
	</typeAliases>
	<plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor" />
    </plugins>
	<!--和Spring整合后 environments 配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用JDBC事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 引用c3p0包底下的C3P0DataSourceFactory类 -->
			<dataSource type="c3p0.C3P0DataSourceFactory">
				<property name="driverClass" value="${driverClass}" />
				<property name="jdbcUrl" value="${jdbcUrl}" />
				<property name="user" value="${user}" />
				<property name="password" value="${password}" />
				<!-- 连接池初始化大小为3 -->
				<property name="initialPoolSize" value="3" />
				<!-- 连接池最大为10 -->
				<property name="maxPoolSize" value="10" />
				<!-- 连接池最小为3 -->
				<property name="minPoolSize" value="3" />
				<!-- 连接池在无空闲连接可用时一次性最多创建的新数据库连接数 -->
				<property name="acquireIncrement" value="5" />
				<!-- 连接的最大空闲时间,如果超过这个时间(秒),某个数据库连接还没有
				被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,即回收此连接 -->
				<property name="maxIdleTime" value="30" />
				<!-- 最大的Statement数量 -->
				<property name="maxStatements" value="500" />
				<!-- 每个连接启动的最大Statement数量 -->
				<property name="maxStatementsPerConnection" value="50" />
				<!-- 同时运行的线程数 -->
				<property name="numHelperThreads" value="5" />
			</dataSource>
		</environment>
	</environments>
	<!-- 映射teacher.xml加载sql语句 -->
	<mappers>
		<mapper resource="config/teacher.xml" />
	</mappers>
</configuration>
ps:本篇博客源码下载链接:https://pan.baidu.com/s/1uix5rsY4vW3osvLRJw3x9w密码:3r2x
MyBatis——(三)动态SQL

前几篇博客介绍的sql语句都是较简单的单条件查询语句。要是遇到复杂的多条件,往往需要拼接,而拼接 SQL ,稍微不注意,由于引号,空格等缺失可能都会导致错误。 那么怎么去解决这个问题呢?这就是本篇所讲的使用 mybatis 动态SQL,通过 if, where, set, trim, when, choose, otherwise, foreach,bind等标签,可组合成非常灵活的SQL语句,从而在提高 SQL 语句的准确性的同时,也大大提高了开发人员的效率。

MyBatis——(六)逆向工程

MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(mapper.xml、mapper.java、pojo...)。一般在开发中,通过数据库中的单表,自动生成java代码,这样能够大大减少我们平时开发的工作量

 发表评论