JDBC概述和驱动下载

推荐:

数据库连接

ODBC

JDBC驱动程序

JDBC 是什么?

Java 数据库连接性 (JDBC) API 是 Java 编程语言与各种数据库(SQL 数据库和其他表格数据源,例如电子表格或平面文件)之间建立的独立于数据库的连接的行业标准。JDBC API 为基于 SQL 的数据库访问提供了调用级 API。

借助 JDBC 技术,您可以通过 Java 编程语言为需要访问企业数据的应用实现”编写一次,随处运行”的功能。借助支持 JDBC 技术的驱动程序,即使在异构环境中,您也可以连接所有企业数据。

请参阅 java.sql,了解 JDK 11 中的各种 JDBC 规格(4.3、4.2 和 4.2 等)概要

请参阅 jcp.org 上的完整 JDBC 规格

驱动程序下载

Oracle JDBC驱动程序

官方下载

请下载所需的 JDBC jar 和其他随附 jar,例如 orai18n.jar, oraclepki.jar, osdt_core.jar, osdt_cert.jar 从 Oracle 技术网 JDBC 下载页面中下载。

Maven仓库

https://mvnrepository.com/artifact/com.oracle.database.jdbc

Oracle安装目录

Oracle 11g 安装后可在下面目录中找到JDBC数据库驱动程序
D:\oracle\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar

Oracle JDBC 常见问题解答

image-20210720101657059

常见问题解答

Oracle JDBC 版本与 JDK 版本的关系如何?

MySQL JDBC驱动程序

Java MySQL 连接

官方下载

下载地址:https://www.mysql.com/products/connector/
下载的文件名,例:mysql-connector-java-5.1.46.zip
下载后解压文件,src目录下是源码

Maven仓库

https://mvnrepository.com/artifact/mysql/mysql-connector-java

PostgreSQL JDBC驱动程序下载

官方下载

https://jdbc.postgresql.org/

Maven仓库

https://mvnrepository.com/artifact/org.postgresql/postgresql

基本组件

API概述-维基百科

DriverManager

负责管理驱动程序,使用已注册的驱动程序进行连接

DataSource

  • DriverManager的getConnection方法直接建立了与数据库的连接,资源开销较大
  • 连接池:DataSource通过一层简单的封装,将DriverManager建立的Connection通过Pool管理起来
  • 替代DriverManager,以JNDI(Java Naming Directory Interface)的形式对外提供

DataSource有三种类型的实现:

  • 基本实现——生成标准Connection,与DriverManager相同
  • 对象连接池实现——生成自动参与连接池的Connection 对象。此实现与中间层连接池管理器一起使用。
  • 分布式事务实现——生成一个Connection 对象,该对象可用于分布式事务,并且几乎始终参与连接池。此实现与中间层事务管理器一起使用,并且几乎始终与连接池管理器一起使用。

DataSource对象的属性在需要时可以修改。例如,如果将数据源移动到另一个服务器,则可更改与服务器相关的属性。其优点是,因为可以更改数据源的属性,所以任何访问该数据源的代码都无需更改。

Statement

  • 提供了执行语句和获取结果的基本方法
  • 每次执行都需要编译SQL
  • 无法防止SQL注入

3个执行SQL语句的方法:

  • executeQuery:产生单个ResultSet
  • execute:可执行任何SQL语句,可能会产生多个ResultSet和更新计数,较少使用。返回true:执行后第一个结果为ResultSet
  • executeUpdate:用于执行DML语句(insert, update, delete)和DDL语句(create table, drop table)

PreparedStatement

  • 预编译,缓存的预编译命令可以提高性能
  • 简单有效防止参数的SQL注入

CallableStatement:只用于存储过程

truncate 、delete 和 drop

truncate和drop是DDL语言,执行后自动提交,delete可以回滚

truncate和delete只删除数据,不删除表结构

ResultSet的fetchSize

一次数据库交互读取的记录数,fetchSize越大客户端内存消耗越大,性能越快

配置过大有OOM风险

JDBC资源关闭建议

  • 由于垃圾回收的线程级别是最低的,为了充分利用数据库资源,有必要显式关闭它们,尤其是使用Connection Pool的时候;
  • 最优经验是按照ResultSet,Statement,Connection的顺序执行close;
  • 为了避免由于java代码有问题导致内存泄露,需要在rs.close()和stmt.close()后面一定要加上rs = null和stmt = null;
  • 如果一定要传递ResultSet,应该使用RowSet,RowSet可以不依赖于Connection和Statement。
    Java传递的是引用,所以如果传递ResultSet,你会不知道Statement和Connection何时关闭,不知道ResultSet何时有效。

SQL注入

防止SQL注入的方式主要有以下三类:

  • 使用参数化查询:最有效的防护手段,对于sql语句中的表名、字段名、部分场景下的in条件不适用;
  • 对不可信数据进行白名单校验:适用于拼接sql语句中的表名、字段名;
  • 对不可信数据进行转码:适用于拼接到sql语句中的由引号限制的字段。

编程示例

Java数据库连接

JDBC 使用说明 - 菜鸟

mars-service-sys 服务。

Sharding-JDBC

https://shardingsphere.apache.org/document/4.1.1/cn/overview/

https://shardingsphere.apache.org/document/current/cn/overview/

Sharding-JDBC和Mycat在分库分表中的应用