请同学们先浏览PPT,这是一个任务点哈!完成后有惊喜哟!

1.JDBC简介
JDBC的全称为“Java DataBase Connectivity”,它是一组使用Java语言编写的面向对象的用于连接数据库的程序接口(API)。它制定了统一的访问各类关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现。通过使用JDBC技术,开发人员可以用纯Java语言和标准的SQL语句编写完整的数据库应用程序,并且真正的实现了软件的跨平台型。
将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,体现Java语言“编写一次,处处运行”的优势。

JDBC实现跨平台
2.JDBC的优缺点
JDBC优点:
JDBC与ODBC十分相似,便于软件开发人员的理解。
JDBC使软件开发人员从复杂的驱动程序编写工作解脱出来,可以完全专注与业务逻辑的开发。
JDBC支持多种关系型数据库,这样可以增加软件的可移植性。
JDBC编写接口是面向对象的,开发人员可以将常用的方法进行二次封装,从而提高代码的重用性。
JDBC缺点:
通过JDBC访问数据库时,实际的操作速度会降低。
虽然JDBC编程接口是面向对象的,但通过JDBC访问数据库依然是面向关系的。
JDBC提供了对不同厂家的产品支持,这样对数据源的操作有所影响。
3.JDBC驱动程序
数据库名称 | 类包名 | 驱动名称与URL地址 |
SQLServer2000 | msbase.jar、mssqlserver.jar、msutil.jar | com.microsoft.jdbc.sqlserver.SQLServerDriverjdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库名称 |
| SQLServer2005 | Sqljdbc.jar | com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver//localhost:1433;databaseName=数据库名称 |
| MYSQL | mysql-connector-java-3.3.16-ga-bin.jar | com.mysql.jdbc.Driverjdbc:myspl://localhost:3306/数据库名称 |
| Oracle | class12.jar | oracle.jdbc.driver.OracleDriverjdbc:oracle:thin: @dssw2k01: 1521:数据库名称 |
| DB2 | db2jcc.jar | com.ibm.db2.jdbc.net.DB2Diverjdbc:db2://localhost:6789/数据库名称 |
| Derby | derby.jar | org.apache.derby.jdbc. EmbeddedDriverjdbc:derby://localhost:1527:数据库名称;create=false |
4.JDBC的主要编程接口
(1)驱动程序接口Driver
通常情况下通过java.lang.Class类的静态方法forName(String className)加载要连接数据库的Driver类,该方法的入口参数为要加载Driver类的完整包名。
Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。比如:装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
(2)驱动程序管理器DriverManager
负责管理JDBC驱动程序的基本服务,作用于用户和驱动程序之间,负责追踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,DriverManager类也处理驱动程序登录时间限制及登录和跟踪消息的显示等事务。 连接不同的数据库,DriverManager.getConnection方法中的url可能不一样:
连接MySql数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
连接Oracle数据库:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");
连接SqlServer数据库:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");
(3)数据库连接接口Connection
java.sql.Connection接口表示与特定数据库的连接,并在连接的上下文中可以执行SQL语句并返回结果。通过Connection对象可以获取数据库和表等数据库对象的详细信息。Connection接口中常用的方法如表所示。
| 序号 | 方法名称 | 功能描述 |
| 1 | setAutoCommit(Boolean bln) | 指定事务处理方式。参数设置为true时自动提交事务,false为手动提交事务 |
| 2 | getAutoCommit(Boolean bln) | 查看当前的Connection实例是否为自动事务提交模式,如果是返回true,否则返回false |
| 3 | createStatement() | 创建Statement对象示例 |
| 4 | preparedStatement(String sql) | 获得PreparedStatement对象实例,参数为预编译的SQL |
| 5 | prepareCall(string sql) | 获得CallableStatement对象实例,参数为存储过程名称 |
| 6 | setReadOnly(Boolean bln) | 设置Connection实例的读取模式,默认为false,关闭只读模式 |
| 7 | commit() | 提交事务 |
| 9 | rollback() | 回滚事务 |
| 10 | isClosed() | 判断当前连接是否关闭,如果关闭返回true,否则返回false |
| 11 | close() | 关闭当前数据库连接 |
(4)执行SQL语句接口Statement
java.sql.Connection接口表示与特定数据库的连接,并在连接的上下文中可以执行SQL语句并返回结果。通过Connection对象可以获取数据库和表等数据库对象的详细信息。Connection接口中常用的方法如表所示。

