一、数据库连接池介绍

1、引入

  • 之前:每次都要获取连接释放连接
  • 现在:连接重复使用

2、概念:

  • 存放数据库连接的容器

3、实现

  • DataSource接口
  • 三种实现
    • 标准实现
    • 连接池实现
      • C3P0
      • Druid实现,阿里提供
    • 分布式事务实现

3、方法

  • 获取连接
  • 归还连接:close()    

二、C3P0连接池实现

1、两种使用方式

  • 硬编码:将驱动类、链接地址写死在程序中
  • 配置文件:c3p0.properties or c3p0-config.xml

2、使用步骤

  • 导入jar包 : c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar
  • 定义配置文件(可以配置多个连接池,构造写名字)并放到src目录下

   

  • 创建数据库连接池核心对象ComboPooledDataSource
  • 获取连接:getConnection
package cn.itcast.datasource.c3p0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* c3p0的演示
*/
public class C3p0Demo1 {
public static void main(String[] args) throws SQLException {
//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2.获取连接对象
Connection conn = ds.getConnection();//之前是DriverManager
//3.打印
System.out.println(conn);
}
}

三、Druid连接池实现

1、使用步骤

  • 导入jar包druid-1.0.9.jar
  • 定义.properties配置文件,进行手动加载

 

  • 加载配置文件 ,使用Properties类
  • 通过工厂类DruidSourceFactory获取数据库连接池对象.createDataSource(pro)
  • 获取连接getConnection()
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.util.Properties;
/**
* Druid演示
*/
public class DruidDemo {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties pro=new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn=ds.getConnection();
System.out.println(conn);
}
}

2、封装工具类

  • JDBCUtils
  • 静态代码块加载配置文件并初始化连接池对象
  • 提供方法:
    • 获取连接
    • 释放资源
    • 获取连接池
