Chapter7JSP与JDBC数据库连接一、数据库的连接二、结果集的操作三、数据操纵一、数据库的连接1、数据库连接2、Java程序的数据库连接3、使用JDBC-ODBC桥连接、访问数据库1、数据库连接数据库连接一般有3种方法:利用ODBC专用驱动程序利用数据库厂家提供的函数库,直接编程。连接效率增高2、Java程序的数据库连接什么是JDBC?JavaDataBaseConnectivity,又称Java数据库连接技术。它以ODBC为基础,对ODBCAPI进行了面向对象的封装和重新设计。2、Java程序的数据库连接JDBC连接数据库JDBC支持如下2种方法连接数据库:ODBC专用驱动程序JDBC特点JDBC是一种低级API,直接调用SQL命令,因此性能极佳。JDBC也在相当高层提供了功能强大的对象来处理数据库,它易于学习和使用。2、Java程序的数据库连接(1)JDBC的任务主要完成如下三件事:与数据库建立连接向数据库发送SQL语句处理数据库返回的结果2、Java程序的数据库连接(2)为什么不直接使用ODBC?ODBC不适合在Java中直接使用:ODBC是一个C语言实现的API,从Java中调用本地的C程序在安全性、完整性、健壮性方面都有缺点。无法精确实现从ODBCAPI到JavaAPI的翻译(语言的限制:指针支持)。ODBC很难学不再是纯Java3、使用JDBC-ODBC桥连接、访问数据库ODBC驱动程序被广泛使用,JDBC提供了利用ODBC驱动程序(即JDBC-ODBC桥)访问数据库的方法。这种方法适用于企业内部网和三层结构中的应用服务器代码。3、使用JDBC-ODBC桥连接、访问数据库(1)注册、加载驱动程序//显式注册DriverManager.registerDriver(sun.jdbc.odbc.JdbcOdbcDriver);//隐式注册Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);说明:Class是包java.sql中的一个类,通过调用它的静态方法forName就能建立JDBC-ODBC桥接器了。3、使用JDBC-ODBC桥连接、访问数据库(2)建立连接Connectionconn=DriverManager.getConnection(jdbc:odbc:数据源,帐户,口令);例:Connectionconn=DriverManager.getConnection(jdbc:odbc:sample);说明:Connection是java.sql包中的一个类通过调用DriverManager的静态方法getConnection可以创建Connection对象。对于Access数据库,帐号、口令可以省略不写。3、使用JDBC-ODBC桥连接、访问数据库(3)向数据库发送SQL及处理结果//创建Statement对象Statementstmt=conn.createStatement();//建立结果集ResultSetrs=stmt.executeQuery(select*fromstudent);说明:一个Statement对象只能打开一个结果集。3、使用JDBC-ODBC桥连接、访问数据库(4)结果集的访问while(rs.next()){out.print(学号:+rs.getString(1));out.print(姓名:+rs.getString(2));……out.print(BR);}说明:结果集的next()方法返回一个boolean值,当有记录时,返回true,否则返回false。二、结果集的操作1、ResultSet对象2、获取ResultSet中的数据3、结果集记录的随机访问1、ResultSet对象ResultSet结果集对象,它非常类似于数据库中的cursor。二者都具有下列特点对应一个SELECT语句通过指针访问记录外部的修改可以实时地反映到结果集中可通过修改结果集,修改表中的数据2、获取ResultSet中的数据ResultSet对象提供了访问其数据的方法,具体如下:getString()、getBoolean()、getInt()、getLong()、getFloat()、getDouble()、getDate()、getTime()、getByte()、getBytes()此外,还提供了获取当前行号的方法getRow()2、获取ResultSet中的数据【参数】以getString()为例,可以使用2中参数getString(字段名)getString(字段序号)例:rs.getString(name)、rs.getString(1)【参数说明】字段序号——结果集中的字段序号对于指针的一次移动,所指向记录的字段不能被读取2次2、获取ResultSet中的数据Question:对于下面2条SQL语句生成的结果集,调用rs.getString(1)获得的数据是否一样?SELECT*FROMstudentSELECTclass,name,stuNoFROMstudent2、获取ResultSet中的数据【补充】ResultSetMetaData元数据对象,通过它可获得表结构方面的数据。它提供了下列2个有用的方法:getColumnCount()——获得列数getColumnName(i)——获得列名说明:所谓元数据就是“关于数据的数据”。2、获取ResultSet中的数据【补充】例:元数据对象的创建使用ResultSetrs=stmt.executeQuery(strsql);ResultSetMetaDatarmd=rs.getMetaData();intn=rmd.getColumnCount();while(rs.next()){for(i=0;in;i++){out.print(rmd.getColumnName(i+1)+:);out.print(rs.getString(i+1));}out.print(br);}3、结果集记录的随机访问前面介绍的结果集只能从头至尾访问记录,如何随机访问呢?这需要从Statement对象的定义入手。Statementstmt=conn.createStatement(指针类型,数据一致性参数);说明:方法中的2个参数都是int型,但通常我们都用字符串常数来表示。3、结果集记录的随机访问指针类型参数:值说明ResultSet.TYPE_FORWARD_ONLY默认。单向ResultSet.TYPE_SCROLL_SENSITIVE双向,反映实时改动ResultSet.TYPE_SCROLL_INSENSITIVE双向,不反映实时改动3、结果集记录的随机访问数据一致性参数值说明ResultSet.CONCUR_READ_ONLY默认。只读ResultSet.CONCUR_UPDATEABLE可修改3、结果集记录的随机访问示例:Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);Stringsql=“Select*Fromstudent;ResultSetrs=stmt.ExecuteQuery(sql);rs.afterLast();//指针移至最后longn=rs.getRow();rs.previous();//指针前移rs.close();stmt.close();3、结果集记录的随机访问移动指针next()——指针后移previous()——指针前移first()last()beforeFirst——第一条之前afterLast()——最后一条之后3、结果集记录的随机访问【练习1】输出本班学生记录,每条记录前加上序号【练习2】输出student表中各班的人数。三、数据操纵1、executeUpdate()方法2、操纵数据1、executeUpdate()方法Statement对象提供了2种方法,分别用于执行查询和数据修改。stmt.executeQuery()stmt.executeUpdate()前者只适用于Select语句,后者可以执行Delete、Insert、Update语句,甚至还支持CreateTable等创建对象的操作。1、executeUpdate()方法executeUpdate()的返回值与executeQuery()不同,executeUpdate()方法返回的是一个long型值,表示更新操作所影响的行数。例如:一个删除语句删除了5条记录,则返回值为5一个插入语句的返回值为1或0(插入不成功)。2、操纵数据(1)删除longrtn=0;Stringsql=DeleteFromstudentWhereclass='04网络4';rtn=stmt.executeUpdate(sql);if(rtn=0)out.print(删除失败br);elseout.print(删除了+rtn+条记录br);注意:不要省略From2、操纵数据(2)插入longrtn=0;Stringsql=InsertIntostudent(stuNo,name,class)Values('04402150','张睿','04网络4');rtn=stmt.executeUpdate(sql);if(rtn=0)out.print(插入失败br);elseout.print(插入了+rtn+条记录br);注意:不要省略Into2、操纵数据(3)更新longrtn=0;Stringsql=UpdatestudentSetclass='04网络2'WherestuNo='04402150');rtn=stmt.executeUpdate(sql);if(rtn=0)out.print(更新失败br);elseout.print(更新了+rtn+条记录br);2、操纵数据【练习1】试对student表作如下操作插入新学生李宏,学号03640120,班级04网络1李宏转到2班李宏退学了【练习2】连接到sample数据库,创建一个新表teacher(id,name,dept),添加3条数据,输出记录。