JDBC高级
JDBC连接池的使用
-
数据库连接池的概念
- 数据库的连接是一种关键有限的资源,在java程序与数据库获得连接的时候特别的消耗资源,所以创建一个数据库连接池对数据库与程序的连接进行统一管理 ,重复利用连接。
-
第三方开源连接池
-
c3p0连接池
- 配置文件名必须为:c3p0-config.xml或者c3p0-config.properties
- 配置文件必须处于src文件的下面
-
基本使用
-
配置文件
<c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <default-config> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost/day05</property> <property name="user">root</property> <property name="password">root</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">1000</property> <property name="checkoutTimeout">3000</property> </default-config> <named-config name="otherc3p0"> <!-- 连接参数 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/db15</property> <property name="user">root</property> <property name="password">itheima</property> <!-- 连接池参数 --> <property name="initialPoolSize">5</property> <property name="maxPoolSize">8</property> <property name="checkoutTimeout">1000</property> </named-config> </c3p0-config>
package com.wx.c3p0; import com.mchange.v2.c3p0.ComboPooledDataSource; import java.sql.Connection; import java.sql.SQLException; public class C3P0Test { public static void main(String[] args) { //创建连接池对象 ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); try { //获得连接 Connection connection = comboPooledDataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } } }
-
druid连接池
-
是阿里巴巴开发的一款开源的数据库连接池软件
-
需要创建配置文件并且手动加载配置文件
-
配置文件:properties配置
-
properties配置:
url=jdbc:mysql://localhost:3306/exercise username=root password=root driverClassName=com.mysql.jdbc.Driver # 初始连接数 initialSize=6 # 最大连接数 maxActive=10 #超时等待时间 maxWait=10000
-
druid连接池的使用
public static void main(String[] args) throws Exception { //加载配置文件 InputStream config = DruidConnectionPoolTest.class.getResourceAsStream("/druid.properties"); System.out.println(config); Properties properties = new Properties(); properties.load(config); //创建连接对象 DataSource connectionPool = DruidDataSourceFactory.createDataSource(properties); System.out.println(connectionPool.getConnection()); }
-
-
连接池工具类
/** * 数据库连接池工具类 */ public class ConnectionUtils { //私有化构造方法 private ConnectionUtils() { } ; //声名数据源变量 private static DataSource dataSource; private static Properties properties; //提供静态代码块加载配置文件 static { InputStream resourceAsStream = ConnectionUtils.class.getClassLoader().getResourceAsStream("druid.properties"); properties = new Properties(); try { properties.load(resourceAsStream); dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } //提供一个获得数据库连接对象的方法 public static Connection getConnection() { Connection con = null; try { con = dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return con; } // 关闭资源 public static void close(Connection con, ResultSet rs, Statement st) { if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
-
自定义JDBC连接池
- java官方提供了一个数据库连接池的规范(DataSource接口)
- 自定义连接池就是对DataSource接口进行实现
- 核心功能getConnection
- 实现连接的重复 使用
- 实现思路:
- 定义静态代码快获得指定数量的连接
- 定义集合保存连接
- 归还连接功能的实现:(继承,代理,装饰者设计模式,适配器设计模式 )
自定义JDBC框架
- 在使用jdbc的时候大部分的代码都是相同只是sql的语句的不同,可以对这些代码进行封装为一个工具类这就是一个简单的jdbc的 框架
- 源信息表示数据的结构信息
- 数据库的源信息
- 获得参数源信息:ParameterMetaData
- 获取预编译对象的每个参数的相关信息
- 获得预编译对象的参数个数:getParameterCount()
- 获得结果集的源信息
- 编写自定义框架的update方法思路:
- 方法传递的参数是sql语句与执行sql参数
- 对传递的sql语句进行预编译
- 判断sql语句需要的参数与传递的参数个数 是否相同,如果不相同就报错
- 如果相同就 替换占位符执行sql语句返回影响结果
- 封装查询方法
- 对于sql语句的查询结果有多种
- 查询结果是一个标量
- 查询结果是一行
- 查询结果是多行
- 定义一个接口对返回的结果集进行处理方法
- 策略模式
- 实现了查询结果与对结果的处理的解耦
- 对于sql语句的查询结果有多种