package cn.itcast.datasource.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* Druid连接池的工具类
*/
public class JDBCUtils {
//1.定义一个成员变量 DataSource
private static DataSource ds;
static{ try {
//1.加载配置文件
Properties pro=new Properties();
pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//2.获取DataSource
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
/**
* 释放资源
*/
public static void close(Statement stmt,Connection conn){
//简化书写
close(null,stmt,conn);
} //方法重载
public static void close(ResultSet rs,Statement stmt, Connection conn){
if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn!=null){
try {
conn.close();//归还连接
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 获取连接池方法
*/
public static DataSource getDataSource(){
return ds;
}
}
  • 使用工具类进行测试
package cn.itcast.datasource.druid;

import cn.itcast.datasource.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException; /**
* 使用新的工具类
*/
public class DruidDemo2 {
public static void main(String[] args) {
/**
* 完成添加的操作,给account表添加一条记录
*/
Connection conn=null;
PreparedStatement pstmt=null;
try {
//1.获取连接
conn = JDBCUtils.getConnection();
//2.定义sql
String sql="insert into account values(null,?,?)";
//3.获取pstmt对象
pstmt = conn.prepareStatement(sql);
//4.给?赋值
pstmt.setString(1,"王五");
pstmt.setDouble(2,3000);
int count = pstmt.executeUpdate();
System.out.println(count); } catch (SQLException e) {
e.printStackTrace();
}finally {
//6.释放资源
JDBCUtils.close(pstmt,conn); }
}
}

四、JDBCTemplate

1、介绍

  • Spring提供的对JDBC的封装,简化对JDBC的开发

2、步骤

  • 导入jar包
  • 创建JDBCTemplate对象,传递数据源
    • 如:JDBCTemplate template =new JDBCTemplate(ds)
  • 调用方法完成CRUD操作
    • update(sql)
    • queryForMap():返回Map<String,Object>
    • queryForList():返回List<Map<记录>>
    • query(sql,RowMapper/BeanPropertyRowMapper):返回 JavaBean
    • queryForObject():返回对象查询结果,用于聚合函数
package cn.itcast.datasource.jdbctemplate;
import cn.itcast.datasource.utils.JDBCUtils;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* JDBCtemplate入门
*/
public class JdbcTemplateDemo1 {
public static void main(String[] args) {
//1.导入jar包
//2.创建JDBCTemplate对象
//ctrl+p查看参数
//jdbc资源的释放和申请操作由JDBCTemplate完成
JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource());
//3.调用方法
String sql="update account set balance =5000 where id=?";
int count = template.update(sql, 3);
System.out.println(count);
}
}

3、执行DML语句

package cn.itcast.jdbctemplate;
import cn.itcast.utils.JDBCUtils;
import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
public class JdbcTemplateDemo2 {
//Junit单元测试,可以让方法独立执行
//1.获取JDBCtemplate对象
private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource()); /**
* 修改1号数据的salary为10000
*/
@Test
public void test1(){
//2.定义sql
String sql="update emp set salary =10000 where id=1001";
//3.执行sql
int count = template.update(sql);
System.out.println(count);
}
/**
* 添加一条记录
*/
@Test
public void test2(){
String sql="insert into emp(id,ename,dept_id) values(?,?,?)";
int count = template.update(sql, 1015, "郭靖", 10);
System.out.println(count);
}
/**
* 删除刚才添加的记录
*/
@Test
public void test3(){
String sql="delete from emp where id=?";
int count = template.update(sql, 1015);
System.out.println(count);
}
}

4、执行DQL语句

 /**
* 查询所有id为1的记录,将其封装为map集合
*/
@Test
public void test4(){
String sql="select * from emp where id=?";
Map<String, Object> map = template.queryForMap(sql, 1001);
System.out.println(map);
//{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
}
/**
* 如果有多条记录
* 注意:此方法queryForMap结果集长度只能为1
*/
@Test
public void test5(){
String sql="select * from emp where id= ? or id= ?";
Map<String, Object> map = template.queryForMap(sql, 1001,1002);
System.out.println(map);
//{id=1001, ename=孙悟空, job_id=4, mgr=1004, joindate=2000-12-17, salary=10000.00, bonus=null, dept_id=20}
}
/**
* 查询所有记录,将其封装为list集合
*/
@Test
public void test6(){
String sql="select * from emp";
List<Map<String, Object>> list = template.queryForList(sql);
for (Map<String, Object> stringObjectMap : list) {
System.out.println(stringObjectMap);
}
}
/**
* 查询所有记录,将其封装为Emp对象的list集合
*/
@Test
public void test7(){
String sql="select * from emp";
List<Emp> list = template.query(sql, new RowMapper<Emp>() {
@Nullable
@Override
public Emp mapRow
(ResultSet rs, int i) throws SQLException {
Emp emp=new Emp();
int id = rs.getInt("id");
String ename = rs.getString("ename");
int job_id = rs.getInt("job_id");
int mgr = rs.getInt("mgr");
Date joindate = rs.getDate("joindate");
double salary = rs.getDouble("salary");
double bonus = rs.getDouble("bonus");
int dept_id = rs.getInt("dept_id");
emp.setId(id);
emp.setEname(ename);
emp.setJob_id(job_id);
emp.setMgr(mgr);
emp.setJoindate(joindate);
emp.setSalary(salary);
emp.setBonus(bonus);
emp.setDept_id(dept_id);
return emp;
}
});
for (Emp emp : list) {
System.out.println(emp);
}
}
/**
* 查询所有记录,将其封装为 Emp对象的list集合
* template已经提供了实现类
*/
@Test
public void test8(){
String sql="select * from emp";
List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));
//提示空值不能转换为double,则需要修改javabean为引用数据类型
for (Emp emp : list) {
System.out.println(emp);
}
}
/**
* 查询总的记录数(count')
*/@Test
public void test9(){
String sql="select count(id) from emp";
Long total = template.queryForObject(sql, Long.class);//用于执行聚合函数
System.out.println(total);
}
}

最新文章

  1. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(三)
  2. 触发器--mysql
  3. Javascript隐式转换
  4. Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- AIDL
  5. Reorder List
  6. svn搭建以及可能遇到的问题解决方案
  7. css基本知识
  8. 安装、设置与启动MySql5.1.30绿色版的方法
  9. NuGet学习笔记——初识NuGet及快速安装使用
  10. Ubuntu14.04 安装QQ(国际版)
  11. 中国省市位置描述JSON数据
  12. .NET 单点登录
  13. 【转】Build Your own Simplified AngularJS in 200 Lines of JavaScript
  14. Java Web(七) JSTL标签库
  15. 201521123085 《Java程序设计》第5周学习总结
  16. IntelliJ Idea 2017 注册码 免费激活方法
  17. git使用:本地项目推送到gitlab
  18. centos npm 安装后 command not found
  19. [Lua]table(二):删除与排序
  20. python之路之函数02

热门文章

  1. Nginx+lua+openresty精简系列
  2. Kubernetes 配置管理
  3. SpringBoot项目的CI配置 # 安全变量
  4. Prometheus高可用部署
  5. jumpserver 2222端口的使用
  6. Prometheus与服务发现
  7. P3834 【模板】可持久化线段树 2
  8. httpd常用配置之虚拟主机
  9. Filter 筛选器(一)之 ActionFilter-- IAsyncActionFilter 和 ActionFilterAttribute
  10. git记不住用户名跟密码,每次提交拉取都需要再次输入