目录

jdbc和jdbc驱动

JDBC简介

JDBC(Java Data Base Connectivity, Java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系型数据库提供统一的访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一套基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

JDBC原理

JDBC只是一套规范接口,由各个数据库厂家实现下面的各种数据库驱动。

http://img.cana.space/picStore/20201122122913.png

注意,我们这里说的数据库驱动指的是数据库协议驱动。该驱动通过 Socket 连接与厂商的数据库进行通信,这是可用于数据库的最高性能的驱动程序,通常由厂商自身提供。

JDBC驱动

什么是JDBC驱动

说白了 JDBC 驱动就是一组实现了 JDBC API 接口的 Java 类的集合,该接口用于与数据库服务器进行交互。例如,使用 JDBC 驱动程序可以让你打开数据库连接,并通过发送 SQL 或数据库命令,然后通过 Java 接收结果。

JDK 中的 java.sql 包中定义了各种数据库操作相关的接口,这些接口的实现类交由第三方驱动程序中完成。第三方供应商在他们的数据库驱动程序中都实现了 java.sql.Driver 接口。

四种JDBC驱动类型

以下四种类型的定义摘自

  • Type 1 : JDBC-ODBC bridge
  • Type 2 : Native-API driver
  • Type 3 : Network-Protocol driver (Middleware driver)
  • Type 4 : Database-Protocol driver (Pure Java driver) or thin driver

ODBC

开放数据库连接(Open Database Connectivity,ODBC)是为解决异构数据库间的数据共享而产生的,现已成为WOSA(The Windows Open System Architecture(Windows开放系统体系结构))的主要部分和基于Windows环境的一种数据库访问接口标准。ODBC 为异构数据库访问提供统一接口,允许应用程序以SQL 为数据存取标准,存取不同DBMS管理的数据;使应用程序直接操纵DB中的数据,免除随DB的改变而改变。用ODBC 可以访问各类计算机上的DB文件,甚至访问如Excel 表和ASCI I数据文件这类非数据库对象。

类型1.JDBC-ODBC桥

在类型1中,一个 JDBC 桥接器是用来访问安装在每个客户机上的 ODBC 驱动程序。为了使用 ODBC,需要在目标数据库上配置系统数据源名称(DSN)。这种类型的驱动把所有 JDBC 的调用传递给ODBC,再让后者调用数据库的本地驱动代码。在 Java 刚出来的时候,这是一种很有用的方式,因为那时大多数的数据库只支持 ODBC 访问,但现在此类型的驱动程序仅适用于实验用途或在没有其他选择的情况。

http://img.cana.space/picStore/20201122123900.png

  1. 优点:

    易于使用。

    只要有对应的 ODBC 驱动(大多数数据库厂商都会提供),所以几乎可以访问所有的数据库。

  2. 缺点:

    执行效率比较低,不适合大数据量访问的应用。

    需要客户端预装对应的 ODBC 驱动。

类型2.本地API驱动

在类型2中,JDBC API 调用转换成原生的 C/C++ API 的本地调用,这对于数据库来说具有唯一性。这些驱动程序通常由数据库供应商提供,并和 JDBC-ODBC 桥驱动程序的使用方式一样。该供应商的驱动程序同样必须安装在每台客户机上。

http://img.cana.space/picStore/20201122124024.png

  1. 优点:

    速度快于Type 1(但比不上Type 3、Type 4)。

  2. 缺点:

    需要客户端预装对应的数据库厂商代码库。

    预装的代码库不是通用的,每家厂商各自独立,所以也依赖于数据库厂商。

类型3.网络协议驱动

在类型3中,JDBC 先把对数据库的访问请求传递给中间件服务器。中间件服务器再把请求翻译为符合数据库规范的调用,再把这种调用传给数据库服务器。如果中间件服务器也是用 java 开发的,那么在在中间层也可以使用Type 1、Type 2 这两种 JDBC 驱动方式访问数据库。

http://img.cana.space/picStore/20201122124118.png

优点:

  • 不需要在客户端加载数据库厂商提供的代码库。
  • 单个驱动程序可以对多个数据库进行访问,可扩展性较好。
  • 支持数据库连接、查询结果的缓存,负载均衡,日志,监控等。

缺点:

  • 在中间件层仍需对最终数据进行配置。
  • 由于多出一个中间件层,速度不如 Type 4。

类型4.数据库协议驱动

类型4是纯粹的基于 Java 的驱动程序,通过 Socket 连接与厂商的数据库进行通信。这是可用于数据库的最高性能的驱动程序,并且通常由厂商自身提供。

http://img.cana.space/picStore/20201122124242.png

这种驱动器是非常灵活的,你不需要在客户端或服务端上安装特殊的软件。此外,这些驱动程序是可以动态下载的。

MySQL Connector/J 的驱动程序是一个 Type 4。因为它们的网络协议的专有属性,数据库供应商通常提供 Type 4的驱动程序。

优点:

  • 平台独立的。

  • 相比于前三种方式不需要中间的媒介。

  • 应用程序直接同数据库服务器通信。

  • 访问速度最快。 这是最直接、最纯粹的 Java 实现。

缺点:

  • 几乎只有数据库厂商自己才能提供这种类型的JDBC驱动。
  • 需要针对不同的数据库使用不同的驱动程序。

如何选择驱动类型

如果你正在访问一个数据库,如 Oracle,Sybase 或 IBM,首选的驱动程序是类型4。

如果你的 Java 应用程序同时访问多个数据库类型,首选的是类型3。

类型2是在你的数据库没有提供类型3或类型4驱动程序时使用的。

类型1被认为不适合在生产种使用,它存在的目的通常仅用于开发和测试。

JDBC使用步骤

加载驱动,建立连接,执行sql,获取结果,释放资源

SQL注入攻击

通过在sql语句中使用sql关键字改变sql语句的语义,从而执行一些特殊的操作,这样的攻击方式叫做sql注入攻击。

JDBC是如何解决这个问题的呢?还要从我们的第三步获取Statement说起。PreparedStatement利用预编译的机制将sql语句的主干和参数分别传输给数据库服务器,从而使数据库分辨的出哪些是sql语句的主干哪些是参数,这样一来即使参数中带了sql的关键字,数据库服务器也仅仅将他当作参数值使用,从而从原理上防止了sql注入的问题。

一句话来总结就是把主干和参数分别传输。

其实不仅仅有PreparedStatement,还有一个Statment类也能执行sql语句,功能类似。但是稍微有一点区别,PreparedStatement 与Statment比较:

  • 语法不同:PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql
  • 效率不同: PreparedStatement可以使用sql缓存区,效率比Statment高
  • 安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。