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 API包含两个主要的接口集合: 第一个就是为应用写数据者提供的JDBC API, 第二个就是为驱动写数据提供的更底层的JDBC驱动API. 应用可以通过JDBC API获取数据,通过基于JAVA JDBC技术实现的驱动,如下图所示
左边这条线路表示驱动会把JDBC的接口调用转换成关系型数据库所使用的网络协议,允许一个来自客户端机器的数据调用直接传递给对应的关系型数据库服务器,同时提供内部网的解决方案。
右边这条线路则表示驱动会将JDBC的调用转换成中间件供应商的协议,中间件服务器再将中间件的协议转换成关系型数据库的协议。中间件提供了对很多数据库的连接。
1.Driver接口
在操作数据库中的数据之前,先要加载对应的数据库驱动,如加载mysql对应的数据库驱动示例代码如下:Class.forName("com.mysql.jdbc.Driver");
2.Connection接口
加载完驱动后,就要从驱动管理器获取一个数据库的连接,通过这个连接完成数据库的数据操作,示例代码如下:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
该接口常用的方法有
3. Statement接口
该接口主要用于SQL的执行,PreparedStatement和CallableStatement都继承该接口,这三种用于执行SQL语句的接口区别如下
4. ResultSet接口
主要是SQL查询结果的封装,用来实现数据的查询的处理。
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是由Apache开发的一个Java数据库连接池项目,Tomcat使用的连接池组件就是DBCP。预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。单线程,并发量低,性能不好,适用于小型系统。
C3P0是开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。单线程,性能较差,适用于小型系统。
Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上。
JNDI数据源配置
位于jee命名空间下的
或者如下配置
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驱动的数据源