JAVA基础-JDBC连接池

连接池

连接池主要是用来管理 Connection 对象,减少创建的时候消耗性能,然后还可以重复使用它。当你在使用的时候,如果说访问量激增时,有可能需要等待一定的时间,因为 cpu 会将空闲下来的 Connection 拿来使用,当你使用完了之后,还需要归还到连接池中,让下一个访问者来继续使用

Java 主要在数据连接池方向上,通过提供一套公共的接口:java.sql.DataSource。接着,不同的厂商就 会根据这套规范,然后制定对应的产品,比如 MyBatis、Hibernate 等框架都有不同的连接池实现方 案。

这样,其实是方便了 Java 开发者,我们开发者其实只需要提供一套代码,就可以在不同的厂商产品之间进行切换,不需要针对每个不同的连接池产品去修改我们的代码。 常用的连接池:DBCP、C3P0

C3P0

开源产品,Spring、Hibernate 等框架都有使用它。

首先我们要导入jar包和配置文件配置文件 c3p0-config.xml 。

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

<!-- c3p0配置文件   配置数据源 -->


<!-- default-config 默认 -->
	<default-config>
	<!-- 驱动 -->
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<!-- url -->
		<property name="jdbcUrl">jdbc:mysql:///mybase02</property>
		<!-- 用户名 -->
		<property name="user">root</property>
		<!-- 密码 -->
		<property name="password">root</property>
	</default-config>
	
<!-- named-config  通过名字指定  -->
	<named-config name="test">
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql:///mybase03</property>
		<property name="user">root</property>
		<property name="password">root</property>
	</named-config>



</c3p0-config>

C3P0我们使用起来就很方便,可以直接得到connection对象。同样的,我们依旧利用C3P0封装我们的工具类。

package util;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

//c3p0工具类
public class C3P0Utils {
	
	//找的是默认配置文件中的数据源信息
	private static ComboPooledDataSource cpds=new ComboPooledDataSource();
	//找的是配置文件中 通过名字指定的信息
	ComboPooledDataSource cpds2=new ComboPooledDataSource("test");

	//返回建立连接对象
	public static Connection getConnection() throws SQLException {
		return cpds.getConnection();
	}
	//返回dataSource 数据源 DButils
	public static DataSource getDS() {
		return cpds;
	}
	
//	public static void main(String[] args) {
//		
//		
//		try {
//			//得到建立连接对象
//			Connection c1 = cpds.getConnection();
//			
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}

}

DBUtils

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,创建连接、结果集封装、释放资源,同时也不会影响程序的性能。

API介绍:

  • org.apache.commons.dbutils.QueryRunner --- 核心
  • org.apache.commons.dbutils.ResultSetHandler --- 结果集封装器
  • org.apache.commons.dbutils.DbUtils --- 工具类
package dbutils;

import static org.junit.Assert.*;

import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.junit.Test;

import bean.Classes;
import util.C3P0Utils;

public class Demo1 {

	//DButils封装了 结果   优化查询这部分

	//结果返回单行数据
	@Test
	public void fun1() throws Exception {
		//第一步 初始化QueryRunner对象 并传入数据源
		QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
		//执行查询并返回结果
		//sql sql 语句  
		String sql="select * from classes where id=?";
		//		ResultSetHandler rsh;//结果集处理器  dbutils帮助封装了结果
		//实体类 属性名跟表中字段要一直  有set和get方法  封装
		Classes c1=qr.query(sql, new BeanHandler<Classes>(Classes.class),3);
		System.out.println(c1);
	}
	//结果返回多行数据
	@Test
	public void fun2() throws Exception {
		//第一步 初始化QueryRunner对象 并传入数据源(连接池工具类中封装方法返回数据源)
		QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
		//执行查询并返回结果
		//sql sql 语句  
		String sql="select * from classes";
		List<Classes> ll1=qr.query(sql,new BeanListHandler<Classes>(Classes.class) );
		System.out.println(ll1);
	}

	//模糊查询案例
	@Test
	public void fun3() throws Exception {
		//第一步 初始化QueryRunner对象 并传入数据源(连接池工具类中封装方法返回数据源)
		QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
		//执行查询并返回结果
		//sql sql 语句  
		String sql="select * from classes where name like ?";
		List<Classes> ll1=qr.query(sql,new BeanListHandler<Classes>(Classes.class),"%二%" );
		System.out.println(ll1);

	}

	//其他增删改案例 插入案例 增删改 调用
	@Test
	public void fun4() throws Exception {
		QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
		//执行查询并返回结果
		//sql sql 语句  
		String sql="insert into classes values(?,?)";
		int r1=qr.update(sql,1,"一班");	
		if(r1>0) {
			System.out.println("添加成功!");
		}

	}
	//删除案例
	@Test
	public void fun5() throws Exception {
		QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
		String sql="delete from classes where id=?";
		int rows=qr.update(sql,1);
		if(rows>0) {
			System.out.println("删除成功");
			System.out.println(rows);
		}
	}
	//修改案例
	@Test
	public void fun6() throws Exception {
		QueryRunner queryRunner=new QueryRunner(C3P0Utils.getDS());
		String sql="update classes set name=? where id=?";
		int rows=queryRunner.update(sql,"2班",2);
		if(rows>0) {
			System.out.println("修改成功");
		}
	}
	//查询结果集  beanhandler 单行bean   接收 beanListhandler:多行List<bean>
	// maphandler 单行 返回类型map  mapListhandler 多行
	@Test
	public void fun7() throws Exception {
		//第一步 初始化QueryRunner对象 并传入数据源
		QueryRunner qr=new QueryRunner(C3P0Utils.getDS());
		//执行查询并返回结果
		//sql sql 语句  
		String sql="select * from classes where id=?";
		//		ResultSetHandler rsh;//结果集处理器  dbutils帮助封装了结果
		//实体类 属性名跟表中字段要一直  有set和get方法  封装
		Map<String, Object> query = qr.query(sql, new MapHandler(),3);
		System.out.println(query);
	}

}

原文地址:https://www.cnblogs.com/JeasonIsCoding/p/13232604.html