Java语言程序设计(第2版)第17章JDBC技术和数据库应用17.1关系数据库概述17.2JDBC17.2.1JDBC驱动程序17.2.2ODBC数据源配置17.2.3JDBCAPI17.3JDBC基本应用17.3.1数据库查询17.3.2数据库的更新17.3.3用PreparedStatement类实现SQL操作17.4数据库应用举例Java语言程序设计(第2版)17.1关系数据库概述命令功能举例Create创建表格createtableCOFFEES(COF_NAMEVARCHAR(32),PRICEINTEGER)Drop删除表格droptableCOFFEESInsert插入数据INSERTINTOCOFFEESVALUES('Colombian',101);Select查询数据SELECTCOF_NAME,PRICEFROMCOFFEESwhereprice7Delete删除数据Delete*fromCOFFEESwhereCOF_NAME='Colombian'Update修改数据UpdateCOFFEESsetprice=price+1SQL语句Java语言程序设计(第2版)17.2.1JDBC驱动程序的分类1.JDBC-ODBC桥接驱动程序Sun公司在Java2中免费提供了JDBC-ODBC桥接驱动程序。2.本地API结合部分Java驱动程序这类驱动程序将JDBC的调用转换成个别数据库系统的原生码调用,Oracle、Sybase、Informix、DB2等数据库系统均提供了本地API。3.JDBC网络纯Java的驱动程序这类驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为个别数据库系统的原生码调用。4.本地协议纯Java的驱动程序这类驱动程序全由Java写成,这种类型的驱动程序直接将JDBC调用转换为DBMS所使用的协议。也即利用随数据库的原生协议直接与数据库沟通,不用通过中介软件,它是属于专用的驱动程序,要靠厂商直接提供。Java语言程序设计(第2版)17.2.2如何配置ODBC数据源Java语言程序设计(第2版)选择“系统DSN”选项卡Java语言程序设计(第2版)指定数据源名称Java语言程序设计(第2版)对指定数据源选择数据库Java语言程序设计(第2版)11.2.3JDBCAPIConnection接口:代表与数据库的连接。通过Connection接口提供的getMetaData方法可获取所连接的数据库的有关描述信息,表名、表的索引、数据库产品的名称和版本、数据库支持的操作。Statement接口:用来执行SQL语句并返回结果记录集。ResultSet:SQL语句执行后的结果记录集。您必须逐行访问数据行,但是您可以任何顺序访问列。Java语言程序设计(第2版)连接AccessClass.forName(sun.jdbc.odbc.JdbcOdbcDriver);Stringurl=jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=data.mdb;//data.mdb为数据库名,如果与java程序不在同一目录,要指定路径Connectionconn=DriverManager.getConnection(url,,);Java语言程序设计(第2版)测试与Access数据库的连接importjava.sql.*;publicclassConnectDataBase{publicstaticvoidmain(Stringargs[]){Stringurl=jdbc:odbc:mydata;try{Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);}catch(java.lang.ClassNotFoundExceptione){System.err.println(e.getMessage());}try{Connectioncon=DriverManager.getConnection(url,,null);System.out.println(Connectionsucceed!);con.close();}catch(SQLExceptionex){System.out.println(Message:+ex.getMessage());}}}Java语言程序设计(第2版)2.Statement接口提供了三种执行SQL语句的方法方法executeQuery用于产生单个结果集的语句,例如SELECT语句。方法executeUpdate用于执行INSERT、UPDATE或DELETE语句以及SQLDDL(数据定义语言)语句,executeUpdate的返回值是一个整数,指示受影响的行数(即更新计数)。对于CREATETABLE或DROPTABLE等不操作行的语句,executeUpdate的返回值总为零。方法execute用于执行返回多个结果集、多个更新计数或二者组合的语句。Java语言程序设计(第2版)例17-1在一个空库中创建数据表importjava.sql.*;publicclassCreateStudent{publicstaticvoidmain(Stringargs[]){Stringurl=jdbc:odbc:mydata;Stringsql=createtablestudent+(nameVARCHAR(20),+sexCHAR(2),+birthdayDate,+leaveBIT,+stnumberINTEGER);try{Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);}catch(java.lang.ClassNotFoundExceptione){}Java语言程序设计(第2版)try{Connectioncon=DriverManager.getConnection(url,,null);Statementstmt=con.createStatement();try{stmt.executeUpdate(sql);System.out.println(studenttablecreated);}catch(Exceptionex){}stmt.close();con.close();}catch(SQLExceptionex){}}}Java语言程序设计(第2版)1.获取表的列信息ResultSetMetaDatarsmd=results.getMetaData();rsmd.getColumnCount():获取数据项的个数rsmd.getColumnName(i):获取第i栏字段的名称17.3JDBC基本应用17.3.1数据库查询Java语言程序设计(第2版)2.遍历访问结果集(定位行)ResultSetrs=stmt.executeQuery(queryString);try{while(rs.next()){Strings=rs.getString(COF_NAME);floatn=rs.getFloat(PRICE);System.out.println(s++n);}}catch(SQLExceptionex){….}Java语言程序设计(第2版)访问当前行的数据项(具体列)getString(String):将指定名称的列内容作为字符串返回;getInt(String):将指定名称的列内容作为整数返回;getFloat(String):将指定列内容作为float型数返回;getDate(String):将指定列内容作为日期返回;getBoolean(String):将指定列内容作为布尔型数返回;getObject(String):将指定列内容返回为JavaObject。Strings=rs.getString(title);//按列名访问Strings=rs.getString(2);//按列序号访问,第1列为0选用方法取决于数据库中字段的数据类型Java语言程序设计(第2版)3.创建可滚动结果集publicStatementcreateStatement(intresultSetType,intresultSetConcurrency)其中:resultSetType代表结果集类型,包括如下情形:ResultSet.TYPE_FORWARD_ONLY:游标只能向后滚动;ResultSet.TYPE_SCROLL_INSENSITIVE:游标可以前后滚动,但结果集不随数据库内容的改变而变化;ResultSet.TYPE_SCROLL_SENSITIVE:可前后滚动,而且结果集与数据库的内容保持同步。resultSetConcurrency代表并发类型,取值包括:ResultSet.CONCUR_READ_ONLY:不能用结果集更新数据库表。ResultSet.CONCUR_UPDATABLE:结果集会引取数据库表内容的改变。Java语言程序设计(第2版)4.游标的移动与检查voidafterLast():移到最后一条记录的后面;voidbeforeFirst():移到第一条记录的前面;voidfirst():移到第一条记录;voidlast():移到最后一条记录;voidprevious():移到前一条记录处;voidnext():移到下一条记录。booleanisFirst():是否游标在第一个记录;booleanisLast():是否游标在最后一个记录;booleanisBeforeFirst():是否游标在最后一个记录之前booleanisAfterLast():是否游标在最后一个记录之后;intgetRow():返回当前游标所处行号,行号从1开始编号,如果结果集没有行,返回为空。booleanabsolute(introw):将游标指到参数row指定的行。如果row为负数,表示倒数行号,例如:absolute(-1)表示最后一行,游标在第一行前或最后一行之后时返回结果为0。Java语言程序设计(第2版)17.3.2数据库的更新importjava.sql.*;publicclassInsertStudent{publicstaticvoidmain(Stringargs[]){Stringurl=jdbc:odbc:mydata;try{Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);}catch(java.lang.ClassNotFoundExceptione){}try{Connectioncon=DriverManager.getConnection(url,,null);Statementstmt=con.createStatement();Stringsql=INSERTINTOstudent+VALUES('张三','男',DateValue('74/02/13'),True,20010845);stmt.executeUpdate(sql);【例17-4】执行INSERT语句实现数据写入。Java语言程序设计(第2版)【例17-4】(续)sql=INSERTINTOstudent+VALUES('李四','女',DateValue('78/12/03'),False,20010846);stmt.executeUpdate(sql);System.out.println(2Itemshavebeeninserted);stmt.close();con.close();}catch(SQLExceptionex){System.out.println(ex.getMessage());}}}Java语言程序设计(第2版)2.数据修改和数据删除要实现数据修改只要将SQL语句改用UPDATE语句即可,而删除则使用DELETE语句。例如