Java数据库连接协议JDBC学习

什么是JDBC?

Java的官方文档是如下描述的

The JDBC API is the industry standard for database-independent connectivity between the Java programming language and a wide range of databases. The JDBC API provides a call-level API for SQL-based database access. JDBC technology allows you to use the Java programming language to exploit "Write Once, Run Anywhere" capabilities for applications that require access to enterprise data.

JDBC API是独立的数据库连接工业标准协议,这个数据库连接指的是Java编程语言和各种各样数据库的连接。JDBC API提供了通过SQL语言获取数据的一套可调用接口API。JDBC技术允许开发者在开发企业数据获取的应用中,使用JAVA语言来实现“一次写入,多地运行”的能力。

就我的理解而言,JDBC是Java用来实现各种各样数据库连接的一套标准化接口协议。JDBC API定义了如何获取/修改数据库中的数据。由于不同的数据库操作数据的底层协议不同,因此不同的数据库厂商会提供对应的数据库驱动,比如mysql有提供给Java的驱动mysql-connection-java-xxx.jar, oracle有提供给Java的驱动ojdbcxx.jar,sqlserver有提供给Java的驱动sqljdbcxx.jar等等。当然,这些数据库厂商也有提供给其他编程语言的数据库连接驱动,比如mysql提供给c++的驱动mysql-connector-c++-8.0.13-macos10.14-x86-64bit.dmg等等。而这些驱动会实现JDBC API,将其转化成对应数据库协议,从而实现了对数据的操作。

JDBC整体架构

JDBC API包含两个主要的接口集合: 第一个就是为应用写数据者提供的JDBC API, 第二个就是为驱动写数据提供的更底层的JDBC驱动API. 应用可以通过JDBC API获取数据,通过基于JAVA JDBC技术实现的驱动,如下图所示

左边这条线路表示驱动会把JDBC的接口调用转换成关系型数据库所使用的网络协议,允许一个来自客户端机器的数据调用直接传递给对应的关系型数据库服务器,同时提供内部网的解决方案。
右边这条线路则表示驱动会将JDBC的调用转换成中间件供应商的协议,中间件服务器再将中间件的协议转换成关系型数据库的协议。中间件提供了对很多数据库的连接。

JDBC API

1.Driver接口

在操作数据库中的数据之前,先要加载对应的数据库驱动,如加载mysql对应的数据库驱动示例代码如下:Class.forName("com.mysql.jdbc.Driver");

2.Connection接口

加载完驱动后,就要从驱动管理器获取一个数据库的连接,通过这个连接完成数据库的数据操作,示例代码如下:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

该接口常用的方法有

  •  createStatement():创建向数据库发送sql的statement对象。
  •  prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
  •  prepareCall(sql):创建执行存储过程的callableStatement对象。
  •  setAutoCommit(boolean autoCommit):设置事务是否自动提交。
  •  commit() :在链接上提交事务
  •  rollback() :在此链接上回滚事务
  •  close() : 关闭连接,释放资源

3. Statement接口

该接口主要用于SQL的执行,PreparedStatement和CallableStatement都继承该接口,这三种用于执行SQL语句的接口区别如下

  • Statement 主要用于简单数据的查询,不带参数
  • PreparedStatement用于带参数的查询,PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以一般的应用开发都是用此接口来实现SQL查询
  • CallableStatement 用于存储过程的查询

4. ResultSet接口

主要是SQL查询结果的封装,用来实现数据的查询的处理。

DataSource

javax.sql.DataSource接口是JDBC 2.0 API中新出现的接口,该接口提供了另一种获取数据源的方式。在实际的应用开发中更建议使用DataSource来获取连接,而不建议通过DriverManager来获取连接。这样应用程序的代码变得可移植和易于管理,不用在程序里硬编码数据库的连接地址。另外,DataSounce对象可以提供连接池和分布式事务,必要的企业级数据计算,而这些功能的具体实现对于应用开发者来说是透明的。

JNDI数据源

应用程序常常部署在服务器中,如Tomcat这样的Web容器。这些服务器允许开发人员配置通过JNDI来获取数据源,这样的好处是数据源完全在应用程序之外进行管理,应用程序只要专注于数据的操作就好了。其次,这些应用服务器通常是以数据池的形式管理数据源,从而具备更好的性能。如下图所示(来自https://blog.csdn.net/zhanglf02/article/details/76726702),Web服务器上保存着一个数据库的多个连接。一个数据源dataSource的配置对应一个数据池。每个配置的DataSource被绑定在了JNDI树上(每个dataSource的配置都有一个唯一名称与之对应)客户端通过名称找到在JNDI树上绑定的DataSource,再由DataSource找到一个连接。

è¿éåå¾çæè¿°

主要的开源的数据源连接池(https://blog.csdn.net/qq_25406669/article/details/80222376)

  • DBCP框架
  • C3P0框架
  • Druid框架

DBCP是由Apache开发的一个Java数据库连接池项目,Tomcat使用的连接池组件就是DBCP。预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。单线程,并发量低,性能不好,适用于小型系统。

C3P0是开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。单线程,性能较差,适用于小型系统。

Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上。

Spring配置数据源

  • 配置JNDI数据源
  • 配置连接池数据源
  • 自定义的数据源

JNDI数据源配置

位于jee命名空间下的元素可以用于检索JNDI中的任何元素,并将其作为Spring的bean。简要的配置示例如下:

或者如下配置

 
          
         java:comp/env/jdbc/roseindiaDB_local 
 

jndi-name就是上文中讲到的datasource配置文件中的names属性,如果应用程序部署在web应用服务器中,需要将resource-ref为true,这样jndi-name将会自动添加“java:comp/env/”前缀。

数据源连接池配置 

 
               
                     oracle.jdbc.driver.OracleDriver 
               
               
                     jdbc:oracle:xxxx 
               
               
                     test 
               
               
                     test 
               
               
                     255 
               
               
                     2 
               
               
                     120000 
               
  

Spring实现的基于JDBC驱动的数据源

  • DriverManagerDataSource: 每个连接请求时返回一个新建的连接
  • SimpleDriverDataSource: 跟DriverManagerDataSource工作方式类似,但是它直接使用JDBC驱动来解决特定环境的类加载问题
  • SingleConnectionDataSource: 每个连接请求的时候返回同一个连接,并不是严格意义上的连接池

你可能感兴趣的:(数据库)