《第六章JSP连接数据库.ppt》由会员分享,可在线阅读,更多相关《第六章JSP连接数据库.ppt(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六章第六章 连接数据库连接数据库JDBC概述JDBC的常用编程接口在JavaBean中连接数据库连接到不同的数据库JDBC概述nJDBC(JavaDatabaseConnectivity):Java数据库连接,定义Java程序如何与数据库交互。n是Java程序与数据库系统通信的标准API,由一组用Java语言编写的类和接口组成,包括两个包,见P107。nJDBC使程序的开发独立于数据库产品的选择。nJDBC的结构nJDBC驱动程序nJDBCURLJDBC的结构Java应用程序JDBCAPIJDBC驱动程序管理器JDBC驱动程序JDBC驱动程序JDBC驱动程序数据库数据库数据库文字说明见P10
2、7P108JDBC驱动程序n分为4种类型 P108109nJDBC-ODBC桥n部分Java、部分本机驱动程序n中间数据访问服务器n纯Java驱动程序n使用第3、4类驱动程序是从JDBC访问数据库的首选方法,现在越来越多的数据库厂商都提供其数据库的纯JDBC驱动程序。JDBCURLnJDBCURL提供了一种标识数据库驱动程序与数据源的方法。nJDBCURL的标准语法见P115n一些例子n要连接到某种数据库,一是要找到相应的JDBC驱动程序并放好相应的jar包,二是要知道JDBC驱动程序的类名以便加载,三是要掌握它的JDBCURL格式。JDBCURL的一些例子njdbc:mysql:/local
3、host:3306/jsp_dbnjdbc:mysql:/127.0.0.1:3306/jsp_db?user=root&password=1234njdbc:odbc:mydatasourcenjdbc:odbc:driver=MicrosoftAccessDriver(*.mdb);DBQ=student.mdbnjdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=goodsc12;User=sa;Password=123456njdbc:oracle:thin:127.0.0.1:1521:orclnjdbc:db2:/127.0.
4、0.1:5000/sampleJDBC驱动程序的位置n如果是本地运行的Java应用程序要用到JDBC驱动程序,可把相应的jar包放在任意位置,然后设置好CLASSPATH环境变量就行了。n有些IDE工具(如JCreator、MyEclipse等)未必读取CLASSPATH环境变量,需要用菜单把相应的jar包添加进JDK配置中来。n如果是Tomcat中的Web应用程序要用到JDBC驱动程序,就应该把相应的jar包放在%CATALINA_HOME%commonlib目录中。JDBC驱动程序的类名的例ncom.mysql.jdbc.Drivernsun.jdbc.odbc.JdbcOdbcDrive
5、rncom.microsoft.jdbc.sqlserver.SQLServerDrivernoracle.jdbc.driver.OracleDriverncom.ibm.db2.jdbc.app.DB2DriverJDBC的常用编程接口njava.sql包中定义了很多类和接口,以方便Java应用程序开发者编写访问数据库的程序。n用JDBC连接数据库存取数据的步骤njava.sql中重要的类和接口n简单增、改、删的例:P113P114例6-1,testdb_update.jsp,testdb_delete.jsp。n用结果集处理查询结果的例:testdb_rs.jspn使用PreparedS
6、tatement的例:P117P121例6-2。用JDBC连接数据库存取数据n为了举例,先在MySQL的jsp_db数据库中建立student表,并插入一些数据,脚本文件是student.sql。n用JDBC连接数据库存取数据时,执行以下步骤:n加载JDBC驱动程序并向DriverManager注册;n用JDBCURL定义驱动程序与数据源之间的连接,并且建立一个连接(Connection)对象;n建立一个SQL语句(Statement)对象,并且利用它来执行SQL语句。n(处理查询语句所返回的结果集ResultSet)n关闭语句和连接n访问数据库的语句需包含在try语句块中数据库脚本文件stu
7、dent.sqlDROPDATABASEIFEXISTSjsp_db;CREATEDATABASEjsp_db;USEjsp_db;DROPTABLEIFEXISTSstudent;CREATETABLEstudent(sidvarchar(20)NOTNULL,namevarchar(30)defaultNULL,sexint(1)defaultNULL,phonevarchar(16)defaultNULL,birthdatedefaultNULL,Constraintprimarykeypk_student(sid)ENGINE=InnoDBDEFAULTCHARSET=gb2312;I
8、NSERTINTOstudentvalues(20080101,陈瀚海,1,020-84441010,1990/12/22);INSERTINTOstudentvalues(20080102,林妙茹,0,020-68957135,1990/6/8);INSERTINTOstudentvalues(20080201,张可欣,0,020-81873523,1990/4/26);INSERTINTOstudentvalues(20080202,王家驹,1,020-38642652,1990/2/22);INSERTINTOstudentvalues(20080203,程亦菲,0,020-657822
9、35,1990/9/3);数据库脚本文件的执行数据库脚本文件的执行nstudent.sql是在P113例6-1的基础上加了些语句。假设它放在d:sql目录中。n执行数据库脚本文件的步骤:n开始所有程序MySQLMySQLServer5.0MySQLServerCommandLineClientn输入根用户root的口令1234n键入命令:sourced:sqlstudent.sqln查看结果可键入命令:select*fromstudent;或开始所有程序MySQLMySQLAdministratorn如果安装MySQL时没有设置默认字符集是gbk,执行数据库脚本文件时可能会报告错误信息,显示不
10、正确的字符串值(其实是中文),这时可以在脚本文件的最前面加一行:/*!40101SETNAMESgb2312*/;testdb_update.jsp在JSP中使用JDBC连接MYSQL数据库并更新数据testdb_delete.jsp在JSP中使用JDBC连接MYSQL数据库并删除记录testdb_rs.jsp全部的学生数据学号姓名性别电话出生日期java.sql中重要的类和接口njava.sql中重要的类和接口包括:njava.sql.DriverManager类njava.sql.Connection接口njava.sql.Statement接口njava.sql.ResultSet接口n
11、java.sql.PreparedStatement接口njava.sql.CallableStatement接口java.sql.DriverManager类nDriverManager类负责管理JDBC驱动程序n各种JDBC驱动程序都必须实现java.sql.Driver接口,在加载某JDBC驱动程序类时,它会创建自己的实例并向DriverManager注册该实例,这可用Class.forName()实现。例:Class.forName(com.mysql.jdbc.Driver).newInstance();n加载并注册JDBC驱动程序后,就可用DriverManager类的getCon
12、nection()方法与数据库建立连接,例:nConnectioncon=DriverManager.getConnection(jdbc:mysql:/127.0.0.1:3306/jsp_db?user=root&password=1234);nConnectionconn=DriverManager.getConnection(jdbc:mysql:/127.0.0.1:3306/jsp_db,root,“1234);java.sql.Connection接口nConnection对象通过DriverManager.getConnection()方法得到,代表与数据库的连接,包含维持该连
13、接的所有信息,并提供关于这个连接的方法。nConnection的常用方法n方法调用的例子java.sql.Connection常用方法n常用方法见P111n默认情况下,新连接处于自动提交模式。也就是说,当执行完语句后,将自动调用commit()方法,因此一个事务只由一个语句组成。如果禁止自动提交,事务将要等到commit()或rollback()方法被显式调用时才结束。nStatementcreateStatement(intresultSetType,intresultSetConcurrency)throwsSQLExceptionnbooleangetAutoCommit()throws
14、SQLExceptionnvoidclose()throwsSQLExceptionnbooleanisClosed()throwsSQLExceptionnCallableStatementprepareCall(Stringsql)throwsSQLException调用Connection对象的方法nConnectioncon=DriverManager.getConnection(jdbc:mysql:/127.0.0.1:3306/jsp_db?user=root&password=1234);Statementstmt=con.createStatement();nConnecti
15、oncon=DriverManager.getConnection(jdbc:mysql:/127.0.0.1:3306/jsp_db?user=root&password=1234);PreparedStatementstmt=con.prepareStatement(insertintostudent(sid,name,sex,phone,birth)values(?,?,?,?,?);java.sql.Statement接口nStatement对象通过Connection对象的createStatement()方法得到,如:Statementstmt=con.createStatemen
16、t();n用于执行不带参数的静态SQL语句。常用方法见P111及P115n方法executeUpdate()返回更新的行数,对于CREATETABLE等返回0。P113P115例n方法execute()还用于执行可能返回多个结果集的存储过程。执行完毕后,使用方法getResultSet()或getUpdateCount()来检索结果,使用getMoreResults()来取得后续结果。nvoidclose()throwsSQLException关闭Statement对象,会导致其ResultSet对象同时关闭。一般来说,使用完后立即释放资源是一个好习惯,这样可以避免对数据库资源的占用。java
17、.sql.PreparedStatement接口nPreparedStatement对象通过Connection对象的prepareStatement()方法得到,如:PrepareStatementpstmt=con.prepareStatement(insertintostudent(sid,name,sex,phone,birth)values(?,?,?,?,?)n继承Statement接口,用于执行带或不带参数的预编译SQL语句,这种SQL语句可以在程序中动态改变参数。nP111P112n除了继承Statement接口的方法外,还定义了不带参数的executeQuery()、exec
18、uteUpdate()、execute()方法;还提供了用于指定参数值的方法,常用的有,参数从1开始。指定参数值的方法nvoidsetNull(intindex,intsqlType)throwsSQLExceptionnvoidsetBoolean(intindex,booleanx)throwsSQLExceptionnvoidsetByte(intindex,bytex)throwsSQLExceptionnvoidsetShort(intindex,shortx)throwsSQLExceptionnvoidsetInt(intindex,intx)throwsSQLException
19、nvoidsetLong(intindex,longx)throwsSQLExceptionnvoidsetFloat(intindex,floatx)throwsSQLExceptionnvoidsetDouble(intindex,doublex)throwsSQLExceptionnvoidsetString(intindex,Stringx)throwsSQLExceptionnvoidsetDate(intindex,java.sql.Datex)throwsSQLExceptionnvoidsetTime(intindex,java.sql.Timex)throwsSQLExcep
20、tionnvoidsetTimestamp(intindex,java.sql.Timestampx)throwsSQLExceptionjava.sql.TypesnPreparedStatement的方法voidsetNull(intindex,intsqlType)throwsSQLException用于将指定参数设置为SQLNULL。此方法的第二个参数是java.sql.Types中定义的SQL类型码,如Types.ARRAY、Types.BIGINT、Types.BINARY、Types.BIT、Types.BOOLEAN、Types.CHAR、Types.DATE、Types.DE
21、CIMAL、Types.DOUBLE、Types.FLOAT、Types.INTEGER、Types.NULL、Types.NUMERIC、Types.REAL、Types.SMALLINT、Types.TIME、Types.TIMESTAMP、Types.VARBINARY、Types.VARCHAR等。java.sql.Datenjava.sql.Date类与java.util.Date类不同。njava.sql.Date类最常用的方法是:npublicStringtoString()/以yyyy-mm-dd的日期格式返回字符串npublicstaticDatevalueOf(String
22、s)/把以“yyyy-mm-dd”形式的字符串转为Date对象npublicvoidsetTime(longdate)/使用给定毫秒时间值设置当前Date对象java.sql.Timenjava.sql.Time类最常用的方法是:npublicStringtoString()/以hh:mm:ss的时间格式返回字符串npublicstaticTimevalueOf(Strings)/把以“hh:mm:ss”形式的字符串转为Time对象java.sql.Timestampnjava.sql.Timestamp类最常用的方法是:npublicStringtoString()/以yyyy-mm-ddh
23、h:mm:ss.fffffffff的格式返回字符串,其中fffffffff是毫微秒数npublicstaticDatestampvalueOf(Strings)/把以“yyyy-mm-ddhh:mm:ss.fffffffff”形式的字符串转为Timestamp对象npublicvoidsetTime(longtime)/使用给定毫秒时间值设置当前对象npubliclonggetTime()java.sql.ResultSet接口njava.sql.ResultSet是查询结果记录集,提供了逐行访问记录的方法。n每个ResultSet对象都包含一个游标(或称记录指针)。查询语句执行完毕时,游标位
24、于第一行之前,可用next()方法移到下一行。当游标已在最后一行,若再执行next()会返回false并定位到最后一行之后。n结果集的游标类型与可写性nResultSet的常用方法有:n移动记录指针的方法n判断记录指针位置的方法n读取记录中某字段的方法n更改记录中某字段的方法n修改数据库的方法n其它方法结果集的游标类型与可写性n默认设置是结果集不可写且游标只能逐行后移。因此,结果集中的记录只能按从第一行到最后一行的顺序被访问一次。n在JDBC2.0中,结果集可更改,可影响数据库,且游标可前后移动(可滚动)。Connection的方法StatementcreateStatement(intres
25、ultSetType,intresultSetConcurrency)throwsSQLException的两个参数分别说明结果集的游标类型与可写性。n例如:以下代码片段生成可滚动且可更新的结果集:Statementstmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);说明结果集的类型nresultSetType可以是以下常量之一:nResultSet.TYPE_FORWARD_ONLY:游标只能逐行后移nResultSet.TYPE_SCROLL_INSENSITIVE:游
26、标可滚动且不受其它更改的影响nResultSet.TYPE_SCROLL_SENSITIVE:游标可滚动且受其它更改的影响nresultSetConcurrency可以是以下常量之一:nResultSet.CONCUR_READ_ONLYnResultSet.CONCUR_UPDATABLE移动记录指针的方法(1)nboolean first()throws SQLException/移到第一行。如果指针位于有效行,则返回true;如果结果集中不存在任何行,则返回false。如果发生数据库访问错误或者结果集类型为 ResultSet.TYPE_FORWARD_ONLY则抛出异常nboolean
27、 last()throws SQLException/返回值与抛出异常情况类似first()方法nvoid beforeFirst()throws SQLException/抛出异常情况类似first()方法nvoid afterLast()throws SQLException/抛出异常情况类似first()方法下一页移动记录指针的方法(2)nboolean previous()throws SQLException/如果指针位于有效行上,则返回true;如果它不在结果集中,则返回false。抛出异常情况类似first()方法。nboolean next()throws SQLExcepti
28、on/返回值类似previous()方法。数据库访问错误会抛出异常。nboolean absolute(introw)throws SQLException/将指针移动到指定编号的行,详细说明见nboolean relative(introws)throws SQLException/按相对行数(或正或负)移动指针,详细说明见上一页下一页移动记录指针的方法(3)nvoidmoveToInsertRow()throwsSQLException/将指针移到插入行。插入行是一个与可更新结果集相关联的特殊行。它实际上是一个缓冲区,在将行插入到结果集前可以通过调用updateXxx方法在其中构造新行。当
29、指针位于插入行上时,仅能调用updateXxx方法、getXxx方法以及insertRow方法。每次在调用insertRow之前,必须为所有列分配值。在对列值调用getXxx方法之前,必须调用UpdateXxx方法。上一页absolute()方法n如果行号为正,则将指针移动到相对于结果集开头的指定编号行。第一行为行1,第二行为行2,依此类推。n如果给定行号为负,则将指针移动到相对于结果集末尾的绝对行位置。例如,absolute(-1)将指针置于最后一行;absolute(-2)将指针移动到倒数第二行,依此类推。n试图将指针置于结果集的第一行/最后一行之外将导致指针位于第一行之前或最后一行之后。
30、nabsolute(1)等效于first(),absolute(-1)等效于last()。n返回结果与抛出异常情况类似previous()方法。relative()方法n试图移动到结果集的第一行/最后一行之外,会将指针置于第一行之前或最后一行之后。n调用relative(0)有效,但是不更改指针位置。nrelative(1)等效于next(),而relative(-1)等效于previous()。n返回结果类似previous()方法。n如果发生数据库访问错误、不存在当前行或者结果集类型为ResultSet.TYPE_FORWARD_ONLY时抛出异常。判断记录指针位置的方法nboolean
31、isFirst()throws SQLExceptionnboolean isLast()throws SQLExceptionnboolean isBeforeFirst()throws SQLExceptionnboolean isAfterLast()throws SQLException读取记录中某字段的方法nintgetInt(intcolumnIndex)throwsSQLException/以int的形式读取结果集中当前行指定列(列号从1开始)的值。如果值为SQLNULL,则返回值为0nintgetInt(StringcolumnName)throwsSQLException/以
32、int的形式读取结果集中当前行指定列的值,用于读取指定列的列名不区分大小写。如果值为SQLNULL,则返回值为0nResultSet提供了多个getXxx()方法读取字段值,如getBoolean、getByte、getDate、getDouble、getFloat、getLong、getShort、getString、getTime、getTimestamp等等,这些方法可用列序号或列名作参数。n当调用getXxx()方法时,JDBC驱动程序会尝试将底层数据转换为指定的Java类型。JDBC规范有一个表,说明允许的类型转换关系。因此,getXxx()方法中的Xxx类型可与原来不同。例如,原来
33、是日期型,却调用getString()来读取也是可以的。nvoid updateInt(intcolumnIndex,intx)throws SQLException/用int值更新结果集的当前行或插入行的指定列,并不会更新底层数据库;更新数据库要调用updateRow或insertRow方法。nvoid updateInt(StringcolumnName,intx)throws SQLExceptionnResultSet提供了多个updateXxx()方法读取字段值,如updateBoolean、updateByte、updateDate、updateDouble、updateFloat
34、、updateLong、updateShort、updateString、updateTime、updateTimestamp等等,这些方法可用字段名或字段序号作参数。更改记录中某字段的方法nvoidinsertRow()throwsSQLException/将插入行的内容插入到此ResultSet对象和数据库中。调用此方法时,指针必须位于插入行上。如果发生数据库访问错误,或指针不位于插入行上时调用此方法,或插入行中所有不可为null的列中还存在未分配值的列,将抛出异常。例nvoidupdateRow()throwsSQLException/用当前行的新内容更新底层数据库,指针位于插入行时不能
35、调用此方法。如果发生数据库访问错误或者指针位于插入行上,将抛出异常。例nvoiddeleteRow()throwsSQLException/从ResultSet对象和底层数据库中删除当前行。指针位于插入行时不能调用此方法。抛出异常的情况类似updateRow方法。nvoidcancelRowUpdates()throwsSQLException/取消对当前行所作的更新。此方法在调用updateXxx方法之后,但在调用updateRow方法之前调用,才可以回滚对行所作的更新。抛出异常的情况类似updateRow方法。n尽量用SQL语句来修改数据库修改数据库的方法尽量用SQL语句来修改数据库n虽然
36、在JDBC2.0中,可把结果集设置为可更新,从而修改数据库可有两种方法:n一是用Statement对象的executeUpdate()方法来执行标准SQL的INSERT、UPDATE、DELETE语句;n二是用Statement对象的executeQuery()方法得到可更新的结果集,然后通过修改结果集来更新底层数据库。n应该尽量用第一种方法insertRow方法的例rs.moveToInsertRow();rs.updateString(1,AINSWORTH);rs.updateInt(2,35);rs.updateBoolean(3,true);rs.insertRow();update
37、Row方法的例rs.absolute(5);rs.updateString(NAME,AINSWORTH);rs.updateRow();其它方法nintfindColumn(StringcolumnName)throwsSQLException/将给定的列名称映射为列索引。如果不包含columnName或者发生数据库访问错误时抛出异常。nintgetRow()throwsSQLException/返回当前行行号nbooleanwasNull()throwsSQLException/在使用了getXxx()方法后,使用本方法来查看最后一个读取的列是否具有值SQLNULLnvoidclose()
38、throwsSQLException/关闭结果集,释放相关资源。除调用close()方法外,当生成ResultSet对象的Statement对象关闭、重新执行或用来从多个结果中检索下一个结果时,ResultSet对象会自动关闭。java.sql.CallableStatement接口n是执行SQL存储过程的接口。在JavaBean中连接数据库n由于数据库操作需要编写较多的Java程序代码,放在JSP文件中会影响网页的可读性和可维护性。因此通常用JavaBean来封装数据库操作,在JSP网页中使用相应的JavaBean对象。n课本P121P128的例用到了3个JavaBean类。其中,Stude
39、nt类用来封装学生实体对象,DataBaseConnection类用来封装连接数据库的操作,StudentUtil类用来封装对数据库的增、删、改、查等操作。连接到不同的数据库n连接到SQLServerP131P132n连接到Access。例,testaccess.jsp。n连接到ODBC数据源。n需要创建ODBC数据源。例如,已经有student.mdb文件,用控制面板管理工具数据源(ODBC)系统DSN添加MicrosoftAccessDirver,给数据源命名(这里命名为student),选择数据库文件n程序的例见testodbc.jsptestaccess.jsp全部的学生数据学号姓名性别电话出生日期testodbc.jsp全部的学生数据学号姓名性别电话出生日期