概述
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 语句,并且得到返回结果。
statement、prepareStatement、callableStatement
执行SQL语句
java.sql.Driver
所有 JDBC 驱动程序需要实现的接口。
在程序中不需要直接访问实现了 Driver 接口的类,而是由驱动程序管理器类 (java.sql.DriverManager) 去调用这些 Driver 实现。
驱动加载与注册
方式一:加载JDBC驱动需调用Class类的静态方法forName(),向其传递要加载的JDBC驱动的类名<br>Class.forName("com.mysql.jdbc.Driver");<br>
方式二:DriverManager 类是驱动程序管理器类,负责管理驱动程序。<br>DriverManager.registerDriver(com.mysql.jdbc.Driver);<br>
通常不用显式调用DriverManager类的registerDriver()方法来注册驱动程序类的实例<br>Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用DriverManager.registerDriver()方法来注册自身的一个实例<br>
面向接口编程
不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。————面向接口编程
获取数据库连接
可以调用DriverManager类的getConnection()方法建立到数据库的连接。
user,password可以用“属性名=属性值”方式告诉数据库;
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。
jdbc:子协议:子名称
协议:JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序。
子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的IP地址),端口号,数据库名。
常见:(协议+子协议+子名称)<br> jdbc:oracle:thin:@localhost:1521:test<br> jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid<br> jdbc:mysql://localhost:3306/test
增删查改
注册驱动(只做一次)
建立连接(Connection)
创建执行SQL的语句(Statement)
PreparedStatement
调用Connection对象的preparedStatement()方法获取PreparedStatement对象<br>
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的使用原则是尽量晚创建,尽量早的释放。
数据库事务
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。<br>当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;<br>要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。<br><br>
当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
使用COMMIT和ROLLBACK语句,我们可以:<br>
确保数据完整性。
数据在提交之前可以预览。
将逻辑上相关的操作分组。
步骤
调用Connection对象的setAutoCommit(false);以取消自动提交事务
在所有的SQL语句都成功执行后,调用commit()方法提交事务。
在出现异常时,调用rollback()方法回滚事务。
若此时 Connection 没有被关闭,则需要恢复其自动提交状态。
事务的ACID(ACID)属性
1. 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另一个一致性状态。
3. 隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4. 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
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种基本数据类型。