400 likes | 669 Views
JDBC 概述. JDBC 是一ç§ç”¨äºŽæ‰§è¡Œ SQL è¯å¥çš„ Java API , 它由一组用 Java è¯è¨€ç¼–写的类和接å£ç»„æˆã€‚通过这些类和接å£ï¼Œ JDBC 把 SQL è¯å¥å‘é€ç»™ä¸åŒç±»åž‹çš„æ•°æ®åº“进行处ç†å¹¶æŽ¥æ”¶å¤„ç†ç»“果。. JDBC 产å“包括三个组件. JDBC 驱动程åºç®¡ç†å™¨ JDBC 驱动程åºç®¡ç†å™¨æ˜¯ JDBC 体系结构的支柱,主è¦ä½œç”¨æ˜¯æŠŠ Java 应用程åºè¿žæŽ¥åˆ° JDBC 驱动程åºä¸Šï¼Œç„¶åŽé€€å‡º JDBC 驱动程åºæµ‹è¯•å·¥å…·åŒ… 用于测试 JDBC 驱动程åºï¼Œåªæœ‰é€šè¿‡æµ‹è¯•çš„驱动程åºæ‰è¢«è®¤ä¸ºæ˜¯ “ ç¬¦åˆ JDBC æ ‡å‡† †的 JDBC-ODBC æ¡¥
E N D
JDBC是一种用于执行SQL语句的Java API,它由一组用Java语言编写的类和接口组成。通过这些类和接口,JDBC把SQL语句发送给不同类型的数据库进行处理并接收处理结果。
JDBC产品包括三个组件 • JDBC驱动程序管理器 JDBC驱动程序管理器是JDBC体系结构的支柱,主要作用是把Java应用程序连接到JDBC驱动程序上,然后退出 • JDBC驱动程序测试工具包 用于测试JDBC驱动程序,只有通过测试的驱动程序才被认为是“符合JDBC标准”的 • JDBC-ODBC桥 使ODBC驱动程序可被用作JDBC驱动程序,它的实现为JDBC的快速发展提供了一条途径
1)类和接口 • 支持JDBC API的类和主要接口封装在Java.sql包和Javax.sql包中
类 接口 java.sql.DriverManager java.sql.Connection java.sql.SQLException java.sql.DatabaseMetaData java.sql.SQLWarning java.sql.Statement java.sql.BatchUpdateException java.sql.Resultset java.sql.DriverPeopertyInfo java.sql.Array java.sql.Time java.sql.Blob java.sql.Timestamp java.sql.Driver java.sql.Types java.sql.ParameterMetaData java.sql.PrepareStatement java.sql.Ref java.sql.ResultSetMetaData java.sql.Savepoint java.sql.SQLData java.sql.SQLInput java.sql.SQLOutput java.sql.Permission java.sql.Struct java.sql.CallableStatement java.sql.Colb
类 接口 javax.sql.ConnectionEvent javax.sql.ConnectionEventListener javax.sql.RowSetEvent javax.sql. ConnectionPoolDataSource Javax.sql.DataSource Javax.sql.PooledConnection Javax.sql.RowSet Javax.sql.RowSetInternal Javax.sql.RowSetListener Javax.sql.RowSetMetaData Javax.sql.RowSetReader Javax.sql.RowSetWriter Javax.sql.XAConnection Javax.sql.XADataSource Javax.sql的类和接口
Java.sql.DriverManager • Java.sql.DriverManager是唯一的一个服务类,用于管理JDBC驱动程序,提供getconnection方法建立应用程序与数据库连接。当JDBC驱动程序加载到内存时,会自动向JDBC驱动程序进行注册,接着如果有连接数据库的请求,DriverManager类就会用注册的JDBC驱动程序来创建到数据库的连接。一般通过调用Class.forName()加载驱动程序。
Java.sql.Connection接口 Java.sql.Connection接口定义到数据库的连接,用于制造Statement对象,提供数据库的信息。一个应用程序可与单个数据库有一个或多个连接,或者可与许多数据库有连接。
Java.sql.Statement • Java.sql.Statement代表SQL语句的接口,通过executeQuery或executeUpdate方法执行一个静态的SQL语句。
Java.sql.ResultSet接口 • Java.sql.ResultSet接口维护查询得到的一张视图表,它提供了许多维护表记录的方法对数据库进行操作
Java.sql.SQLException类 • Java.sql.SQLException类用于检查并报告用JDBC操作数据库时的错误。Java是一种安全性很好的语言,如果在类方法中声明了有例外处理,当在程序中创建对象实例,通过对象实例调用这些方法时都应该提供例外处理。
JSP使用JDBC的过程 • (1)创建一个JDBC Driver连接实例或DataSource连接实例. • (2)使用连接实例创建一个连接 • (3)使用JDBC连接创建声明语句 • (4)调用声明语句的executeQuery方法获得结果集 • (5)操作结果集的记录 • (6)如果还需要这个连接创建其它结果集,从第3步开始重复 • (7)释放结果集. • (8)释放声明语句. • (9)断开与数据库的连接
JDBC驱动程序的类型 • (1)驱动程序类型一 • 驱动程序类型一是将JDBC调用映射到其它类型的数据访问API上,最常用的是JDBC-ODBC桥接驱动程序,它利用ODBC驱动程序提供JDBC的访问。要注意的是,使用这种类型的驱动程序必须在每个客户机上加载ODBC驱动程序,因此此类型适用于企业内部网或者是用Java编写的三层结构的应用程序服务器代码。
(2)驱动程序类型二 • 驱动程序类型二是基于本地API,部分用Java来编写的的驱动程序。这种类型的驱动程序将客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其他DBMS的调用。
驱动程序类型三 • 驱动程序类型三是JDBC网络纯Java驱动程序,这种驱动程序将JDBC转换为与DBMS无关的网络协议,这后这种协议将被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java 客户机连接到多种不同的数据库上,因为它们仅仅依赖驱动程序和中间件之间的网络协议,而中间件提供发数据库到应用程序之间的抽象。
驱动程序类型四 • 驱动程序类型四是本地协议纯Java驱动程序,这类驱动程序将JDBC调用转换为DBMS所使用的网络协议,这将允许从客户机上直接调用DBMS服务器,获得最大的网络传输速度。
通过Driver接口建立连接 • 加载驱动程序 加载驱动程序非常简单,只需要一句代码:Class.forName(类名),就可以将相应有的核心类加载到驱动程序管理器中。 (A)加载JDBC-ODBC桥驱动程序: Class.forName(“sun.jdbc.odbc.JdbcOdbcDrive”) (B)加载JDBC驱动程序: Class.forName(“jdbc.drive_class_name”) (C)加载mySQL驱动程序: Class.forName(“org.gjt.mm.mysql.Drive”) (D)加载Oracle驱动程序: Class.forName(“oracle.jdbc.driver.OracleDriver”)
通过Driver接口建立连接 • 建立连接 当驱动程序加载成功,就可以操作DriverManager类的getConeection方法一个同数据库的连接,格式如下: Connection con=DriverManager.getConection(Url,login,password) 对于不同的数据库驱动程序,其URL有所不同,但必须遵从下面两个格式中的一个:
Jdbc:driver-id:database-id Jdbc:driver-id://host/database-id 例如: JDBC-ODBC桥驱动程序的格式 jdbc:odbc:数据源名 mySQL jdbc驱动程序的格式 jdbc:mysql:///test Oracle jdbc驱动程序的格式 jdbc:oracle:thin:@myhost:1521:ORCL
通过DataSource接口建立连接 • 它使用Java命名和目录接口JNDI作为数据的存储和查询机制 首先使用JNDI的命名类指定一个驱动程序的名称和位置并装入该驱动程序。完成这一操作,需要建立一个目录形式的视图,创建一个InitialContext类(该类属于javax.naming包)表示的顶级域名,相当于一个目录形式的根目录,例如: InitialContextctx=newInitalContent();
DataSource ds=(DataSource)ctx.lookup(“jdbc/oracle”); 获得了一个数据源后,就可以通过这个数据源的getConnection方法创建一个连接了: Connection conn=ds.getConnection(“username”,”pwd”);
声明语句 • 1)声明语句的创建 • 2)声明语句的执行 • 3)声明语句的释放
声明语句的创建 • JDBC提供了三个接口用于向数据库发送SQL语句,它们分别是:Statement、PreparedStatement、CallableStatement。Connection接口中的三个方法对应用于创建上述三个接口实例,分别为:CreateStatemet、preparedStatement、prepareCall。Statement对象用于发送简单的SQL语句。PreparedStatement对象用于发送带有一个或多个输入参数的SQL语句,并且它经过预编译,效率要比使用Statement对象高。CallableStatement对象用于执行SQL存储程序,SQL存储程序是一组可通过名称来调用的SQL语句
声明语句的创建 (1)普通语句的创建 Statement stmt=conn.createStatemnt(); (2)预编译语句的创建 String cmd=”select * from BaseInfo where major=?” PreparedStatement stmt=conn.preparedStatement(cmd); stmt.setString(1,”CS”);
(3)调用存储过程语句的创建 String cmd=”CALL LIST_ON_MAJOR(‘CS’)”; CallableStatement stmt=conn.prepareCall(cmd);
声明语句的执行 • 使用SQL语句对数据库执行的操作通常分为两类:一是查询数据库信息;二是操纵数据库数据。查询数据库信息操作需要返回查询结果集,操纵数据库操作需要返回操纵成功的记录数,所以Statement接口提供两种不同的执行方法完成两类操作。
查询数据库信息―executeQuery ResultSet rs=stmt.executeQuery(“select * from BaseInfo”);
操纵数据库数据-executeUpdate • ResultSet rs=stmt.executeUpdate(“INSERT INTO BaseInfo VALUES(‘02010534’”+ “,’xiaoming’,‘CS’)”);
声明语句的释放 • 语句使用完毕,释放语句对象是良好的编程风格: stmt.close()
结果集 数据库创建结果集类型 (1)read-only:只允许读取查询结果,读取顺序从头到尾值只能读一次。 (2)scroable:允许反复随机读取查询结果的任意记录。 (3)updateable允许对结果集作插入、修改和删除操作,并直接反应到后台数据库。 结果集类提供了方法getType()检查结果集的类型,方法getConcurrency()检查当前记录的可操作类型。
结果集 2 结果集类型 (1)TYPE_FORWORD_ONLY: 结果集为只读类型,并且读取顺序从头到尾值读取记录,只能读一次 (2)TYPE_SCROLL_SENSITIVE: 在他人同时对数据库操作时,会影响结果集中的纪录。 (3)TYPE_SCROLL_INSENSITIVE: 在他人同时对数据库操作时,不会影响结果集中的纪录。
结果集 当前记录操作类型 (1)CONCUR_READ_ONLY:结果集是只读的,不能改变当前记录。 (2)CONCUR_UPDATEABLE:结果集可以修改的,可以修改记录的值,插入记录,删除记录。 在进行记录的修改操作时,通常要先检查可操作类型,:if(rs.getCurrency()!=ResultSet.CONCUR_UPDATEABLE) system.err.println(“Error,cannot change rs”);
在结果集上移动 • 结果集接口提供了next()方法,使游标向后移动一条记录,previous()方法使游标向前移动一条记录,组合使用这两个方法就可以实现访问结果集任意记录。 • 遍历一个记录集的方法为: • ResultSet rs=... • while(rs.next()){ • ... ... • }
访问记录字段 • 结果集接口提供了一系列的getXXX方法访问字段的值,XXX表示返回值的类型,调用格式为: rs.getXXX((index/fieldname)
获得结果集信息 • 在操作结果集时,经常需要获得一些额外的信息,如记录数、列名称等等,ResultSetMetaData接口通过元数据(Metadata)提供一个特定结果集的相关信息。例如:下面代码显示数据库的所有列信息: • ResultSetMetsData MetaData=rs.getMetaData(); • int num_columnes=MetaData.getColumnCount(); • for (int i=1;i<=numColumns;i++){ • Sytem.out.print(“column”); • Sytem.out.print(i); /*列位置*/ • Sytem.out.print(“name:”); • Sytem.out.print(MataData.getColumnName(i));/*列名称*/ • }
定位记录 • 使用absolute()方法可以定位到确定的一条记录上,例如:定位到第10条记录的语句为: rs.absolute(10)
删除记录 • 使用deleteRow()方法可以删除到当前的一条记录上,例如:删除第5条记录的语句为: rs.absolute(5); rs.deleteRow()
修改记录 rs.updateXXX(Index, value); 例如:修改所有记录的major字段为”IT”的语句为: ResultSet rs=... ResultSetMetaData MetaData=rs.getMetaData(); int index_major=rs.findColumn(“major”);//返回字段major的序号 if(rs.getCurrency()!==Result.CONCUR_UPDATEABLE) { system.err.println(“Error,can not change rs ”); return; } while(rs.next()) { rs.updateString(index_major,”IT”); }
插入一条新记录 • 为插入一条新记录,ResultSet专门创建了一条特殊的记录行,插入一条新纪录的步骤为: • (1)调用movetoInsertRow()方法将游标指向插入行; • (2)使用UpdateXXX()方法修改插入行字段值; • (3)调用insertRow()方法将新记录加入到数据库; • (4)调用movetoCurrentRow()返回当前修改行;
例如增加一条学生记录的语句为: ResultSet rs=... if(rs.getCurrency()!==Result.CONCUR_UPDATEABLE) { system.err.println(“Error,can not change rs ”); return; } rs.movetoInsertRow(); rs.UpdateString(1,”02010625”); rs.UpdateString(2,”yulei”); rs.UpdateString(3,”IT”); rs.insertRow(); rs.movetoCurrentRow();