1. JDBC(Java数据库连接)概念:
是用于执行SQL语句的API,可以为多种关系数据库提供统一访问,由一组Java语言编写的类和接口组成。
JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使开发人员能够用纯javaAPI编写数据库应用程序
2. JDBC驱动程序分四种:
JDBC-ODBC桥:把所有JDBC的调用传递给ODBC,再让后者调用数据库本地驱动代码
本地API驱动:通过客户端加载数据库厂商提供的本地代码来访问数据库,而在驱动程序中则包含了java代码
网络协议驱动:给客户端提供一个网络API,客户端上的JDBC驱动程序使用套接字Socket来调用服务器上的中间件程序,后者将其请求转化为所需的具体API调用。
本地协议驱动:使用Socket,直接在客户段和数据库间通信。
3. JDBC API主要位于java.sql包中,主要包括:
DriverManager:
Driver:
Connection:
Statement:
PreparedStatement:
CallableStatement:
SQLException:
4. JDBC可以做三件事:
与数据库建立连接;发送操作数据库的SQL语句;处理结果
5. 创建数据库连接:
获取相应的JDBC驱动程序,将其引入项目java build path路径
加载数据库驱动程序Class.forName(String name);
建立连接:
/*第一个参数是协议url,第二个参数是用户名,第三个参数是密码*/
Connection conn =DriverManager.getConnection(String url,String user,String password);
6. 发送操作数据库的SQL语句
JDBC提供三个类用于向数据库发送SQL语句
Statement:由Connection对象的createStatement方法创建,Statement对象用于发送简单的SQL语句
PreparedStatement:由prepareStatement方法创建,PreparedStatement对象用于发送带输入参数的SQL语句
CallableStatement:由prepareCall方法创建,CallableStatement对象用于执行SQL储存过程
7. 处理结果
对于更新语句,完成后返回一个受操作影响的行数
对于查询语句,通过Statement对象的executeQuery(Sring string)方法获得查询结果集,返回查询的结果集ResultSet
ResultSet.next()方法下移结果集中记录指针并判断记录指针是否指向空,指针一开始指向结果集前。
ResultSet.的getXxx()方法读取结果集中当前记录的字段信息。
8. ConnectionFaction
(1)、 ConnectionFaction作用
利用工厂模式提升代码的重用性;封装注册数据库的驱动和获得数据库的连接;利用配置文件减少硬编码,便于维护。
ConnectionFaction的开发
(2)、 配置文件jdbcinfo.properties
oracle.driver=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@localhost:1521:数据库名
user=
password=
(3)、 配置文件信息的获取
ConnectionFactory.class.getResourceAsStream(“jdbcinfo.properties”);//这里是相对路径,返回InputStream
(4)、 数据库连接Connection的获得
public static Connection getConnection()
9. Statement
(1)、 创建Statement的方式
/*执行不带参数(占位符)的简单SQL语句*/
Statement stmt = Connection.createStatement(...);
/*执行带参数(占位符)或不带参数(占位符)的简单SQL语句*/
PreparedStatement stmt = Connection.prepareStatement(...);
/*执行对数据库已存储的PL/SQL程序的调用*/
CallableStatement stmt =Connection.createprepareCall(...);
(2)、 执行SQL语句
/*执行查询语句,返回查询结果集ResultSet, ResultSet游标指针指向第一条记录前。ResultSet每次默认从数据库返回10条记录,当指针到最后一个之后再从数据库返回,可以通过ResultSet.setFetchSize(int )设置每次返回的数量*/
stmt.executeQuery()
/*执行DML和DDL语句,返回int类型,指示受影响的记录*/
stmt.executeUpdate()
/*执行任何SQL语句,返回Boolean类型,指示是否有ResultSet*/
stmt.execute()
(3)、 Statement、PreparedStatement和CallableStatement区别
/*PreparedStatement的SQL语句存储在服务器端,再次执行时只传送参数;CallableStatement调用服务器端的存储过程*/
10. 事务(Transaction)提交模式和隔离级别
(1)、 事务提交模式
自动提交默认:默认方式,每执行完一条SQL语句就自动提交事务,每条SQL语句的执行都被单独提交,因此一个事务只有一条SQL语句组成。
手动提交模式:一个事务可以包含若干条SQL语句。调用Connection.setAutoCommit(false)方法设置手动提交模式;获取数据库连接时已开始一个新的事物;调用Connection.commit()方法提交事务;调用Connection.rollback()方法回滚事务(在try/catch块实现)。
(2)、 事务并发引发的问题
脏读:一个事务读取另一个事务未提交的数据
不可重复读:一个事务运行期间两次读取相同数据但内容不一致
虚读/幻影读:一个事务运行期间两次读取相同统计数据但内容不一致,原因是两次读取期间有其他事务执行插入或删除符合统计条件的数据并提交。
(3)、 事务隔离级别
通过设置事务隔离级别,来解决脏读、不可重复读、幻影读问题
五种事务隔离级别
TRANSACTION_NONE(0):不支持事务
TRANSACTION_READ_UNCOMMITTED(1):可读未提交数据
TRANSACTION_READ_COMMITTED(2):避免脏读
TRANSACTION_REPEATABLE_READ(4):避免不可重复读
TRANSACTION_SERIALIZABLE(8):避免幻影读
隔离级别 | 避免脏读 | 避免不可重复读 | 避免幻影读 |
READ_UNCOMMITTED(1) | n | n | n |
READ_COMMITTED(2) | y | n | n |
REPEATABLE_READ(4) | y | y | n |
SERIALIZABLE(8) | y | y | y |
隔离级别越高,并发性能越差,一般避免脏读可以READ_COMMITTED(2),设置,oracle数据库事务隔离级别:默认READ_COMMITTED(2) 和SERIALIZABLE(8)两种
获取当前事务隔离级别:Connection.getTranactionIsolation(),返回对应数字
设置事务隔离级别:Connection.setTranactionIsolation(int)//Connection类有对应的参数
11. 批处理
(1)、 作用:一次很数据库交互过程中传输多条SQL语句或参数内容,减少和数据库交互次数,提升性能。
(2)、 使用:
用手动提交事务方式
Statement.addBatch()将当前SQL语句交给Statement
Statement.executeBatch()将多条SQL语句在一次和数据库交互过程中执行
PreparedStatement.addBatch()将当前参数内容交给PreparedStatement
PreparedStatement.executeBatch()将多条记录的参数内容在一次和数据库交互过程中传输给数据库
12. DAO(Data Access Object)模式
(1)、 目的:
封装和隐藏DB访问细节
将业务逻辑和DB访问细节实现隔离(事务的启动、提交、回滚放在业务逻辑层)
降低耦合度
(2)、 DAO模式设计
提供一个DAO接口(如:*Dao)
提供DAO接口的实现类(如:*DaoImpl)
13. ORM
(1)、 O/R Mapping(对象/关系映射):一种将内存中的对象保存到关系型数据库的技术。
(2)、 ORM映射模型
对象模型 | 关系模型 |
实体类(POJO:Plain Old Java Object) | 表 |
实体类属性 | 字段 |
OID | 主键 |
实体对象 | 记录 |
实体类之间的关联关系 | 外键 |
14. JDBC模板(JDBC Template)
概念
封装CRUD的操作,并执行CRUD操作的方法
封装创建不同的Statement的语句
开发
jdbcTemplate:封装CRUD的操作和创建不同的Statement
PreparedStatementSetter:一个用于通过PreparedStatement来设置替换占位符的接口
RowCallBackHandler:一个用于处理结果集的接口