取得数据库连接对象后,就可以通过该连接发送SQL语句。可以使用Connection对象中的createStatement()方法创建Statement对象,然后将发送到数据库的SQL语句作为参数提供给Statement类中的指定方法。例如,对于select语句调用executeQuery(String sql)方法,对于insert、update和delete语句,调用executeUpdate(String sql)方法。Statement接口提供的常用方法如表所示。
| 序号 | 方法名称 | 功能描述 |
| 1 | executeQuery(String sql) | 用于产生单个结果集的语句,例如,执行SELECT查询语句 |
| 2 | executeUpdate(String sql) | 用于执行INSERT、UPDATE或DELETE语句以及SQL DDL (数据定义语言)语句,例如,CREATE TABLE和DROP TABLE。INSERT、UPDATE或DELETE语句的效果是修改表中零行或多行中的一列或多列。executeUpdate的返回值是一个整数,指示受影响的行数(即更新计数)。对于CREATE TABLE或DROP TABLE等不操作行的语句,executeUpdate的返回值总为零 |
| 3 | execute(String sql) | 用于执行返回多个结果集、多个更新计数或二者组合的语句 |
(5)执行动态SQL语句接口Statement
PreparedStatement接口继承并扩展了Statement接口,用来执行动态的SQL语句。PreparedStatement接口包含已编译的SQL语句,并且包含于PreparedStatement对象中的 SQL语句可具有一个或多个参数。该语句为每个参数保留一个问号“?”作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX()方法来提供。由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。
例如,创建包含带两个参数占位符的SQL语句的PreparedStatement对象:
PreparedStatement pstmt = con.prepareStatement("UPDATE my_table SET m =? WHERE x= ?");
pstmt.setString(1,"蓝");
pstmt.setString(2,"敏");
注意:这里的编号和数组下标不一样,是从1开始的!
(6)处理存储过程语句接口CallableStatement
CallableStatement对象为所有的关系性数据库提供了一种以标准形式调用已储存过程的方法。该对象可以处理两种形式的存储过程:一种形式带结果参数,另一种形式不带结果参数。结果参数是一种输出参数,是已储存过程的返回值。两种形式都可带有数量可变的输入、输出或输入和输出的参数。问号将用作参数的占位符。
在JDBC中,调用存储过程的语法如下:
{call 过程名[(?,?,...)]}
返回结果参数的过程的语法如下:
{? = call 过程名[(?, ?, ...)]}
(7)返回查询结果集接口ResultSet
java.sql.ResultSet接口类似于一个数据表,通过该接口的实例可以获得检索结果集以及对应的数据表相关信息。Result实例通过执行查询数据库的语句生成。一个Statement对象在同一时刻只能打开一个ResultSet对象。可以通过字段的序号或者字段的名字来制定获取某个字段的值。ResultSet对象的常用方法如表所示。
| 序号 | 名称 | 功能描述 |
| 1 | next() | 得到查询结果数实例。ResultSet初始化时定位于它的第一行数据之前;使用next方法可以将第一行数据放到ResultSet对象当中,通过该实例对象的getXXX()方法得到数据 |
| 2 | close() | 用来释放ResultSet占用的系统资源 |
| 3 | getBigDecimal(int,int) | 取得指定列值的java.lang.BigDecimal类型数据。第一个参数是列对应的位置,第二个参数是小数点后面的位数 |
| 4 | getBigDecimal(String,int) | 取得指定列值的java.lang.BigDecimal类型数据。第一个参数是字段的名称,第二个参数是小数点后面的位数 |
| 5 | getBinaryStream(int) | 获取列值为字节流的数据,参数是指定字段的位置 |
| 6 | getBinaryStream(String) | 获取列值为字节流的数据,參数是指定字段的名称 |
| 7 | getBoolean(int) | 获得一个boolean类型的数据,参数为指定字段的位置 |
| 8 | getBoolean(Sring) | 获得一个boolean类型的数据,参数为指定字段的名称 |
| 9 | getByte(int) | 获得byte类型的数据,参数是指定的字段位置 |
| 10 | getByte(String) | 获得byte类型的数据,参数是指定字段的名称 |
| 11 | getBytes(int) | 获得byte数组类型的数据,参数是指定字段的位置 |
| 12 | getBytes(String) | 获得byre数组类型的数据,参数是指定字段的名称 |
| 13 | getCursorName() | 获取ResultSet的SQL游标名 |
| 14 | getDate(int) | 获取java.sql.Date类型的数据,参数为指定字段的位置 |
| 15 | getDate(String) | 获取java.sql.Date类型的数据,参数为指定字段的名称 |
| 16 | getDouble(int) | 获得double类型的数据,参数是指定字段的位置 |
| 17 | getDouble(String) | 获得double类型的数据,参数是指定字段的名称 |
| 18 | getFloat(int) | 获得float类型的数据,参数是指定字段的位置 |
| 19 | getFloat(String) | 获得float类型的数据,参数是指定字段的名称 |
| 20 | getInt(int) | 获得int类型的数据,参数是指定字段的位置 |
| 21 | getInt(String) | 获得int类型的数据,参数是指定字段的名称 |
| 22 | getLong(int) | 获得long类型的数据,参数是指定字段的位置 |
| 23 | getLong(String) | 获得long类型的数据,参数是指定字段的名称 |
| 24 | getMetaData() | 获取ResultSet的列编号、类型和特性 |
| 25 | getObject(int) | 将指定的列值数据作为对象的形式获取,参数为指定的位置 |
| 26 | getObject(String) | 将指定的列值数据作为对象的形式获取,参数为指定的名称 |
| 27 | getShort(int) | 获取short类型的数据,参数是指定的字段位置 |
| 28 | getShort(String) | 获取short类型的数据,参数是指定的字段名称 |
| 29 | getString(int) | 获取Sting类型的数据,参数为指定的字段位置 |
| 30 | getString(Sting) | 获取String类型的数据,参数是指定的字段名称 |
| 31 | getTime(int) | 获取java.sql.Time类型的数据,参数为指定字段的位置 |
| 32 | getTime(Sting) | 获取java.sql.Time类型的数据,参数为指定字段的名称 |
| 33 | getTimestamp(int) | 获取java.sql.Timestamp类型的数据,参数是指定字段位置 |
| 34 | getTimestamp(String) | 获取java.sql.Timestamp类型的数据,参数是指定字段名称 |
| 35 | getUnicodeStream(int) | 以一个Unicode字符流来获取指定字段数据,参数为指定字段的位置 |
| 36 | getUnicodeStream (String) | 以一个Unicode字符流来获取指定字段数据,参数是指定字段的名称 |
| 37 | findColumn(String) | 映射一个ResutSet列名到ResultSet列索引号,参数是字段的名称 |
| 38 | getAsciiStream(int) | 以一个ASCII字符流的形式获取字段数据,然后成批的从流中读出,参数为指定字段的位置 |
| 39 | getAsciiStream(string) | 以一个ASCII字符流的形式获取字段数据,然后成批的从流中读出,参数为指定字段的名称 |

