基于WEB的JAVA开发设计.ppt

上传人:牧羊曲112 文档编号:6262355 上传时间:2023-10-11 格式:PPT 页数:61 大小:301KB
返回 下载 相关 举报
基于WEB的JAVA开发设计.ppt_第1页
第1页 / 共61页
基于WEB的JAVA开发设计.ppt_第2页
第2页 / 共61页
基于WEB的JAVA开发设计.ppt_第3页
第3页 / 共61页
基于WEB的JAVA开发设计.ppt_第4页
第4页 / 共61页
基于WEB的JAVA开发设计.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《基于WEB的JAVA开发设计.ppt》由会员分享,可在线阅读,更多相关《基于WEB的JAVA开发设计.ppt(61页珍藏版)》请在三一办公上搜索。

1、1,基于WEB的JAVA开发设计-JDBC数据库访问,2,主要内容,JDBC简介JDBC驱动程序类型JDBC基本编程JDBC高级编程,3,JDBC简介,JDBC(Java Database Connectivity)是一组用来按照统一方式访问数据库的API。它向程序员提供了独立于数据库的统一接口,可以使开发人员不必考虑所用的特定数据库便可编写应用程序,实现了Java与数据库的互连。它能够:提供对数据库的跨平台存取无需知道数据库具体的位置无需要知道数据库实现的具体细节,4,5,JDBC驱动程序类型,6,TYPE 1,TYPE 1驱动程序:是JDBCODBC桥连接方式通常运行在Windows系统上

2、需要在客户机上安装ODBC驱动程序,7,TYPE 2,TYPE 2驱动程序:需要在客户机上安装所用数据对应的本地驱动(这些驱动通常是C或C+语言所编写的)。该驱动将JDBC对数据库的调用转换成数据库本地的API调用,8,TYPE 3,9,TYPE 3,网络服务可以采用多种技术来提高系统性能,这些服务包括:负载均衡缓存技术连接池技术容错机制,10,TYPE 4,TYPE 4是一种纯Java的驱动实现,他不需要任何客户端配置。这也是最为常见的数据库连接方式。,11,12,DriverManager,DriverManager类DriverManager(驱动程序管理器)类负责管理JDBC驱动程序。

3、在使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可使用,在程序中可以通过调用Class.forName()方法来完成。常用方法如下:Public static synchronized Connection getConnection(String url,String user,String password)throws SQLException获得url对应数据库的一个连接Public static void setLoginTimeout(int seconds)设置要进行数据库登录时驱动程序等待的延迟时间,13,Connection,Connec

4、tion接口Connection对象是通过DriverManager.getConnection()方法获得,代表与数据库的连接,也就是在已经加载的驱动程序和数据库之间建立连接。Connection接口是JSP编程中使用最频繁的接口之一。常用方法如下:Statement createStatement()throws SQLException创建一个Statement对象PrepareStatement prepareStatement(String sql)throws SQLException创建一个Preparestatement对象,并能把SQL语句提交到数据库进行预编译void se

5、tAutoCommit(Boolean autocommit)throws SQLException设置事务提交的模式void commit()throws SQLException提交对数据库的更改,使更改生效void rollback()throws SQLException放弃当前事务开始以来对数据库所作的修改,14,Statement,Statement接口Statement用来执行静态SQL语句。例如,执行insert、update、delete语句,可以调用executeUpdate(String sql)方法,执行select语句可以调用executeQuery(String s

6、ql)方法,该方法返回ResultSet对象。常用方法如下:ResultSet executeQuery(String sql)throws SQLException执行一个查询语句并返回结果集int executeUpdate(String sql)throws SQLException执行更新操作,返回更新的行数Boolean execute(String sql)throws SQLException执行更新或查询语句,返回是否有结果集,15,PreparedStatement,PreparedStatement接口PreparedStatement接口继承Statement接口,作为提

7、高性能的一条措施,PreparedStatement提供了可以与查询信息一起预编译的一种语句类型。,16,CallableStatement,CallableStatement是JDBC用来调用数据库中存储过程的机制具体的使用和PreparedStatement相似需要注意的是:要调用的存储过程必须在数据库中存在,否则将抛出异常,17,ResultSet,ResultSet接口在Statement执行SQL查询语句时,会返回ResultSet查询结果记录集。ResultSet接口提供了逐行访问这些记录的方法。常用方法如下:Boolean next()throws SQLException把当前

