1. 引言

在一个JDBC应用程序中,如果想建立和数据源的连接,那么可以使用以下两个类:

  1. DriverManager:通过数据源的URL,我们可以建立与指定的数据源的连接。如果使用 JDBC 4.0 之后的版本,那么在首次尝试建立连接的时候会自动加载驱动程序,否则必须手动加载驱动。
  2. DataSource:这其实是一个接口,需要驱动程序自行提供实现类,比DriverManager要好很多,因为我们可以更加清楚底层数据源的信息。通过设置 DataSource 的属性可以让其表示指定的数据源,但是不同厂商的驱动程序对该接口的实现存在一定差异,因此具体的设置方法各有所不同。

2. 示例

声明:本文使用SQL Server 2008的数据库

2.1 使用DriverManager类

Java Code

public class DriverManagerDemo {
public static void main(String[] args){
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=Aming";
String username = "sa";
String password = "root";
try{
//Class.forName(driverName); 在JDBC4.0之后,该行可以省略
Connection conn = DriverManager.getConnection(url,username,password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID,NAME,PASSWORD FROM USERS");
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
System.out.println("id :" + id + ";name : " + name + ";password : " + pwd);
}
conn.close();
}catch (Exception e){
e.printStackTrace();
}
}
}

结果:

说明:

  1. 使用DriverManager至少需要提供驱动实现类,数据库的url,数据库的登录名以及密码。
  2. 虽然Class.forName(driverName)可以省略,但是推荐还是加上去,以加强兼容性。

2.2 使用DataSource接口

public class DataSourceDemo {

    public static void main(String[] args) {
String databaseName = "Aming";
int portNumber = 1433;
String username = "sa";
String password = "root";
DataSource dataSource = null;
try{
dataSource = getDataSource(databaseName,portNumber,username,password);
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID,NAME,PASSWORD FROM USERS");
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
System.out.println("id :" + id + ";name : " + name + ";password : " + pwd);
}
conn.close();
}catch (Exception e){
e.printStackTrace();
}
} public static DataSource getDataSource(String databaseName,int portNumber,String username,String password){
SQLServerDataSource dataSource = new SQLServerDataSource();
dataSource.setDatabaseName(databaseName);
dataSource.setPortNumber(portNumber);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}

结果:

说明:

  1. microsoft在sqljdbc4中提供了com.microsoft.sqlserver.jdbc.SQLServerDataSource和com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource两个javax.sql.DataSource接口的实现,本文使用前者。
  2. 不同于DriverManager,SQLServerDataSource需要提供数据库名 databaseName,端口号 portNumber,数据库登录名 user,数据库密码 password。

2.3 使用C3P0框架

public class C3P0Demo {
public static void main(String[] args) {
String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=Aming";
String username = "sa";
String password = "root";
DataSource dataSource = null;
try{
dataSource = getDataSource(driverName,url,username,password);
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID,NAME,PASSWORD FROM USERS");
while(rs.next()){
int id = rs.getInt(1);
String name = rs.getString(2);
String pwd = rs.getString(3);
System.out.println("id :" + id + ";name : " + name + ";password : " + pwd);
}
conn.close();
}catch (Exception e){
e.printStackTrace();
}
} public static DataSource getDataSource(String driverName,String url,String username,String password) throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driverName);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}
}

结果:

说明:

  1. C3P0提供了com.mchange.v2.c3p0.ComboPooledDataSource类作为javax.sql.DataSource接口的实现。
  2. ComboPooledDataSource所需要的参数与DriverManager想类似。

总结

目前 oracle 官方更加推荐使用 DataSource 接口,理由如下:

  1. DataSource 具有更好的可移植性和维护性:不同于 DriverManage r需要硬编码,通过 JNDI ,DataSource 接口的实现可以通过配置来完成。
  2. DataSource 可以为分布式事务和数据库连接池提供更好的支持。

JDBC学习笔记之建立连接的更多相关文章

  1. JDBC学习笔记——简单的连接池

    1.使用LinkedList保存连接                                                               即使是最简单的JDBC操作,也需要包含 ...

  2. JDBC学习笔记(1)

    说明:本系列学习笔记主要是学习传智播客的李勇老师的教学课程和一本英文电子书<JDBC Recipes A Problem-Solution Approach>所作的笔记. 1,什么是JDB ...

  3. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  4. SQL反模式学习笔记4 建立主键规范【需要ID】

    目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...

  5. JDBC学习笔记一

    JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...

  6. CNN学习笔记:全连接层

    CNN学习笔记:全连接层 全连接层 全连接层在整个网络卷积神经网络中起到“分类器”的作用.如果说卷积层.池化层和激活函数等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的特征表示映射到样 ...

  7. JDBC 学习笔记(十一)—— JDBC 的事务支持

    1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...

  8. JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架

    1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...

  9. JDBC 学习笔记(六)—— PreparedStatement

    1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...

随机推荐

  1. Docker两种方式进入后台运行的容器

    1.在启动容器的时候,有时候我们加了参数-d,这时容器自动进入后台运行.如果我们要进入容器,该怎么办?通常使用docker attach命令和nsenter工具. 2.docker attach是Do ...

  2. 【PyTorch深度学习60分钟快速入门 】Part3:神经网络

      神经网络可以通过使用torch.nn包来构建. 既然你已经了解了autograd,而nn依赖于autograd来定义模型并对其求微分.一个nn.Module包含多个网络层,以及一个返回输出的方法f ...

  3. 3张表实现RBAC

    管理员表 CREATE TABLE cqh_admin ( id smallint unsigned not null auto_increment comment 'id', username va ...

  4. pip解决超时问题(timeout)

    我们下载python的库一般会使用pip工具.但在下载的过程中经常会timeout,这是因为资源在国外,我们国内某些资源下载速度特别慢,主要有两种方法解决. 一.设置pip timeout超时时间 创 ...

  5. c++中虚函数和多态性

    1.直接看下列代码: #include <iostream> using namespace std; class base{ public: void who(){ cout<&l ...

  6. SPI 驱动框架

    SPI 驱动框架 1. 枚举过程 drivers/spi/spi.c: spi_register_board_info /* 对于每一个spi_master,调用spi_match_master_to ...

  7. C#基础知识汇总(不断更新中)

    ------------------------------目录---------------------------- 1.隐式类型2.匿名类型3.自动属性4.初始化器5.委托6.泛型7.泛型委托8 ...

  8. using的几种用法

    1.using指令.using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间 例如:using System; 一般都会出现在*.cs中.   2.using ...

  9. spark基本概念及入门

    spark spark背景 什么是spark Spark是一种快速.通用.可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目 ...

  10. Apollo源码阅读笔记(一)

    Apollo源码阅读笔记(一) 先来一张官方客户端设计图,方便我们了解客户端的整体思路. 我们在使用Apollo的时候,需要标记@EnableApolloConfig来告诉程序开启apollo配置,所 ...