四种连接数据库的方法(DriverManager、DataSource子类、DBCP、c3p0)

〇、连接步骤

//第一步,注册驱动程序
//com.MySQL.jdbc.Driver
Class.forName("数据库驱动的完整类名");//第二步,获取一个数据库的连接
Connection conn = DriverManager.getConnection("连接URL","用户名","密码");//第三步,创建一个会话
Statement stmt=conn.createStatement();//第四步,执行SQL语句,增加,删除,修改记录
stmt.executeUpdate("增加,删除,修改记录的SQL语句");//或者查询记录
ResultSet rs = stmt.executeQuery("查询记录的SQL语句");//第五步,对查询的结果进行处理
while(rs.next()){
//对记录的操作
}//第六步,关闭连接
rs.close();
stmt.close();
conn.close();

一、环境 
  1、数据库驱动jar文件

2、DBCP方法 
        Commons-dbcp.jar:连接池的实现 Commons-pool.jar:连接池实现的依赖库 资源文件 
  3、c3p0方法: c3p0-0.9.1.2.jar 
        配置文件:c3p0-config.xml

二、连接操作

1、DriverManager方法

package demo.jdbcpool.test1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {private static String driverClass = "com.mysql.jdbc.Driver";private static String url = "jdbc:mysql://localhost:3306/test";private static String username = "root";private static String password = "123456";private static Connection conn = null;static {try {// 注册驱动// 不要把conn = DriverManager.getConnection(url, username, password);// 放在这里。防止所有用户都用一个ConnectionClass.forName(driverClass);} catch (Exception e) {throw new RuntimeException(e);}}public static Connection getConnection() throws SQLException {conn = DriverManager.getConnection(url, username, password);return conn;}
}

2、使用DataSource子类方法;

资源文件 DBConnection.properties

driverClass = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test
username = root
password = 123456

模拟数据连接池

DataSourcePool.java
package cn.langzi.jdbc.DataSource;
import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Properties;
import javax.sql.DataSource;
import javax.sql.DataSource; public class DataSourcePool implements DataSource { private static String url = null;         private static String username = null;        private static String password = null;     private static int size = 10;     private static LinkedList<Connection> list = new LinkedList<Connection>();
static{try {                 InputStream in = DataSourcePool.class.getClassLoader()                       .getResourceAsStream       ("cn/langzi/jdbc/DataSource/DBConnection.properties");              Properties prop = new Properties();                   prop.load(in);                Class.forName(prop.getProperty("driverClass"));                 url = prop.getProperty("url");                 username = prop.getProperty("username");                 password = prop.getProperty("password");                } catch (Exception e) {                    throw new ExceptionInInitializerError(e);                  }         }         private static DataSourcePool pool = new DataSourcePool();            //创建对象就初始化size个数据库连接        private DataSourcePool(){             for(int i=0;i<size;i++){try {                   Connection conn = DriverManager.getConnection(url, username, password);                   System.out.println(conn);                         list.add(conn);                   } catch (SQLException e) {                              e.printStackTrace();}
}

DataSource有两种实现方式

1.直连数据库方式 
当调用DataSource.getConnection()时,其实它调用的是DriverManager.getConnection(url, user, password)来获取一个Connection,Connection使用完后被close,断开与数据库的连接,我们称这总方式是直连数据库,因为每次都需要重新建立与数据库之间的连接,而并没有把之前的Connection保留供下次使用.

2.池化连接方式 
可以说这种方式就是使用了连接池技术.DataSource内部封装了一个连接池,当你获取DataSource的时候,它已经敲敲的与数据库建立了多个Connection,并将这些Connection放入了连接池,此时调用DataSource.getConnection()它从连接池里取一个Connection返回,Connection使用完后被close,但这个close并不是真正的与数据库断开连接,而是告诉连接池"我"已经被使用完,"你"可以把我分配给其它"人"使用了.就这样连接池里的Connection被循环利用,避免了每次获取Connection时重新去连接数据库.
对DataSource的两种实现方式已经介绍完毕,现在知道DataSource与连接池之间的是关系而不是区别了吧,因为DataSource与连接池根本就不是同一类型的东西,只有同一类型的东西才存在区别,例如:oracle与db2都是数据库,它们才存在区别.我们这里仅仅实现了数据库的链接,并没有池化链接

3、使用C3P0

ComboPooledDataSource cpds = new ComboPooledDataSource();  // 加载数据库驱动
try {  cpds.setDriverClass("com.ibm.db2.jcc.DB2Driver");
} catch (PropertyVetoException e1) {  e1.printStackTrace();
}  // 设置访问数据库的地址、用户名和密码
cpds.setJdbcUrl("jdbc:db2://10.10.38.138:50000/malltest");
cpds.setUser("db2inst1");
cpds.setPassword("db2inst1");  // 设置C3P0的一些配置,不设置则使用默认值
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);
cpds.setMaxStatements(180);  Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {  // 创建数据库连接  conn = cpds.getConnection();  // 获取数据库操作对象  stmt = conn.createStatement();  // 操作数据库获取结果集  rs = stmt.executeQuery("select * from ly.t_merinf where merid='M0000178'");  // 处理结果集  while (rs.next()) {  System.out.println(rs.getString("mername"));  }
} catch (SQLException e) {  e.printStackTrace();
} finally {  // 关闭结果集  if(rs != null) {  try { rs.close(); } catch (SQLException e) { }  }  // 关闭数据库操作对象  if(stmt != null) {  try { stmt.close(); } catch (SQLException e) { }  }  // 关闭数据库连接  if(conn != null) {  try { conn.close(); } catch (SQLException e) { }  }  try {  DataSources.destroy(cpds);  } catch (SQLException e) {  e.printStackTrace();  }
}  

4、使用DBCP

配置文件:

driverClassName=com.ibm.db2.jcc.DB2Driver
url=jdbc:db2://10.10.38.138:50000/malltest
username=db2inst1
password=db2inst1
initialSize=3
maxActive=5
maxIdle=3
minIdle=1
maxWait=30000  

代码:

// 1.创建连接池
DataSource ds = null;
try {  Properties prop = new Properties();  // 通过类路径来加载属性文件  prop.load(DbcpTest.class.getClassLoader().getResourceAsStream("database/dbcp/dbcp.properties"));  // 获取数据源  ds = BasicDataSourceFactory.createDataSource(prop);
} catch (IOException e) {  e.printStackTrace();
} catch (Exception e) {  e.printStackTrace();
}  Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {  // 2.获取数据库连接  conn = ds.getConnection();  // 3.创建数据库操作对象  stmt = conn.createStatement();  // 4.操作数据库获取结果集  rs = stmt.executeQuery("select * from ly.t_merinf where merid='M0000178'");  // 5.处理结果集  while (rs.next()) {  System.out.println(rs.getString("mername"));  }
} catch (SQLException e) {  e.printStackTrace();
} finally {  // 关闭结果集  if(rs != null) {  try { rs.close(); } catch (SQLException e) { }  }  // 关闭数据库操作对象  if(stmt != null) {  try { stmt.close(); } catch (SQLException e) { }  }  // 关闭数据库连接  if(conn != null) {  try { conn.close(); } catch (SQLException e) { }  }
}  

Java JDBC | 四种连接数据库的方法相关推荐

  1. 四种连接数据库的方法(DriverManager、DataSource子类、DBCP、c3p0)

    四种连接数据库的方法(DriverManager.DataSource子类.DBCP.c3p0) 一.环境     1.数据库驱动jar文件 2.DBCP方法  Commons-dbcp.jar:连接 ...

  2. 你知道Java的四种引用类型吗?

    点击蓝字 关注我们 点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 01 概述 在Java中提供了四个级别的引用:强引用,软引用,弱引用和虚引用. ...

  3. java中四种常用的引用类型_java中四种引用类型

    JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak Reference).虚引用 ...

  4. java的四种引用类型_你知道Java的四种引用类型吗?

    以下文章来源于程序员柯南 ,作者薛勤 点击蓝字关注我们 点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大!01概述 在Java中提供了四个级别的引用: ...

  5. java中四种默认的权限修饰符,Java中四种访问权限资料整理

    一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...

  6. Java中四种访问权限总结

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.pro ...

  7. Java的四种引用方式

    Java的四种引用方式 java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括   强引用,软引用,弱引用,虚引用 Jav ...

  8. Java中四种XML解析技术之不完全测试

    Java中四种XML解析技术之不完全测试 <script language=javascript src=""></script> 在平时工作中,难免会遇到 ...

  9. mysqli操作数据库,连接和四种取值方法

    <?php header("Content-Type:text/html;charset=utf-8");//使用mysqli对象操作数据库//方法一://$_mysqli ...