8、指针定位到下一行。注意,最初,ResultSet的指针位于第一行之前。void close()throws SQLException释放ResultSet对象资源ResultSet提供了getXXX()方法,用于获取当前行中某列的值,其中“XXX”与列的数据类型有关,例如,如要获取的列是String类型,则使用getString()方法获取该列的值。getXXX()方法如下所示:getString()getInt()getFloat()getDouble()getDate()getBoolean(),18,19,import java.sql.*TryClass.forName(oracle.

9、jdbc.driver.OracleDriver);String oraURL=“jdbc:oracle:thin:host:port:dbName”;Connection con=DriverManager.getConnection(oraURL,username,password);Statement statement=connection.createStatement();String query=SELECT name,pwd FROM sometable;ResultSet resultSet=statement.executeQuery(query);while(result

10、Set.next()name=resultSet.getString(1);phone=resultSet.getString(2);System.out.println(name+,+phone);resultSet.close();statement.close();con.close();catch(SQLException e),第一步,第二步,第三步,第四步,第五步,第六步,第七步,20,连接数据库的典型步骤,第一步:加载正确的数据库驱动程序为什么要加载如何加载);DriverManager.registerDriver(new oracle.jdbc.driver.OracleDr

11、iver();经过以上其中之一语句的声明后,驱动程序就会自动地加载。注意:如果classpath路径中没有找到所需的驱动程序则会抛出 ClassNotFoundException异常。,21,第二步,定义所要连接数据库的地址String ODBCURL“jdbc:odbc:dbName”;String oracleURL=jdbc:oracle:thin:host:port:dbName“;String mysqlURL=jdbc:mysql:/host:port/dbName“;String sqlURL“jdbc:microsoft:sqlserver:/host:1433;Databas

12、eName=dbName”;通过此步骤,定义要连接的数据库资源不同数据库连接的地址不同,这点需要特别注意,对弈一些常见的数据库连接地址,要求大家能够掌握。URL由3部分组成,各个部分用冒号间隔,格式如下:jdbc:JDBC URL的3部分可分解如下:jdbc:JDBC中的协议就是jdbc。:数据库驱动程序名或数据库连接机制的名称。子协议的典型示例为oracle,它用于连接oracle数据库。:一种标记数据库的方法。子名称根据子协议的不同而不同,使用子名称的目的是为定位数据库例如 jdbc:oracle:thin:ip:port:sid,22,第三步,建立与数据库的连接String userna

13、me=jay_debesee;String password=secret;Connection connection=DriverManager.getConnection(oracleURL,username,password);通过此步获得与数据库服务器的连接另外,数据库连接还可以使用连接属性信息,如下:Properties dbprops=new Properties();dbprops.put(user,sa);dbprops.put(password,);dbprops.put(server,DEMO);dbprops.put(“db,myDB);tryClass.forName(

14、weblogic.jdbc.mssqlserver4.Driver);Connectionconn=DriverManager.getConnection(jdbc:weblogic:mssqlserver4,dbprops);catch(Exception e).,23,第四步,创建语句对象Statement statement=connection.createStatement();第五步,声明SQL语句,并将该语句通过Statement对象提交给服务器进行执行。Stringsql=“SELECT*FROM ONTACT_TABLE”;ResultSet resultSet=statem

15、ent.executeQuery(sql);该语句将sql命令提交给数据库服务器进行执行,并将执行结果存储在ResultSet对象中进行执行。,24,Statement接口主要有如下三个方法:1.ResultSet executeQuery(String sql)用于执行查询语句,返回 ResultSet结果集(一个二维表)2.int executeUpdate(String sql)用于执行添加、删除或修改操作,返回被更新记录的条数3.boolean execute(String sql)执行参数部分的SQL语句;当SQL语句的执行结果是一个ResultSet结果集时,本方法返回true;并

16、可以通过StatementgetResultSet()方法得到返回的结果集 当SQL语句执行后没有返回的结果集时,该方法返回false,25,第六步:对查询结果进行分析while(resultSet.next()name=resultSet.getString(1);phone=resultSet.getString(2);System.out.println(name+,+phone);针对不同的类型调用不同的getXxx方法(getString(col),getDate(col),)通过指定列名或相对顺序的方式调用getXxx()方法对应列的内容获取出来(getString(String)

17、对结果集中的内容进行修改(updateString(col,val),)可以通过(first(),last(),previous(),next(),absolute(int),)方法浏览可滚动结果集中的内容支持多个结果集,26,Java数据类型和SQL数据类型之间的映射关系,27,第七步,关闭打开的资源resultSet.close();statement.close();connection.close();将打开的资源关闭。注意:资源关闭的顺序和打开的顺序恰恰相反。,28,JDBC-ODBC桥编程实例(Access数据库),创建Access数据库student,表info,字段id(整型)

18、,username(文本),pass(文本),name(文本),age(整型)具体步骤:建立ODBC数据源使用JDBC-ODBC驱动建立数据库连接插入/增加两条记录修改一条记录删除一条记录查询所有记录,29,info表结构,30,建立ODBC数据源,控制面板管理工具数据源(ODBC)系统DSN添加Microsoft Access Driver(*.mdb)数据源名student,选择刚才所创建的数据库,31,程序代码增加,32,程序代码修改,33,程序代码删除,34,程序代码查询,);rs.close();stmt.close();con.close();%,35,JDBC访问Oracle数据

19、库,打开Oracle的“企业管理器”,为scott用户添加DBA权限。然后在scott中建立一个表table1,该表的结构包括三个字段:name(varchar2)、sex(varchar2)、score(number)。创建成功后,在该表中插入几条测试数据:分别为:aaam66 bbbm73 cccf91 dddm85,36,部署Oracle驱动程序,在“Oracle安装目录/jdbc/lib/”下找到所需的驱动程序classes12.jar,并将其拷贝到当前应用的“/WEB-INF/lib”目录下然后重新启动tomcat服务,37,一个JDBC访问Oracle数据库的例子,38,);rs.

20、close();stmt.close();con.close();%,39,连接MySQL数据库和连接Oracle数据库的方法非常类似。只是有两个地方需要注意一下1).需要把MySQL的驱动程序部署到“/WEB-INF/lib/”下。(MySQL驱动程序可以从其官方网站上下载),连接MySQL数据库,40,2).注册驱动程序和获取连接的语句变为:Class.forName(com.mysql.jdbc.Driver);或者Class.forName();Connection con=DriverManager.getConnection(jdbc:mysql:/ip:port/sid,Logi

21、n,password);,密码,用户名,数据库名,IP地址,端口号,连接MySQL数据库,41,例:,MySQL数据库编程实例,42,连接SQL Server数据库同样和连接Oracle数据库相似。有两个地方需要注意一下1).需要把SQL Server的驱动程序mssqlserver.jarmsbase.jarmsutil.jar部署到“/WEB-INF/lib/”下。(SQL Server的驱动程序可以从微软的官方网站上下载),连接SQL Server数据库,43,2).注册驱动程序和获取连接的语句变为:Class.forName();Connection con=DriverManager

