您的位置:首页 > 编程语言 > Java开发

Java JDBC | 四种连接数据库的方法

2016-04-27 19:55 633 查看
四种连接数据库的方法(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);
// 放在这里。防止所有用户都用一个Connection
Class.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 {
adfc
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) { }
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 jdbc c3p0