最新文章

  1. Ubuntu恢复默认的字体
  2. ASP.NET程序中常用代码汇总(一)
  3. 解决matplotlib中文乱码问题
  4. quartz基本使用
  5. Android开发笔记(六十六)自定义对话框
  6. extjs4 grid 刷新数据时不改变滚动条位置
  7. 冯永昌:云计算与大数据时代的量化投资
  8. 经典:浅谈以太坊智能合约的设计模式与升级方法
  9. 以动词开头的习惯搭配:转
  10. 如何使用工具切换设备ip 电脑和手机怎么如何换ip?
  11. (CVPR-2020)Strip Pooling:重新思考场景解析的空间池化
  12. 详解 物理学四大神兽————拉普拉斯兽
  13. matlab分析地形,matlab绘制地形图
  14. Hdmi 和vga 接口有什么区别?
  15. (筆記) 如何在字串中從指定字元抓到指定字元(pointer版)? (C/C++) (C)
  16. 谷歌浏览器插件开发之 manifest.json 配置说明
  17. 再阿里云服务器卸载安骑士并且屏蔽云盾
  18. Qt QNetworkAccessManager 下载url
  19. 【论文泛读97】建立具有情感原因的在线移情聊天机器人
  20. 有关深度学习中的目标检测论文阅读

热门文章

  1. 在Android设备上安装kali的最佳方案与Linux下如何刷机
  2. 2018年出生率 京沪津普降 东北垫底
  3. 考研数学学习思维导图
  4. Python自学教程5-字符串有哪些常用操作
  5. logo自动旋转 html,CSS3创作有意思的旋转LOGO
  6. 遍历List移除元素的若干种方法
  7. [Leetcode] 304. Range Sum Query 2D - Immutable 解题报告
  8. ssm+JSP计算机毕业设计中医养生客户管理系统c3z16【源码、程序、数据库、部署】
  9. java 减 绝对值_Java中绝对值函数的介绍与其妙用
  10. vue单页面背景颜色设置