22、.getConnection(jdbc:sqlserver:/ip:port;databasename=sid,Login,password);,密码,用户名,数据库名,IP地址,端口号,连接SQL Server数据库,44,例:,SQL Server数据库编程实例,45,高级编程部分,在该部分,内容包括:事务的概念使用批处理更新使用PreparedStatement对象使用CallableStatement对象处理可滚动的结果集处理多个结果集处理元数据处理BLOB和CLOB使用事务隔离,46,事务,事务可以将一组SQL语句组成原子操作以保证数据的完整性默认情况下,JDBC使用auto-com

23、mit事务模型一个使用commit和rollabck的示例:Connection con=null;try Class.forName(COM.cloudscape.core.JDBCDriver);con=DriverManager.getConnection(jdbc:cloudscape:c:/PhoneBook);con.setAutoCommit(false);Statement statement=connection.createStatement();statement.executeUpdate(“UPDATE.”);.mit();catch(Exception e)if(n

24、ull!=con)con.rollback();.,47,批处理更新,批处理更新是同时执行多个语句的机制。要执行批处理,需要:按照正常的方式创建一个语句对象向语句对象中添加多个要执行的SQL语句执行批处理示例:Statement stmt=connection.createStatement();stmt.addBatch(insert into test values(.);stmt.addBatch(insert into test values(.);.stmt.executeBatch();,48,PreparedStatement,PreparedStatement 就是带有占位符的

25、SQL 语句 数据库对他们事先进行编译,因此,客户端需要做的只是传送占位符位置所需要的数据。而普通Statement的SQL语句,只有在程序运行时才对他们进行编译 因此PreparedStatement运行的速度更快。,49,PreparedStatement,示例1:PreparedStatement stmt=connection.prepareStatement(insert into test values(?,?);stmt.setString(1,”first value”);stmt.setString(2,”second value”);stmt.executeUpdate()

26、;stmt.setString(2,”new record,with different second value”);stmt.executeUpdate();,50,PreparedStatement,示例2:Connection connection=DriverManager.getConnection(url,user,password);PreparedStatement statement=connection.prepareStatement(UPDATE employees+SET salary=?+WHERE id=?);int newSalaries=getSalarie

27、s();int employeeIDs=getIDs();for(int i=0;iemployeeIDs.length;i+)statement.setInt(1,newSalariesi);statement.setInt(2,employeeIDsi);statement.executeUpdate();,51,CallableStatement,CallableStatement是JDBC用来调用数据库中存储过程的机制具体的使用和PreparedStatement相似需要注意的是:要调用的存储过程必须在数据库中存在,否则将抛出异常示例:CallableStatement stmt=co

28、nnection.prepareCall(“CALL GET_BOOKS(?,?);stmt.setString(1,”first value”);stmt.setString(2,”second value”);ResultSet books=stmt.execute();,52,可滚动的结果集,可滚动结果集是允许你在结果集中的不同行之间进行任意浏览的ResultSet对象。具体的操纵方式包括:使用next()和previous()分别向后和向前跳一行使用first()或last()方法直接跳到结果集中的第一行或最后一行。使用absolute(int)方法直接跳到结果集中指定的行使用rela

29、tive(int)方法向前或向后跳转指定的行数,53,可滚动的结果集,此外,你还可以使用其他方法:beforeFirst(),afterLast():将游标置于第一行之前或最后一行之后。isFirst(),isLast(),isBeforeFirst(),isAfterLast():告诉你游标是否指向指定的位置。而beforeFirst()and afterLast()方法告诉你是否还有更多的数据需要处理。,54,示例:Statement stmt=connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONC

30、UR_READ_ONLY);ResultSet books=stmt.executeQuery(“SELECT*FROM Books”);if(books.last()/this scrolls from the end backwardsdo/do something with this row while(books.previous(),55,为了使创建的结果集具有可滚动性,在创建Statement对象时需要使用指定的构建函数,该构建函数需要指定两个参数:支持滚动ResultSet.TYPE_FORWARD_ONLY(不支持滚动)ResultSet.TYPE_SCROLL_SENSITI

31、VE(支持滚动,当更新时,及时更新结果集中的内容)ResultSet.TYPE_SCROLL_INSENSITIVE(支持滚动,但当数据更新时,并不在本结果集中体现)支持并发ResultSet.CONCUR_READ_ONLY(禁用更新)ResultSet.CONCUR_UPDATABLE(允许更新),56,多个结果集,批处理和CallableStatement可能返回多个结果集你可以使用getResultSet()和getMoreResults()来对结果进行检索示例:stmt.addBatch(.);.stmt.executeBatch();do isAnUpdate=false;if(s

32、tmt.getUpdateCount()!=-1)isAnUpdate=true;/the operation was an update,skipelse ResultSet rs=stmt.getResultSet();/.do something with results while(stmt.getMoreResults()|isAnUpdate);/loop if more results or last operation was an update,57,处理元数据,元数据可以提供一些关于数据库结果的一些信息:数据库本身的信息DatabaseMetaData dbmd=conne

33、ction.getMetaData();单表的信息ResultSet tableRS=connection.getMetaData().getTables(null,null,”TableName”,null);结果集的信息ResultSetMetaData rsmd=resultSet.getMetaData();,58,使用MetaData的例子:Connection connection=null;Class.forName(COM.cloudscape.core.JDBCDriver);connection=DriverManager.getConnection(jdbc:clouds

34、cape:c:/PhoneBook);DatabaseMetaData dbmd=connection.getMetaData();String version=dbmd.getDriverVersion();System.out.println(“The driver version is:”+version);ResultSet aTable=dbmd.getTables(null,null,”b%”,null);String tablename=aTable.getString(“TABLE_NAME”);Statement statement=connection.createStat

35、ement();ResultSet rs=statement.executeQuery(“SELECT*from”+tablename);ResultSetMetaData rsmd=resultSet.getMetaData();String firstColumn=rsmd.getColumnName(1);System.out.println(“The first column is:”+firstColumn);,59,事务隔离,事务隔离级别可以控制当前数据访问的行为可以通过使用下面的语句来设置期望的级别:connection.setTransactionIsolation();这里的

36、取值可以为:Connection.TRANSACTION_NONE Connection.TRANSACTION_READ_UNCOMMITTED Connection.TRANSACTION_READ_COMMITTED Connection.TRANSACTION_REPEATABLE_READ Connection.TRANSACTION_SERIALIZABLE,60,二进制或字符大对象,JDBC支持读取以及写入大对象数据读取大对象数据:java.sql.Blob aBlob;java.sql.Clob aClob;ResultSet rs=statement.executeQuery

37、(“.”);while(rs.next()aBlob=rs.getBlob(columnName or columnNumber);InputStream inBlob=aBlob.getBinaryStream();aClob=rs.getClob(columnName or columnNumber);InputStream is=aClob.getAsciiStream(),61,二进制或字符大对象,写入大对象数据PreparedStatement stmt=connections.preparedStatment(“update BlobTable set BlobClmn=?,ClobClmn=?where key=?);java.sql.Blob aBlob=;java.sql.Clob aClob=;stmt.setBlob(1,aBlob);stmt.setClob(2,aClob);stmt.setString(3,keyValue)stmt.execute();,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号