江湖传言,JDBC建立连接常用两种方法,一为DriverManager,即驱动管理员,一为DataSource数据源。数据源先放一遍,单说说驱动管理员,他会依照特定的数据库URL连接应用程序与数据库。单看这个名字,也不像真正干活的。书上说,驱动管理员会在首次尝试建立连接时,自动加载在类路径中找的着的任意JDBC 4.0驱动。不过,这任意二字又如何理解?(it automatically loads any JDBC 4.0 drivers found within the class path.)既然理解不了,那就先忘了吧。我们看另一件事,管理员找驱动不会是来吃瓜的,我们有理由相信,驱动肯定是来干脏活的。
指南中还提到,方法DriverManager.getConnection 建立一个数据库连接,此方法要求一个数据库URL,返回一个Connection对象。也就是说你自己填一张路条给驱动管理员,要一条指定的连接,管理员依路条找来一个驱动,把路条交给驱动,驱动创建一个连接,这个连接最后会落在你手里。看起来挺合理的,只是Connection factory哪去了?
前面多次提到的数据库URL(Uniform Resource Locator),也就是你填的那张路条到底是什么?它是一个字符串,一个使用特定语法描述与建立连接相关信息的字符串。例如:到哪去找数据库?数据库叫啥名?配置了啥属性等?当然各家数据库所用的语法多少都有些差异,可以看作各种方言。
PostgreSQL讲的是哪种方言呢?
pg之URL可用以下几种样式之一:
- jdbc:postgresql:database
- jdbc:postgresql:/
- jdbc:postgresql://host/database
- jdbc:postgresql://host/
- jdbc:postgresql://host:port/database
- jdbc:postgresql://host:port/
To connect, you need to get a Connection instance from JDBC. To do this, you use the DriverManager.getConnection() method:
Connection db = DriverManager.getConnection(url, username, password);
为什么pg的手册看起来就这么顺眼呢?言归正传,关于URL除了样式,还有参数。在pg的世界中除了标准连接参数,驱动还支持若干专有参数。这些属性即可在连接URL中指定,也可在DriverManager.getConnection方法的Properties对象参数中指定。下面是个例子:
String url = "jdbc:postgresql://localhost/test";
Properties props = new Properties();
props.setProperty("user","fred");
props.setProperty("password","secret");
props.setProperty("ssl","true");
Connection conn = DriverManager.getConnection(url, props);
String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true";
Connection conn = DriverManager.getConnection(url);
发现了吗?getConnection是重载方法。