JDBC

第1章 JDBC 概述

1.1、接口作用总结:
A、 面向抽象编程,面向接口编程,尽量使用多态机制
B、 可以提高程序的扩展力,降低程序的耦合度
C、 让程序变得具有很强的可接插特性

1.2、JDBC 是什么

1.2.1 Java Data Base Connectivity, java 语言连接数据库系统;
1.2.2 JDBC 接口是一套 class 文件,谁制定?
(1) SUN 公司负责制定 JDBC 规范
1.2.3 JDBC 接口调用方是谁?
(1) java 程序员:连接数据库并且操作数据库
1.2.4 JDBC 接口的实现类谁写,实现方是谁?
(1) 各大数据库厂商的 java 程序员负责编写 SUN 公司制定的 JDBC 接口
的实现类
1.2.5 连接数据库驱动
(1) 各大数据库厂商编写的 JDBC 接口的实现类,编译之后将这些实现类
打成 jar 包并且发布,
(2) 所有连接数据库的 java 程序员需要从官网上下载这些 jar 再使用,
这些 jar 包通常被我们称为连接数据库的驱动;
(3) 那么我们 java 程序员要想连接 MySQL 数据库,需要先从官网下载
连接 MySQL 数据库的专用驱动 jar 包,并且需要将这些 jar 包配置到环境
变量 classpath 中
1.3画图描述 JDBC 原理

1.4什么是 API
1.4.1 定义: Application Programming Interface 应用程序编程接口,就是一
套类库;【这里的接口不是专指 java 中的 interface】
1.4.2 java 中的 API 包括三个元素:
(1) API 字节码
(2) API 源码
(3) API 帮助文档
以上三个元素的版本要保持一致;
A、 例如: JDK1.7 源码 —> JDK1.7 字节码 —> JDK1.7 帮助文档
1.5JDBC 在开发中的作用
1.5.1 在实际开发中,数据库的产品特别多的,例如: MySQL、 Oracle、 DB2、
Sybase、 SQLServer 等等
1.5.2 每一个数据库的底层实现原理都是不同的,那么我们 java 程序员去
连接数据库的时候,需要关心数据库底层具体是怎样实现的吗?我们需要
关心数据库的细节吗?
1.5.3 我们若要关心数据库的底层实现原理,那么 java 程序员就需要学习
多套连接数据库的程序。 MySQL 专门一套、 Oracle 专门一套等等,这是不
可能的
1.5.4 java 程序员连接数据库的时候,不需要关心底层数据库的实现原理,
应该给 java 程序员提供一套标准的接口
1.5.5 java 程序员应该面向 JDBC 接口去调用,完成数据库的操作。
1.5.6 也就是说我们 java 程序员不需要关心底层是什么数据库,只要编写
一套通用的 java 程序即可连接各种数据库。
 

第2章 JDBC 编程六步曲
2.1第一步:注册驱动[ed]
2.1.1 创建驱动对象:告知 JDBC 我们即将连接哪个数据库
2.1.2 通过 DriverManager.registerDriver(driver)注册驱动
2.2第二步:获取数据库连接 URL
2.2.1 通过 DriverManager.getConnection(url,user,pwd)获取连接
2.2.2 重点: Connection 连接对象不能随意创建,最后使用完要手动关闭
2.2.3 MySQL 数据库支持最多的连接数量为 100
2.3第三步:获取数据库操作对象
2.3.1 一个数据库连接对象可以创建多个数据库操作对象
2.3.2 通过 conn.createStatement();
2.4第四步:执行 SQL 语句之 DML 语句
2.4.1 通过数据库操作对象 stmt.executeUpdate(sql);编译执行 SQL
2.4.2 JDBC 编写 SQL 语句不需要以分号结尾
2.4.3 数据库管理系统会将编写好的 SQL 语句编译并执行
2.5第五步:处理查询结果集
2.5.1 通过字段下标获取数据
(1) 例如: rs.getString(下标)
2.5.2 通过结果集中字段名称获取数据
(1) 例如: rs.getString(“ename”)
(2) 该方式程序健壮,建议使用
2.5.3 通过特定类型获取数据
(1) 例如: rs.getInt(“empno”);
2.6第六步:释放资源
(1) 为了保障能够释放资源,将释放代码编写到 finally 语句中
(2) 需要关闭 ResultSet、 Statement、 Connection
(3) 一个 Connection 可以创建多个 Statement,一个 Statement 可以得
出多个 ResultSet, 所以先关闭 ResultSet 再关闭 Statement 最后关闭
Connection
(4) 分别进行 try catch 关闭资源
2.7注册驱动的另一种方式

