JDBC
2023-12-19 19:25:55 7 举报
AI智能生成
JDBC
作者其他创作
大纲/内容
概述
JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API)。
定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这个类库可以以一种标准的方法、方便地访问数据库资源。
JDBC 为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
JDBC的目标是让 Java 程序员使用 JDBC 连接到任何提供了 JDBC 驱动程序的数据库系统。
使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
数据持久化
持久化(persistence):将数据保存到可掉电式存储设备中以供之后使用。在大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以"固化",而持久化的实现过程大多通过各种关系数据库来完成。
持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。
java中的数据存储技术分类
JDBC直接访问数据库
JDO技术
第三方O/R工具,如Hibernate, ibatis等
JDBC接口
面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。
JDBC API
JDBC API 是一系列的接口,它使得应用程序能够进行数据库联接,执行 SQL 语句,并且得到返回结果。
Driver Manager
父接口
connection
建立连接
statement、prepareStatement、callableStatement
执行SQL语句
result
结果集
java.sql.Driver
所有 JDBC 驱动程序需要实现的接口。
在程序中不需要直接访问实现了 Driver 接口的类,而是由驱动程序管理器类 (java.sql.DriverManager) 去调用这些 Driver 实现。
驱动加载与注册
方式一:加载JDBC驱动需调用Class类的静态方法forName(),向其传递要加载的JDBC驱动的类名
Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver");
方式二:DriverManager 类是驱动程序管理器类,负责管理驱动程序。
DriverManager.registerDriver(com.mysql.jdbc.Driver);
DriverManager.registerDriver(com.mysql.jdbc.Driver);
通常不用显式调用DriverManager类的registerDriver()方法来注册驱动程序类的实例
Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用DriverManager.registerDriver()方法来注册自身的一个实例
Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用DriverManager.registerDriver()方法来注册自身的一个实例
面向接口编程
不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。————面向接口编程
获取数据库连接
可以调用DriverManager类的getConnection()方法建立到数据库的连接。
user,password可以用“属性名=属性值”方式告诉数据库;
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
jdbc:子协议:子名称
协议:JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序。
子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的IP地址),端口号,数据库名。
常见:(协议+子协议+子名称)
jdbc:oracle:thin:@localhost:1521:test
jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid
jdbc:mysql://localhost:3306/test
jdbc:oracle:thin:@localhost:1521:test
jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid
jdbc:mysql://localhost:3306/test
增删查改
注册驱动(只做一次)
建立连接(Connection)
创建执行SQL的语句(Statement)
PreparedStatement
调用Connection对象的preparedStatement()方法获取PreparedStatement对象
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句。
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示
调用PreparedStatement对象的setXxx()方法来设置这些参数。setXxx()方法有两个参数,第一个参数是要设置的SQL语句中的参数的索引(从1开始),第二个是设置的SQL语句中的参数的值。
执行语句
处理执行结果(ResultSet)
通过调用PreparedStatement对象的executeQuery()方法创建该对象。
ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现。
ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行。
ResultSet: 结果集。封装了使用 JDBC 进行查询的结果。
调用PreparedStatement对象的executeQuery()可以得到结果集。
ResultSet 返回的实际上就是一张数据表。有一个指针指向数据表的第一条记录的前面。
相当于Iterator对象的hasNext()和next()方法的结合体
ResultSet 接口的常用方法:
boolean next()
getString()
释放资源
释放ResultSet, Statement, Connection。
数据库连接(Connection)是非常稀有的资源,用完后必须马上释放,如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
数据库事务
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;
要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;
要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
使用COMMIT和ROLLBACK语句,我们可以:
确保数据完整性。
数据在提交之前可以预览。
将逻辑上相关的操作分组。
步骤
调用Connection对象的setAutoCommit(false);以取消自动提交事务
在所有的SQL语句都成功执行后,调用commit()方法提交事务。
在出现异常时,调用rollback()方法回滚事务。
若此时 Connection 没有被关闭,则需要恢复其自动提交状态。
事务的ACID(ACID)属性
1. 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另一个一致性状态。
3. 隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4. 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
数据库连接池
传统的模式
步骤
在主程序(如servlet、beans)中建立数据库连接
进行SQL操作
断开数据库连接
缺点
数据库的连接资源并没有得到很好的重复利用。
多次请求连接断开
不能控制创建的连接对象数
数据库连接池技术
基本思想
为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
作用
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
限制
数据库连接的数量是由最小数据库连接数来设定的,无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。
连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
数据库连接池技术的优点
资源重用
由于数据库连接得以重用,避免了频繁创建和释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的稳定性。
更快的系统反应速度
数据库连接池在初始化过程中,通常已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间。
新的资源分配方法
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源。
统一的连接管理,避免数据库连接泄露
在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露。
DRUID
DRUID是阿里巴巴开源平台上的一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好地监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,据说是目前最好的连接池。
(1)加入jar包
例如:druid-1.1.10.jar
(2)代码步骤
第一步:建立一个数据库连接池
第二步:设置连接池的参数
第三步:获取连接
方式一
//1、创建数据源(数据库连接池)对象
DruidDataSource ds = new DruidDataSource();
2、设置参数
//(1)设置基本参数
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/test");
ds.setUsername("root");
ds.setPassword("123456");
3、获取连接
Connection conn = ds.getConnection();
如果这里没有关闭,就相当于没有还。
conn.close();
方式二:
创建配置文件druid.properties
url=jdbc:mysql://localhost:3306/0319db?rewriteBatchedStatements=true
username=root
password=123456
driverClassName=com.mysql.jdbc.Driver
代码如下:
Properties pro = new Properties();
pro.load(TestDruid2.class.getClassLoader().getResourceAsStream("druid.properties"));
DataSource ds=
DruidDataSourceFactory.createDataSource(pro);
Connection conn = ds.getConnection();
DBUtils
将常用的操作数据库的JDBC的类和方法集合在一起,就是DBUtils。
ResultSetHandler,此接口用于处理数据库查询操作得到的结果集。不同的结果集情况,由其不同的子类来实现。
QueryRunner,提供数据库操作的一系列重载的update()和query()操作。
结果集处理
BeanHandler:将结果集转换为一个Bean
BeanListHandler:将结果集转换为一个Bean的集合
MapHandler:将结果集转换为一个 Map
MapListHandler:将结果集转换为一个Map的List
ScalarHandler:将结果集转换为一种类型的数据返回,该类型通常指String或其他8种基本数据类型。
0 条评论
下一页
为你推荐
查看更多