一、JDBC说明
1. 概念说明
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。
直接调用 SQL 命令。在这方面它的功能极佳,并比其它的数据库连接 API 易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。
在关系数据库的"对象/关系"3映射中,表中的每行对应于类的一个实例,而每列的值对应于该实例的一个属性。
2. 功能示意
3. 常用接口
3.1 Driver接口
由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。
3.2 Connection接口
Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。
3.3 Statement接口
用于执行静态SQL语句并返回它所生成结果的对象。在JDBC中Statement有三种类型:
(1)Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
(2)PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
(3)CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。
常用Statement方法:
(1)execute(String sql):运行语句,返回是否有结果集
(2)executeQuery(String sql):运行select语句,返回ResultSet结果集。
(3)executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
(4)addBatch(String sql) :把多条sql语句放到一个批处理中。
(5)executeBatch():向数据库发送一批sql语句执行。
3.4 ResultSet接口
1. 提供检索不同类型字段的方法,具体如下:
(1)getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
(2)getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
(3)getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
(4)getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
(5)getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。
2. 提供了对结果集进行滚动的方法
(1)next():移动到下一行
(2)Previous():移动到前一行
(4)absolute(int row):移动到指定行
(5)beforeFirst():移动resultSet的最前面。
(6)afterLast() :移动到resultSet的最后面。
二、JDBC应用
1. 应用流程
2. 数据查询
由Statement接口或其子类调用 executeQuery(String sql):运行select语句,返回ResultSet结果集,然后循环读取结果集的中数据就完成了。
3. 数据更新
由Statement接口或其子类调用 executeUpdate(String sql) 运行SQL语句并返回最终的受影响行数就可以了。
4. 事务处理
4.1 事务定义
一组同时执行的SQL语句,同时成功或失败,数据库操作的一个基本单元。
4.2 事务特点(ACID)
(1)原子性(atomicity),事务内的所有操作是一个整体,要么同时成功要么同时失败;
(2)一致性(consistency),事务内一个操作失败后,所有事务内的修改成功后的数据都必须会滚到之前的状态;
(3)隔离性(isolation),事务查看数据时所处的状态要么被另一个事务修改它之前的状态要么是修改它之后的状态,事务不会查看中间状态的数据,事务隔离级别从低到高(读取未提交 ----- > 读取已提交 ----> 可重复读 ---- > 序列化);
(4)持久性(durability),持久性事务完成之后它对系统的影响是永久性的;
4.3 代码实现
只需要在创建数据链接对象Connection 对象之后设置 conn.setAutoCommit(false) 手动提交事务就可以了,这样每次更新之后的数据都需要进行 conn.commit() 操作就可以保证数据的完整处理了。
5. 批量处理
单次更新数据需要重复的打开关闭一系列的数据对象,造成不必要的功能操作,这样影响性能,所以在实际开发中争对那些可以进行批量操作的数据可以提升数据处理速度。
6. 时间类型
Java中操作时间的包是java.util.Date,我们在JDBC中可以选用的时间类型还可以是它的子类,具体如下:
(1)子类:java.sql.Date
(2)子类:java.sql.Time
(3)子类:java.sql.Timestamp
三、补充说明
1. 操作MySQL
(1) 链接URL jdbc:mysql://数据库服务器IP:数据库端口/数据库名称
(2) 驱动类 com.mysql.jdbc.Driver
2. 操作Oracle
(1) 链接URL jdbc:oracle:thin:@数据库服务器IP:数据库端口:数据库名称
(2) 驱动类 Oracle.jdbc.driver.OracleDriver
3. 操作DB2
3.1 驱动包 db2java.zip
(1) 链接URL jdbc:db2://数据库服务器IP:数据库端口/数据库名称
(2) 驱动类 COM.ibm.db2.jdbc.net.DB2Driver
3.2 驱动包 db2jcc.jar
(1) 链接URL jdbc:db2://数据库服务器IP:数据库端口/数据库名称
(2) 驱动类 com.ibm.db2.jcc.DB2Driver
4. 操作MSSQL
(1) 链接URL jdbc:sqlserver://数据库服务器IP:数据库端口;DatabaseName=数据库名称
(2) 驱动类 com.microsoft.sqlserver.jdbc.SQLServerDriver