2.7.1 第一种: 先获取驱动对象, 然后完成驱动注册
(1) 包含以下两个语句:
A、 Driver driver = new com.mysql.jdbc.Driver();
B、 DriverManager.registerDriver(driver);
2.7.2 第二种: 通过自定义一个 RegisterDriver 类,通过Class.forName(“com.jdbc.RegisterDriver”)
加载 RegisterDriver 类中静态代码块

(1) 静态代码块,包含以下语句:
A、 Driver driver = new com.mysql.jdbc.Driver();
B、 DriverManager.registerDriver(driver);
(2) 优点: Class.forName(“”)双引号中内容可以写到配置文件里
以上写法比较繁琐,但是数据库厂商已实现
2.7.3 数据库厂商已写 com.jdbc.mysql.Driver
在 com.jdbc.mysql.Driver 这个类里有一个 static 语句块
创建 Driver 对象时自动加载注册驱动语句

2.8连接数据库的信息可配置

2.8.1 prj-io 举例: IO 流读取配置文件
(1) 创建 db.properties 配置文件
(2) 通过 FileReader reader = new FileReader(“db.properties”);读取
配置文件
(3) 创建属性对象 Properties pro = new Properties();
(4) 通过属性对象 pro.load(reader)方法将配置信息读取到 Map 集合对
象中
(5) 关闭流 reader.close();
(6) 通过 pro.getProperty(“key”)获取 value

2.8.2 : 连接数据库信息编写到配置文件 db.properties 中

(1) 注册驱动:Class.forName(driver);
(2) 获取连接 DriverManager.getConnection(url,user,pwd);
(3) 获取数据操作对象 stmt = conn.createStatement();
(4) 执行 SQL 语句 stmt.executeUpdate(sql)
或 stmt.executeQuery(sql)
(5) 处理查询结果集
A、 rs.next()方法: 将光标从当前位置向前移一行
(6) 关闭资源
A、 立即释放此 ResultSet、 Statement、 Connection 对象的数据库和 JDBC 资源,而
不是等待该对象自动关闭时发生此操作

第3章 Statement 和 PreparedStatement
3.1SQL 注入
(1) 用户输入的信息中有 SQL 关键字并且参与的 SQL 语句的编译,导致
SQL 语句含义扭曲, 这种现象被为 SQL 注入
3.2防止 SQL 注入: PreparedStatement
3.2.1 使用: ps = conn.prepareStatement(sql);
(1) 先定义 SQL 语句构架,对 SQL 语句进行预先编译,只编译一次
(2) 然后再接收用户提供的信息,即使用户提供的信息中包含 SQL 关键字,这些关键字也不参
与编译,是不起作用的。
3.3Statement 和 PreparedStatement 对比
(1) 防止 SQL 注入,执行效率高
(2) SQL 语句对于 Statement 来说是:编译一次执行一次
(3) SQL 语句对于 PreparedStatement 是编译一次执行 N 次
**原因: DBMS 厂商实现 JDBC 接口, DBMS 将编译后的 SQL 语句保存在 DBMS 中,由于
DBMS 中有很多编译好的 SQL 语句,这时通过同一个 PreparedStatement 对象进行赋值,
便会找到其对应的 PreparedStatement 对象实现其赋值,即:一次编译多次执行
(4) PreparedStatement 是类型安全的,编译期检查传入参数类型

第4章 JDBC 事务
4.1JDBC 事务
(1) JDBC 默认情况下,事务是自动提交的:即在 JDBC 中执行一条 DML
语句就执行一条
(2) 将事务的自动提交修改为手动提交即可避免自动提交
(3) 在事务执行的过程中任何一步出现异常都要进行回滚
(4) JDBC 事务只有三行代码
A、 设置自动提交事务: conn.setAutoCommit(false);
B、 事务提交: conn.commit();
C、 事务回滚: conn.rollback();
4.2JDBC 行级锁又称为悲观锁
4.2.1 如:多线程访问同一张表中相同记录的时候,其它线程排队
(1) 解决方案有 3 种(java、数据库、 SQL 语句)
A、 java:使用 synchronized
B、 数据库:设置隔离级别为:串行化 serializable
C、 SQL 语句:使用行级锁或悲观锁机制 for update
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值