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. xmldocument内嵌入另一个xmldocument,xmlnode的方法

    string xmlstr1 = @"<root><head>myHead</head><body></body></roo ...

  2. python的Web框架,Django模型系统二,模型属性,及数据库进阶查询

    原始数据接上篇文章来操作.可能需要查看后才能懂.点击这里查看 1.常用的模型字段类型 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fie ...

  3. Extjs 项目中常用的小技巧,也许你用得着(2)

    接着来,也是刚刚遇到的 panel怎么进行收缩 collapsible: true, 这会panel就会出现这个 点这个就可以收缩了 panel怎么随便拉伸,也就是让那个小黑三角出现 split: t ...

  4. [PHP] 算法-有序数组旋转后寻找最小值的PHP实现

    把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组 ...

  5. [PHP] 算法-删除链表中重复的结点的PHP实现

    删除链表中重复的结点: 1.定义两个指针pre和current 2.两个指针同时往后移动,current指针如果与后一个结点值相同,就独自往前走直到没有相等的 3.pre指针next直接指向curre ...

  6. 【shell编程】2、语法

    Linux 下执行.sh文件总是提示permission denied 如果你是root登陆的话(不是的话,切换到root用户,对*.sh赋可执行的权限) chmod 777 *.sh   or    ...

  7. Docker 启动遇到 Error starting daemon: Error initializing network controller 错误

    docker 版本 1.10.3 一台装有 docker 的机器重启后,没法启动,/var/log/messages 展示如下错误信息: May 17 11:11:14 gziba-hc03 syst ...

  8. Installing Fonts programatically C#

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. nginx报错zero size shared memory zone one

    为了限速,在虚拟主机中加上了一个参数:limit_conn one 1:结果导致重启nginx报错: zero size shared memory zone "one"解决办法是 ...

  10. vue-cli脚手架之webpack.base.conf.js

    webpack相关的重要配置文件将在这一节给出.webpack水很深啊^o^,在此先弄清楚原配文件内容的含义,后续可以自己根据实际情况配置. webpack.base.conf.js:配置vue开发环 ...