数据库连接池
概述:管理数据库连接
作用:提高项目的性能
原理:在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,从连接池中取出一个已建立的空闲连接对象。使用完毕后,将连接放回连接池中,以供下一个请求访问使用
☆必须导入(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 }
dbUtilsDemo
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 }
DataSourceUtils