数据库连接池
概述:管理数据库连接
作用:提高项目的性能
原理:在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,从连接池中取出一个已建立的空闲连接对象。使用完毕后,将连接放回连接池中,以供下一个请求访问使用
☆必须导入(mysql-connector-java-5.1.40-bin.jar和mchange-commons-java-0.2.11.jar);
☆所有的连接池必须实现一个接口:java.sql.DataSource
☆获取连接的方法:Connection getConnection();
☆归还连接的方法:XXX.close();
常用的数据库连接池有:DBCP和C3P0
DBCP使用步骤:
1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
a.硬编码
1 //创建连接池 2 BasicDataSource source=new BasicDataSource(); 3 4 //配置信息 5 source.setDriverClassName("com.mysal.jdbc.Driver"); 6 source.setUrl("jdbc:mysql://localhost:3306/需要连接的数据库名称"); 7 source.setUsername("数据库登录名称"); 8 source.setPassword("数据库登录密码"); 9 10 //获取连接 11 Connection connection=source.getConnection(); 12 13 //设置SQL语句 14 String sql=" "; 15 16 //编写预处理语句 17 prepareStatement prepare=connection.prepareStatement(sql);
b.配置文件
先编写一个properties文件或Xml文件
1 //声明配置 2 Properties properties=new Properties(); 3 properties.load(new FileInputStream("配置文件的位置")); 4 5 //创建连接池 6 DataSource source=new BasicDataSourceFactory(); 7 8 //获取连接 9 Connection connection=source.getConnection(); 10 11 //设置SQL语句 12 String sql=" "; 13 14 //编写预处理语句 15 prepareStatement prepare=connection.prepareStatement(sql);
c3p0使用步骤:
1.导入jar包(c3p0-0.9.1.2.jar);
a.使用硬编码
1 //创建连接池 2 ComboPooledDataSource source=new ComboPooledDataSource(); 3 4 //设置参数 5 source.setDriverClass(com.mysql.jdbc.Driver); 6 source.setJdbcUrl("jdbc:mysql://localhost:3306/需要连接的数据库名称"); 7 source.setUser("数据库登录账号"); 8 source.setPassword("数据库登录密码"); 9 10 //获取连接 11 Connection connection=source.getConnection(); 12 13 //设置SQL语句 14 String sql= " "; 15 16 //编写预处理语句 17 PreparedStatement st=connection.prepareStatement(sql);
b.配置文件
配置文件的名称(必须):c3p0.properties 或者 c3p0-config.xml
配置文件的路径(必须):src下
1 //创建连接池 2 ComboPooledDataSource source=new CombopooledDataSource(); 3 4 //获取连接 5 Connection connection=source.getConnection(); 6 7 //设置SQL语句 8 String sql= " "; 9 10 //编写预处理语句 11 PreparedStatement st=connection.prepareStatement(sql);
使用dbutils
dbutils是apache组织的一个工具类,更放方便我们使用
使用步骤
1.导入jar包(commons-dbutils-1.4.jar);
2.创建QueryRunner类
3.编写sql
4.执行sql query(....)执行r操作 updata(....)执行c u d操作
核心类和接口:
QueryRunner:类名
作用:操作sql语句
构造器:
new QueryRunner(Datasource ds);
注意:
底层帮我们创建连接,创建语句执行者 ,释放资源.
常用方法:
query(..):
update(..):
DbUtils:释放资源,控制事务 类
closeQuietly(conn):内部处理了异常
commitAndClose(Connection conn):提交事务并释放连接
ResultSetHandler:封装结果集 接口
ArrayHandler, 将查询结果的第一条记录封装成数组,返回
ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
ColumnListHandler, 将查询结果的指定一列放入list中返回
MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回
MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回
ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值
dbutils案例:
1 import java.sql.SQLException; 2 import java.util.List; 3 import java.util.Map; 4 5 import org.apache.commons.dbutils.QueryRunner; 6 import org.apache.commons.dbutils.handlers.BeanHandler; 7 import org.apache.commons.dbutils.handlers.BeanListHandler; 8 import org.apache.commons.dbutils.handlers.MapHandler; 9 import org.apache.commons.dbutils.handlers.MapListHandler; 10 import org.junit.Test; 11 12 import com.jdbc.utlis.Category; 13 import com.jdbc.utlis.DataSourceUtils; 14 15 public class dbUtils { 16 @Test 17 public void insert(){ 18 //创建queryRunner类 19 QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource()); 20 //编写sql 21 String sql="INSERT INTO user VALUES(9,'东尼大木和周杰伦')"; 22 try { 23 //执行sql; 24 int update = queryRunner.update(sql); 25 System.out.println(update); 26 } catch (SQLException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } 30 } 31 @Test 32 public void select(){ 33 //创建queryRunner类 34 QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource()); 35 //编写sql 36 String sql="select * from user "; 37 //执行sql; 38 try { 39 List<Map<String, Object>> query = queryRunner.query(sql, new MapListHandler()); 40 for (Object object : query) { 41 System.out.println(object); 42 } 43 44 } catch (SQLException e) { 45 // TODO Auto-generated catch block 46 e.printStackTrace(); 47 } 48 } 49 }
dbutils在使用时用到的工具类:
☆工具类在使用时需要导入c3p0的jar包并配置c3p0的配置文件用于连接数据库
1 package com.jdbc.utlis; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 import javax.sql.DataSource; 9 10 import com.mchange.v2.c3p0.ComboPooledDataSource; 11 12 public class DataSourceUtils { 13 private static ComboPooledDataSource dataSource=new ComboPooledDataSource(); 14 /** 15 * 获取数据源 16 * @return ComboPooledDataSource 连接池 17 */ 18 public static DataSource getDataSource(){ 19 return dataSource; 20 21 } 22 /** 23 * 24 * 获取连接 25 * @return 连接 26 * @throws SQLException 27 */ 28 public static Connection getConnection() throws SQLException{ 29 return dataSource.getConnection(); 30 } 31 /** 32 * 释放资源 33 * @param Connection,Statement,ResultSet 34 */ 35 public static void closeResource(Connection connection,Statement statement,ResultSet resultSet){ 36 closeResultSet(resultSet); 37 closeStatent(statement); 38 closeConnection(connection); 39 } 40 /** 41 * 释放资源 42 * @param Connection 43 */ 44 public static void closeConnection(Connection connection){ 45 if(connection!=null){ 46 try { 47 connection.close(); 48 } catch (SQLException e) { 49 // TODO Auto-generated catch block 50 e.printStackTrace(); 51 } 52 } 53 connection=null; 54 } 55 /** 56 * 释放资源 57 * @param Statement 58 */ 59 public static void closeStatent(Statement statement){ 60 if(statement!=null){ 61 try { 62 statement.close(); 63 } catch (SQLException e) { 64 // TODO Auto-generated catch block 65 e.printStackTrace(); 66 } 67 } 68 statement=null; 69 } 70 /** 71 * 释放资源 72 * @param ResultSet 73 */ 74 public static void closeResultSet(ResultSet resultSet){ 75 if(resultSet!=null){ 76 try { 77 resultSet.close(); 78 } catch (SQLException e) { 79 // TODO Auto-generated catch block 80 e.printStackTrace(); 81 } 82 } 83 resultSet=null; 84 } 85 }