Java数据库连接
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。JDBC是面向关系型数据库的。在J2SE中,提供了一个称之为JDBC-ODBC桥(JDBC-ODBC Bridge)的API。通过ODBC,JDBC-ODBC桥驱动程序可以访问所有支持ODBC的关系型数据库。与JDBC API不同的是,这个驱动程序并不是由Java代码而是由机器代码(native code)编写,并且不是开放源代码的。
JDBC API主要位于JDK中的java.sql包中(之后扩展的内容位于javax.sql包中),主要包括(斜体代表接口,需驱动程序提供者来具体实现):
DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)。
Connection:数据库连接,负责进行与数据库间的通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。
Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。
PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。
CallableStatement:用以调用数据库中的存储过程。
SQLException:代表在数据库连接的创建和关闭和SQL语句的执行过程中发生了例外情况(即错误)。
JDBC驱动程序共分四种类型:
类型1:JDBC-ODBC桥
这种类型的驱动把所有JDBC的调用传递给ODBC,再让后者调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll)。
优点:只要有对应的ODBC驱动(大部分数据库厂商都会提供),几乎可以访问所有的数据库。
缺点:
执行效率比较低,不适合大数据量访问的应用;
由于需要客户端预装对应的ODBC驱动,不适合Internet/Intranet应用。
类型2:本地API驱动
这种类型的驱动通过客户端加载数据库厂商提供的本地代码库(C/C++等)来访问数据库,而在驱动程序中则包含了Java代码。
优点:速度快于第一类驱动(但仍比不上第3、第4类驱动)。
缺点:由于需要客户端预装对应的数据库厂商代码库,仍不适合Internet/Intranet应用。
类型3:网络协议驱动
这种类型的驱动给客户端提供了一个网络API,客户端上的JDBC驱动程序使用套接字(Socket)来调用服务器上的中间件程序,后者在将其请求转化为所需的具体API调用。
优点:不需要在客户端加载数据库厂商提供的代码库,单个驱动程序可以对多个数据库进行访问,可扩展性较好。
缺点:
在中间件层仍需对最终数据进行配置;
由于多出一个中间件层,速度不如第四类驱动程序。
类型4:本地协议驱动
这种类型的驱动使用Socket,直接在客户端和数据库间通信。
优点:
访问速度最快;
这是最直接、最纯粹的Java实现。
缺点:
几乎只有数据库厂商自己才能提供这种类型的JDBC驱动。
需要针对不同的数据库使用不同的驱动程序。
从SQL到Java数据类型映射的JDBC规范
| SQL类型 | Java类型 |
|---|---|
| CHAR | java.lang.String |
| VARCHAR | java.lang.String |
| LONGVARCHAR | java.lang.String |
| NUMERIC | java.math.BigDecimal |
| DECIMAL | java.math.BigDecimal |
| BIT | boolean |
| TINYINT | byte |
| SMALLINT | short |
| INTEGER | int |
| BIGINT | long |
| REAL | float |
| FLOAT | double |
| DOUBLE | double |
| BINARY | byte[] |
| VARBINARY | byte[] |
| LONGVARBINARY | byte[] |
| DATE | java.sql.Date |
| TIME | java.sql.Time |
| TIMESTAMP | java.sql.Timestamp |
| BLOB | java.sql.Blob |
| CLOB | java.sql.Clob |
| Array | java.sql.Array |
| REF | java.sql.Ref |
| Struct | java.sql.Struct |
注:这种类型匹配不是强制性标准,特定的JDBC厂商可能会改变这种类型匹配。例如Oracle中的DATE类型是包含时分秒,而java.sql.Date仅仅支持年月日。
参考来源:
Java数据库连接
JDBC For PostgreSQL
PostgreSQL JDBC 42.2.6 发布,支持 PostgreSQL 11 和 12
更新内容如下:
新增
使用 Java 11 和 Java EA 进行 CI 测试
支持 ReplicationCreateSlotBuilder 中的临时复制槽
支持 PostgreSQL 11、12
PgDatabaseMetaData#getFunctionColumns 中的返回函数(PostgreSQL 11)列
返回有关创建复制槽的信息,现在导出 snapshot_name 以在某些用例中允许一致的快照
修复
修复了 SSL 模式下的异步复制性能(每个操作 1ms)
为 'NaN'::numeric 返回 Double.NaN
PgDatabaseMetaData 中的性能问题
PGCopyInputStream#read 应该将值限制为 [0, 255], -1
修复了 BC 日期的 LocalDateTime 处理
在自动保存模式下释放保存点,以防止在服务器端出现共享内存错误
修复简单查询模式下大的十进制执行
修复了 1970 年之前的日期的时间戳的舍入
完整的更改列表