概述
数据库连接池是一个存放connection连接对象的池子(容器)。
作用
当系统初始化后,容器被创建,容器会申请一些连接对象存放在该容器中,当用户访问数据库的时候,直接从池子中申请,用完后归还到池子中去。
好处
实现
接口
标准的接口是DataSource,包含方法
- 获取连接getConnection
- 归还连接close
具体实现
一般是由数据库厂商来实现
- C3P0数据库连接池技术
- Druid(阿里巴巴提供)
快速使用
C3P0数据库连接池技术
步骤
- 导入jar包(注意要导入数据库连接池的jar包,还要导入数据库驱动jar包)
- 在src(classPath)下定义配置文件,可以配置driverName,user,password,maxSize等
- 定义一个类文件使用
ds=new ComboPooledDataSource
直接new一个连接池
- 数据库连接池直接getConnection获取连接对象
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package cn.itcast.dataSource.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException;
public class Demo1 { public static void main(String[] args) {
try { DataSource ds=new ComboPooledDataSource("other1c3p0"); Connection con = ds.getConnection(); System.out.println(con); con.close(); } catch (SQLException e) { e.printStackTrace(); }
} }
|
Druid(阿里巴巴提供)常用
步骤
- 导入jar包(注意要导入数据库连接池的jar包,还要导入数据库驱动jar包)
- 在src(classPath)下定义配置文件,可以配置driverName,user,password,maxSize等
- 定义一个类文件使用
ds=DruidDataSourceFactory.createDataSource(pro)
这里是通过工厂类来生成连接池
- 数据库连接池直接getConnection获取连接对象
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package cn.itcast.dataSource.druid;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties;
public class Demo01 { public static void main(String[] args) { Properties pro=null; try { pro = new Properties(); InputStream rs = Demo01.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(rs); } catch (IOException e) { e.printStackTrace(); } try { DataSource ds = DruidDataSourceFactory.createDataSource(pro); Connection connection = ds.getConnection(); Statement statement = connection.createStatement(); String sql="SELECT * FROM emp;"; ResultSet rs = statement.executeQuery(sql); while (rs.next()){ System.out.println(rs.getString("ename"));
} } catch (Exception e) { e.printStackTrace(); } } }
|
抽取成工具类DruidUtils
功能
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| package cn.itcast.dataSource.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;
public class DruidUtils { private static DataSource ds;
static { try { Properties pro = new Properties(); InputStream rs = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(rs); ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }
public static Connection getConnection() { try { return ds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; }
public static DataSource getDataSource() { return ds; }
public static void close(ResultSet rs, Statement stmt, Connection con) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } }
public static void close(Statement stmt, Connection con) { DruidUtils.close(null, stmt, con); }
}
|
Spring JDBC(JDBCTemplate)常用
概述
Spring框架对JDBC的简单封装。提供了JDBCTemplate对象简化JDBC的开发。JDBCTemplate对象能自动close对象,极大方便了操作。
步骤
导入jar包
创建JDBCTemplate对象。参数为数据库连接池DataSource
1 2
| DataSource ds= DruidUtils.getDataSource(); JdbcTemplate tmp=new JdbcTemplate(ds);
|
调用方法来实现
- update
- query(查询,通过BeanPropertyRowMapper封装成对象列表)
- queryForObeject(查询,通过BeanPropertyRowMapper封装成对象)
- queryForMap
- queryForList
代码举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package cn.itcast.dataSource.jdbctmplate;
import cn.itcast.dataSource.domain.Emp; import cn.itcast.dataSource.utils.DruidUtils; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource; import java.util.List;
public class JDBCTemplateDemo01 { public static void main(String[] args) { DataSource ds= DruidUtils.getDataSource(); JdbcTemplate tmp=new JdbcTemplate(ds); String sql="SELECT * FROM emp where id=1001"; Emp emp = tmp.queryForObject(sql, new BeanPropertyRowMapper<>(Emp.class)); System.out.println(emp);
String sql1="SELECT * FROM emp;"; List<Emp> emps = tmp.query(sql1, new BeanPropertyRowMapper<>(Emp.class)); for (Emp emp1 : emps) { System.out.println(emp1); }
String sql2="SELECT count(id) FROM emp;"; Long num = tmp.queryForObject(sql2, Long.class); System.out.println(num);
} }
|