一、JDBC概述
1.1数据的持久化
- 持久化(persistence):将内存中的数据保存到可永久保存的存储设备中(如磁盘)。
- 持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
1.2什么是JDBC
- JDBC(Java DataBase Connectivity)java 数据库连接
- 是 JavaEE 平台下的技术规范
- 定义了在 Java 语言中连接数据库,执行 SQL 语句的标准 API
- 可以为多种关系数据库提供统一访问
1.3什么是数据库驱动程序
- 数据库驱动就是直接操作数据库的一个程序(将Java语言翻译成SQL语言操作数据库)
- 不同数据产品的数据库驱动名字有差异
- 在程序中需要依赖数据库驱动来完成对数据库的操作
1.4Java中访问数据库技术
- 基于JDBC标准访问数据库
- 使用第三方ORM 框架,如Hibernate, Mybatis 等访问数据库
1.5程序操作数据库流程
如果没有JDBC,那么Java程序访问数据库时是这样的:
有了JDBC,Java程序访问数据库时是这样的:
二、JBDC中常用的类与接口
2.1Driver接口
Driver 接口的作用是来定义数据库驱动对象应该具备的一些能力。比如与数据库建立连接的方法的定义(将Java翻译成SQL),该接口是提供给数据库厂商使用的,所有支持 java 语言连接的数据库都实现了该接口,实现该接口的类我们称之为数据库驱动类。
2.2DriverManager类
DriverManager是驱动程序管理器,是负责管理数据库驱动程序的。驱动注册以后,会保存在DriverManager中的已注册列表中。 DriverManager 通过实例化的数据库驱动对象,能够建立应用程序与数据库之间建立连 接。并返回 Connection 接口类型的数据库连接对象。
- getConnection(String jdbcUrl, String user, String password)
该方法通过访问数据库的 url、用户以及密码,返回对应的数据库的 Connection 对象。 - JDBC URL
与数据库连接时,用来连接到指定数据库标识符。在 URL 中包括了该数据库的类型、 地址、端口、库名称等信息。不同品牌数据库的连接 URL 不同。 - 连接 MySql 数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
- 连接 Oracle 数据库:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");
2.3Connection接口
Connection 是数据库的连接(会话)对象。对数据库的一切操作都是在这个连接基础之上进行的,我们可以通过该对象执行 sql 语句并返回结果。
常用方法
- createStatement()
创建向数据库发送 sql 的 Statement 接口类型的对象。 - preparedStatement(sql)
创建向数据库发送预编译 sql 的 PrepareSatement 接口类型的对象。 - setAutoCommit(boolean autoCommit)
设置事务是否自动提交。 - commit()
在链接上提交事务。 - rollback()
在此链接上回滚事务。
2.4Statement接口
用于执行静态 SQL 语句并返回它所生成结果的对象。 由 createStatement 创建,用于发送简单的 SQL 语句(不支持动态绑定)。
2.4.1常用方法
- execute(String sql)
执行参数中的 SQL,返回是否有结果集。 - executeQuery(String sql)
运行 select 语句,返回 ResultSet 结果集。 - executeUpdate(String sql)
运行 insert/update/delete 操作,返回更新的行数。 - addBatch(String sql)
把多条 sql 语句放到一个批处理中。 - executeBatch()
向数据库发送一批 sql 语句执行。
注意:
由于Statement对象是一个执行静态SQL语句的对象,所以该对象存在SQL注入风险。
2.4.2JDBC中三种Statement对象
- Statement:用于执行静态 SQL 语句。
- PreparedStatement:用于执行预编译SQL语句。
- CallableStatement:用于执行数据库存储过程。
2.5PreparedStatement接口
继承自 Statement 接口,由 preparedStatement 创建,用于发送含有一个或多个参数的 SQL 语句。PreparedStatement 对象比 Statement 对象的效率更高,由于实现了动态的参数绑定,所以可以防止 SQL 注入,所以我们一般都使用 PreparedStatement。
常用方法
- addBatch()
把当前 sql 语句加入到一个批处理中。 - execute()
执行当前 SQL,返回个 boolean 值 - executeUpdate()
运行 insert/update/delete 操作,返回更新的行数。 - executeQuery()
执行当前的查询,返回一个结果集对象 - setDate(int parameterIndex, Date x)
向当前SQL语句中的指定位置绑定一个java.sql.Date值 - setDouble(int parameterIndex, double x)
向当前 SQL 语句中的指定位置绑定一个 double值 - setFloat(int parameterIndex, float x)
向当前 SQL 语句中的指定位置绑定一个 float 值 - setInt(int parameterIndex, int x)
向当前 SQL 语句中的指定位置绑定一个 int 值 - setString(int parameterIndex, String x)
向当前 SQL 语句中的指定位置绑定一个 String 值
PreparedStatement对象的特点:
- PreparedStatement 接口继承 Statement 接口
- PreparedStatement 效率高于 Statement
- PreparedStatement 支持动态绑定参数
- PreparedStatement 具备 SQL 语句预编译能力
- 使用 PreparedStatement 可防止出现 SQL 注入问题
PreparedStatement 的预编译能力
语句的执行步骤
- 语法和语义解析
- 优化 sql 语句,制定执行计划
- 执行并返回结果
但是很多情况,我们的一条 sql 语句可能会反复执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。 如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行 了。所谓预编译语句就是将这类语句中的值用占位符替代,可以视为将 sql 语句模板化或者说参数化预编译语句的优势在于:一次编译、多次运行(将编译好的sql放在缓存中,但是只有在不同connection之间的缓存不会共享),省去了解析优化等过程;此外预编译语 句能防止 sql 注入
2.6ResultSet接口
ResultSet 用来暂时存放数据库查询操作获得结果集(实际上查询到的是指向查询到的结果集的指针)。
常用方法
- getString(int index)、getString(String columnName)
获得在数据库里是 varchar、char 等类型的数据对象。 - getFloat(int index)、getFloat(String columnName)
获得在数据库里是 Float 类型的数据对象。 - getDate(int index)、getDate(String columnName)
获得在数据库里是 Date 类型的数据。 - getBoolean(int index)、getBoolean(String columnName)
获得在数据库里是 Boolean 类型的数据。 - getObject(int index)、getObject(String columnName)
获取在数据库里任意类型的数据。