07JDBC数据库访问

上传人:一*** 文档编号:243074568 上传时间:2024-09-15 格式:PPT 页数:119 大小:1.52MB
返回 下载 相关 举报
07JDBC数据库访问_第1页
第1页 / 共119页
07JDBC数据库访问_第2页
第2页 / 共119页
07JDBC数据库访问_第3页
第3页 / 共119页
点击查看更多>>
资源描述
,单击此处编辑母版文本样式,第二级,第三级,单击此处编辑母版标题样式,Java Web,编程技术,第,7,章,JDBC,数据库访问,7.1,数据库简介,7.2 Java,数据库技术概述,7.3,传统的数据库连接方法,7.4 JDBC API,介绍,7.5,访问数据库元数据,(,自学,),7.6,预处理语句,7.7,使用数据源连接数据库,(,自学,),7.8 DAO,设计模式介绍,7.9,可调用语句,7.10,事务处理,(,自学,),7.1,数据库简介,PostgreSQL,MySQL,SQL Server,ORACLE,7.1.1 PostgreSQL,数据库简介,PostgreSQL,是对象关系型数据库管理系统,(ORDBMS),它起源于伯克利,(BSD),的数据库研究计划,目前是最重要的开源数据库产品开发项目之一,有着非常广泛的用户,PostgreSQL,支持事务、子查询、多版本并发控制、数据完整性检查等特性,并且支持多语言的应用开发,能在包括,Linux,、,FreeBSD,和,Windows,等多种平台下运行,PostgreSQL,的下载和安装,计算机系统必须满足下面要求:,CPU,:,Intel,或,AMD,的,32,位或,64,位,CPU,。,操作系统:,Windows,、,Linux,、,FreeBSD(UNIX),、,MAC,。,磁盘格式:文件系统为,NTFS,格式。,用户:以系统管理员身份安装,PostgreSQL,。,目前的最新版本是,9.1.3,版。,下载地址:, III,操作数据库,在数据库名,模式,public,数据表下查看或新建数据表,使用工具,查询工具,查询数据库数据,7.1.2 MySQL,数据库简介,MySQL,是目前最为流行的开放源代码的数据库,是完全网络化的跨平台的关系型数据库系统,它是由瑞典的,MySQL AB,公司(开发人,Michael Widenius and David Axmark,)于,1995,年开始发布,2008,年,2,月,26,日,,Sun,公司并购,MySQL AB,公司,,2010,年,1,月,27,日,,Oracle,公司并购了,Sun,公司,现在,MySQL,属于,Oracle,。,版本:开源版,MySql5.5,,企业服务器版,MySql5.6,,集群版,MySql7.1,下载地址, MySQL,数据库简介,一种完全免费的产品,被广泛地应用在中小型网站和管理系统中,具有功能强大、支持跨平台、运行速度快、支持面向对象、安全性高、成本低、支持各种开发语言、数据存储量大、支持强大的内置函数等特点,能在包括,Linux,、,FreeBSD,和,Windows,等多种平台下运行,用,SQLyog,工具管理,MySQL,数据库,下载地址,7.1.3 SQL Server,数据库简介,SQL Server,是由,Microsoft,开发和推广的关系数据库管理系统(,DBMS,),提供了一个可靠的、高效的、智能化的数据平台,经历,7.0,,,2000,,,2005,,,2008,等版本,,其中,SQL Server 2008,分为,SQL Server 2008,企业版、标准版、工作组版、,Web,版、开发者版、,Express,版(免费)、,Compact 3.5,版,SQL Server 2008,企业版,是一个全面的数据管理和业务智能平台,为关键业务应用提供了企业级的可扩展性、数据仓库、安全、高级分析和报表支持。,SQL Server 2008,标准版,是一个完整的数据管理和业务智能平台,为部门级应用提供了最佳的易用性和可管理特性。,SQL Server 2008,工作组版,是一个值得信赖的数据管理和报表平台,用以实现安全的发布、远程同步和对运行分支应用的管理能力。 这一版本拥有核心的数据库特性,可以很容易地升级到标准版或企业版。,SQL Server 2008,Web,版,是针对运行于,Windows,服务器中要求高可用、面向,Internet Web,服务的环境而设计。这一版本为实现低成本、大规模、高可用性的,Web,应用或客户托管解决方案提供了必要的支持工具。,SQL Server 2008,开发者版,允许开发人员构建和测试基于,SQL Server,的任意类型应用。这一版本拥有所有企业版的特性,但只限于在开发、测试和演示中使用。基于这一版本开发的应用和数据库可以很容易地升级到企业版。,7.1.3 SQL Server,数据库简介,SQL Server 2008,Express,版,是,SQL Server,的一个免费版本,它拥有核心的数据库功能,其中包括了,SQL Server 2008,中最新的数据类型,但它是,SQL Server,的一个微型版本。这一版本是为了学习、创建桌面应用和小型服务器应用而发布的。,SQL Server,Compact,是一个针对开发人员而设计的免费嵌入式数据库,这一版本的意图是构建独立、仅有少量连接需求的移动设备、桌面和,Web,客户端应用。,SQL Server Compact,可以运行于所有的微软,Windows,平台之上,包括,Windows XP,和,Windows Vista,操作系统,以及,Pocket PC,和,SmartPhone,设备。,7.1.3 SQL Server,数据库简介,在配置工具,Sql Server,配置管理器中启动,Sql Server2008,服务,用,Sql Server management,studio,打开,Sql Server2008,控制台,7.1.4 ORACLE,数据库,Oracle,是目前关系型数据库管理系统市场中应用最广泛的产品,最新的,Oracle,版本是,Oracle 11g,劳伦斯,埃里森,和他的朋友,Bob Miner,和,Ed Oates,在,1977,年建立了软件开发实验室咨询公司(,SDL,,,Software Development Laboratories,)。,SDL,开发了,Oracle,软件的最初版本,ORACLE,数据库在物理上是存储于硬盘的各种文件。它是活动的,可扩充的,随着数据的添加和应用程序的增大而变化,ORACLE,数据库在逻辑上是由许多表空间构成,ORACLE,的详细信息参见百度百科, Developer,管理,Oracle,数据库,7.2,Java,数据库技术概述,Java,程序是通过,JDBC,(Java DataBase Connection),访问数据库的。,该工具包使得,Java,编程人员可以连接到一个数据库,进而使用,SQL,对数据库进行查询和更新操作,可以理解成是对查询分析器的模拟实现,JDBC,的基本功能包括:,建立与数据库的连接;,发送,SQL,语句;,处理数据库操作结果。,Java,数据库应用程序,JDBC,驱动程序管理器,JDBC/ODBC,桥接器,ODBC,驱动程序,DB,供应商提供的,JDBC,驱动程序,DB,JDBC API,JDBC,驱动程序,API,SQL,命令,(,SQL Server,、,Oracle,),JDBC,运行原理,JDBC,与,JDBC,驱动程序的关系,JDBC,=,JDBC,驱动,程序管理器,JDBC Driver,API,+,供编程人员使用,供数据库厂商使用,JDBC,API,+,JDBC,驱动程序,实现,实现,java.sql,包,数据库厂商提供,JDBC,的结构,数据库访问的两层和三层模型,两层模型即客户机,/,数据库服务器结构,也就是通常所说的,C/S(Client/Server),结构,三层模型是指客户机,/,应用服务器,/,数据库服务器结构,也就是通常所说的,B/S(Browser/Server),结构,JDBC,驱动程序,在,Java,程序中可以使用的数据库驱动程序主要有四种类型,常用的有下面两种:,JDBC-ODBC,桥驱动程序,专为某种数据库而编写的驱动程序,postgreSQL,驱动包:,postgresql-9.0-801.jdbc4.jar,MySQL,驱动包:,mysql-connector-java-5.0.8-bin.jar,Sql Server,驱动包:,sqljdbc.jar,Oracle,驱动包:,classes12.jar,以上驱动包可到,进入,Web,应用开发课程的教学材料,学习参考资料 下载,安装,JDBC,驱动程序,使用,JDBC-ODBC,桥驱动程序连接数据库,不需要安装驱动程序,因为在,Java API,中已经包含了该驱动程序。,使用专用驱动程序连接数据库,必须安装驱动程序。,在开发,Web,应用程序中,需要将驱动程序打包文件复制到,:,Tomcat,安装目录的,lib,目录中,Web,应用程序的,WEB-INFclasseslib,目录中,Eclipse,工程的,build path,中,Java,访问数据库的过程,7.3,传统的数据库连接方法,7.3.1,加载驱动程序,7.3.2,建立连接对象,7.3.3,创建语句对象,7.3.4,获得,SQL,语句的执行结果,7.3.5,关闭建立的对象,释放资源,7.3.6,简单的应用示例,7.3.1,加载驱动程序,使用,Class,类的,forName(),静态方法,该方法的声明格式为:,public static Class forName(String className),throws ClassNotFoundException,如果使用,ODBC-JDBC,桥驱动程序,则使用,JDK,自带的驱动程序,名称为“,sun.jdbc.odbc.JdbcOdbcDriver”,Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);,数据库厂商提供的专门的驱动程序,应该给出专门的驱动程序名。,几种常见数据库的加载驱动程序代码,PostgreSQL,数据库:,Class.forName(org.postgresql.Driver);,MySQL,数据库:,Class.forName(com.mysql.jdbc.Driver);,SQL Server,数据库:,Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);,Oracle,数据库:,Class.forName(oracle.jdbc.driver.OracleDriver);,7.3.2,建立连接对象,使用,DriverManager,类的,getConnection(),DriverManager,类的静态方法,getConnection(),,该方法的声明格式为:,public static Connection getConnection(String dburl),public static Connection getConnection(String dburl,String user,String password),如果通过,JDBC-ODBC,桥驱动程序连接数据库,,URL,的形式为:,jdbc:odbc:DataSource,例如:,String dburl = jdbc:odbc:Bookstore ;,如果使用专门的驱动程序连接数据库,,JDBC URL,可能更复杂一些。例如要连接,PostgreSQL,数据库,它的,JDBC URL,为:,jdbc:postgresql:/localhost:5432/dbname,String dburl = jdbc:postgresql:/localhost:5432/bookstore;,Connection conn = DriverManager.getConnection(dburl, bookstore, bookstore);,7.3.2,建立连接对象(续),连接,MySQL,数据库为:,String dburl = jdbc:mysql:/localhost:3306/bank,Connection conn = DriverManager.getConnection(dburl, root, 111111);,连接,SQL Server,数据库为:,String dburl =,jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=web2011,Connection conn = DriverManager.getConnection(dburl, web, web2011);,连接,Oracle,数据库为:,String dburl = jdbc:oracle:thin:localhost:1521:ORCL,Connection conn = DriverManager.getConnection(dburl, system_dba, 123456);,7.3.2,建立连接对象(续),7.3.3,创建语句对象,对于不同的语句对象,可以使用,Connection,接口的不同方法创建。,例如,要创建一个简单的,Statement,对象可以使用,createStatement(),方法,,Statement stmt = conn.createStatement();,创建,PreparedStatement,对象(预编译的,SQL,语句)应使用,prepareStatement(),方法,创建,CallableStatement,对象(用于执行,SQL,存储过程)应使用,prepareCall(),方法。,7.3.4,获得,SQL,语句的执行结果,对于查询语句,调用,executeQuery(String sql),方法,如:,String sql = SELECT * FROM books ;,ResultSet rst = stmt.executeQuery(sql) ;,while(rst.next(),out.print(rst.getString(1)+t) ;,对于语句如,CREATE,、,ALTER,、,DROP,、,INSERT,、,UPDATE,、,DELETE,等须,executeUpdate(String sql),方法。,该方法返回值为整数,用来指示被影响的行数。,7.3.5,关闭建立的对象,释放资源,在,Connection,接口、,Statement,接口和,ResultSet,接口中都定义的,close(),方法。,当这些对象使用完毕后应使用,close(),方法关闭建立的对象,关闭对象应该按与建立对象相反的顺序关闭,从而释放资源。,例如:,conn.close();,7.3.6,简单的应用示例,1,、,连接,postgreSQL,、,MySQL,和,SQL Server,数据库的例子,(1),连接,postgreSQL:testPostgreSQL.jsp,(2),连接,MySQL:testMySQL.jsp,(3),连接,SQL Server:testSqlServer.jsp,连接,PostgreSQL,数据库的主要代码,testPostgreSQL.jsp,连接,MySQL,数据库的主要代码,testMySQL.jsp,%,Class.forName(com.mysql.jdbc.Driver);,/Connection conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/bank?user=root,Connection conn = DriverManager.getConnection(jdbc:mysql:/localhost:3306/bank,root,111111);,Statement st=conn.createStatement();,st.setMaxRows(20);,String sqlStr=select * from T_User;,ResultSet rs=st.executeQuery(sqlStr);,连接,SQLServer,数据库的主要代码,testSqlServer.jsp,%,Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);/ .microsoft.jdbc.sqlServer.SQLServerDriver);,Connection conn = DriverManager.getConnection(jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=web2011,web,web2011);,Statement st=conn.createStatement();,st.setMaxRows(20);,String sqlStr=select * from T_User;,ResultSet rs=st.executeQuery(sqlStr);,7.3.6,简单的应用示例,2,、基于,MVC,设计模式实现数据库查询:从,JSP,页面输入一个书号,查询该书的信息,该应用的程序代码,(P189),:,模型:,BookBean.java,视图:,bookQuerys.jsp,showBook.jsp,error.jsp,控制器:,BookQueryServlet.java,7.4 JDBC API,介绍,JDBC API,是,Java,语言的标准,API,,目前的最新版本是,JDBC 4.0,。在,JDK 6.0,中,它是通过两个包提供的:,java.sql,包,javax.sql,包,java.sql,包提供了基本的数据库编程的类和接口,如驱动程序管理类,DriverManager,、创建数据库连接,Connection,接口、执行,SQL,语句以及处理查询结果的类和接口等。,javax.sql,包主要提供了服务器端访问和处理数据源的类和接口,如,DataSource,、,RowSet,、,RowSetMetaData,、,PooledConnection,接口等,它们可以实现数据源管理、行集管理以及连接池管理等。,java.sql,包,功能,类、接口(斜体),JDBC,API,执行,SQL,语句,对,SQL,语句进行,封装,并用此,sql,语句操作数据库,java.sql.,Connection,java.sql.,Statement,java.sql.,PreparedStatement,驱动程序管理器,装载和管理各个数据库驱动,java.sql.,DriverManager,执行,sql,语句的结果集,将,SQL,语,句的执行结果封装成象,java.sql.,ResultSet,java.sql.,ResultSetMetaData,辅助类,特殊数据类型包装类、异常类,Driever API,供应商必须实现的驱动程序,API,java.sql.,Driver,java.sql.,DatabaseMetaDat,javax.sql,包中的类和接口,javax.sql.DataSource,和,java.sql.Connection,之间的关系,连接池化过程中涉及的关系,分布式事务支持中涉及的关系,行集涉及的关系,Connection,对象代表与数据库的连接,也就是在加载的驱动程序与数据库之间建立连接。一个应用程序可以与一个数据库建立一个或多个连接,或者与多个数据库建立连接。,得到连接对象后,可以调用,Connection,接口的方法创建,SQL,语句对象以及在连接对象上完成各种操作,下面是,Connection,接口的常用方法:,public Statement createStatement(),7.4.1 Connection,接口,public DatabseMetaData,getMetaData,(),所连接的数据库的元数据,public void,setAutoCommit,(boolean autoCommit),public boolean,getAutoCommit,(),获取自动提交模式,public void,commit,(),提交对数据库的更新操作,使更新写入数据库。只有当,setAutoCommit(),设置为,false,时才应该使用该方法。,public void,rollback,(),回滚对数据库的更新操作。只有当,setAutoCommit(),设置为,false,时才应该使用该方法。,public void,close,(),public boolean,isClosed,(),7.4.2 Statement,对象,通过,Connection,对象可以创建,SQL,语句对象,,SQL,语句对象有三种:,Statement,、,PreparedStatement,和,CallableStatement,。通过调用,Connection,接口的相应方法可以得到这三种语句对象。,Statement,接口对象主要用于执行一般的对数据库操作,SQL,语句,调用,Statement,对象的方法可以执行,SQL,语句,返回一个,ResultSet,结果集对象。,public ResultSet executeQuery(String sql),该方法用来执行,SQL,查询语句。查询结果以,ResultSet,对象返回。,public int executeUpdate(String sql),执行由字符串,sql,指定的,SQL,语句,该语句可以是,INSERT,、,DELETE,、,UPDATE,语句或者无返回的,SQL,语句,如,CREATE TABLE,。返回值是更新的行数,如果语句没有返回则返回值为,0,。,public boolean execute(String sql),执行可能有多个结果集的,SQL,语句,,sql,为任何的,SQL,语句。如果语句执行的第一个结果为,ResultSet,对象,该方法返回,true,,否则返回,false,。,public Connection getConnection(),public void close(),Statement,的方法,7.4.3 ResultSet,接口,ResultSet,对象表示,SQL SELECT,语句查询得到的记录集合,称为结果集。,结果集一般是一个记录表,,,其中包含多个记录行和列标题,一个,Statement,对象一个时刻只能打开一个,ResultSet,对象。通过调用,ResultSet,对象的方法,可以对查询结果处理。,每个结果集对象都有一个游标。所谓,游标,(cursor),是结果集的一个标志或指针。对新产生的,ResultSet,对象,游标指向第一行的前面,可以,调用,ResultSet,的,next(),方法,,,使游标定位到下一条记录。,如果游标指向一个具体的行,就通过调用,ResultSet,对象的方法,可以对查询结果处理。,1.,检索当前行字段值,ResultSet,接口提供了检索行的字段值的方法,由于结果集列的数据类型不同,所以应该使用不同的,getXxx(),方法获得列值,例如若列值为字符型数据,可以使用下列方法检索列值:,String getString(int columnIndex),String getString(String columnName),返回结果集中当前行指定的列号或列名的列值,结果作为字符串返回。,columnIndex,为列在结果行中的序号,序号从,1,开始,,columnName,结果行中的列名。,ResultSet,的方法,下面列出了返回其他数据类型的方法,这些方法都可以使用这两种形式的参数:,short,getShort,(int columnIndex),返回指定列的,short,值。,byte,getByte,(int columnIndex),返回指定列的,byte,值。,int,getInt,(int columnIndex),返回指定列的,int,值。,long,getLong,(int columnIndex),返回指定列的,long,值。,float,getFloat,(int columnIndex),返回指定列的,float,值。,double,getDouble,(int columnIndex),返回指定列的,double,值。,boolean,getBoolean,(int columnIndex),返回指定列的,boolean,值。,Date,getDate,(int columnIndex),返回指定列的,Date,对象值。,Object,getObject,(int columnIndex),返回指定列的,Object,对象值。,Blob,getBlob,(int columnIndex),返回指定列的,Blob,对象,(Binary Large Object),值。,Clob,getClob,(int columnIndex),返回指定列的,Clob,对象,(Character Large Object),值,ResultSet,的方法,2.,对行操作的方法,调用,ResultSet,的,next(),方法,使游标定位到下一条记录。还可以通过其他方法使游标任意移动,这些方法有:,boolean next() throws SQLException,将游标从当前位置向下移动一行。第一次调用,next(),方法将使第一行成为当前行,以后调用游标依次向后移动。如果该方法返回,true,,说明新行是有效的行,若返回,false,,说明已无记录。,boolean isFirst() throws SQLException,返回游标是否指向第一行,boolean isLast() throws SQLException,返回游标是否指向最后一行,int getRow(),返回当前行的行号。,int findColumn(String columnname),返回列名指定的列号。,ResultSet,的方法,对于查询语句,,调用,executeQuery(String sql),方法,,该方法的返回类型为,ResultSet,,再通过调用,ResultSet,的方法可以对查询结果的每行进行处理。如:,String sql = SELECT * FROM books ;,ResultSet rst = stmt.executeQuery(sql) ;,while(rst.next(),System.out.print(rst.getString(1)+t) ;,对于更新语句,如,INSERT,、,UPDATE,、,DELETE,,须使用,executeUpdate(String sql),方法。该方法返回值为整数,用来指示被影响的行的数目。,ResultSet,的方法,3.,数据类型转换,在,ResultSet,对象中的数据为从数据库中查询出的数据,调用,ResultSet,对象的,getXxx(),方法返回的是,Java,语言的数据类型,因此这里就有数据类型转换的问题。,实际上调用,getXxx(),方法就是把,SQL,数据类型转换为,Java,语言数据类型,,下表列出了,SQL,数据类型与,Java,数据类型的转换。,ResultSet,的方法,SQL,数据类型与,Java,数据类型之间的对应关系,注:不同数据库的数据类型名称有略微差别,7.4.4,可滚动和可更新的,ResultSet,可滚动的,ResultSet,是,指在结果集对象上不但可以向前访问结果集中的记录,还可以向后访问结果集中的记录。,可更新的,ResultSet,是,指不但可以访问结果集中的记录,还可以通过结果集对象更新数据库。,1,、可滚动的,ResultSet,要使用可滚动的,ResultSet,对象,必须使用,Connection,对象的带参数的,createStatement(),方法创建的,Statement,,然后在该对象上创建的结果集才是可滚动的,该方法的格式为:,public Statement createStatement(int resultType, int concurrency),参数,resultType,的取值应为,ResultSet,接口中定义的下面常量:,ResultSet.TYPE_SCROLL_SENSITIVE,/,可滚动,ResultSet.TYPE_SCROLL_INSENSITIVE,/,不可滚动,ResultSet.TYPE_FORWARD_ONLY,/,仅向前读取,对于可滚动的结果集,,ResultSet,接口提供了下面的移动结果集游标的方法:,public boolean next(),throws SQLException,public boolean previous(),throws SQLException,public boolean first() throws SQLException,public boolean last() throws SQLException,public boolean absolute(int rows) throws SQLException,将光标移动到此,ResultSet,对象的给定行编号,public boolean relative(int rows) throws SQLException,按相对行数(或正或负)移动光标,public boolean isFirst() throws SQLException,public boolean isLast() throws SQLException,public int getRow(),返回游标所在当前行的行号。,用,可滚动的结果集,更新的两种方式,(1),更新,ResultSet,对象,rs,第五行中的,NAME,列,然后使用方法,updateRow,更新导出,rs,的数据源表。,rs.absolute(5);,/ moves the cursor to the fifth row of rs,rs.updateString(NAME, AINSWORTH);,/ updates the / NAME column of row 5 to be AINSWORTH,rs.updateRow();,/ updates the row in the data source,(2),将光标移动到插入行,构建一个三列的行,并使用方法,insertRow,将其插入到,rs,和数据源表中。,rs.moveToInsertRow();,/ moves cursor to the insert row,rs.updateString(1, AINSWORTH);,/ updates the / first column,of the insert row to be AINSWORTH,rs.updateInt(2,35);,/ updates the second column to be 35,rs.updateBoolean(3, true);,/ updates the third column to true,rs.insertRow();,rs.moveToCurrentRow();,例:查询数据分页显示,%,/,将记录指针定位到待显示页的第一条记录上,sqlRst.,absolute,(,(intPage-1) * intPageSize + 1,);,/,显示数据,i = 0;,while(i,2,、可更新的,ResultSet,要使,ResultSet,对象可更新,应该在使用,Connection,的,createStatement(int , int),创建,Statement,对象时,指定第二个参数的值决定是否创建可更新的结果集,该参数也使用,ResultSet,接口中定义的常量,如下所示:,ResultSet.CONCUR_READ_ONLY,不可以更新的,ResultSet,对象的并发模式,ResultSet.CONCUR_UPDATABLE,可以更新的,ResultSet,对象的并发模式,例如,下面语句创建的,rst,对象就是可滚动和可更新的结果集对象:,Statement,stmt =,conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);,Resultset rst = stmt.executeQuery(SELECT * FROM books);,对于每种数据类型,,ResultSet,都定义了相应的,updateXXX(),方法,例如:,public void updateInt(int columnIndex, int x),public void updateInt(String columnName, int x),public void updateString(int columnIndex, String x),public void updateString(String columnName, String x),有关其他方法请参考,Java API,文档。,当更新了需要更新的所有列之后,调用,updateRow(),方法把更新写入表中。,updateRow(),方法的格式如下:,public void updateRow() throws SQLException,执行该方法后,将用当前行的新内容更新结果集,,同时更新数据库,。下面代码说明了如何在,books,表中修改一本书的信息:,static String sql =,SELECT bookid, bname FROM books WHERE bookid =201;,rset = stmt.executeQuery(sql);,rset.next();,rset.updateString(2,Java EE,编程指南,);,rset.updateRow(); /,更新当前行,要插入一行数据首先应该将游标移到插入行,该方法格式如下:,public void moveToInsertRow() throws SQLException,当游标移到插入行时,,ResultSet,记住游标所在的位置。插入行是与可更新结果集相关的特殊行。它实际上是一个新行的缓冲区。,当游标处于插入行时,调用,updateXxx(),方法用相应的数据修改每列的值。,完成输入新行的数据之后,调用,insertRow(),方法。在调用,insertRow(),方法之前,该行所有的列都必须给定一个值。,public void insertRow() throws SQLException,调用,insertRow(),方法之后,这个,ResultSet,仍然位于插入行。这时,可以插入另外一行数据,或者移回到刚才,ResultSet,记住的位置(当前行位置)。通过调用,moveToCurrentRow(),方法返回到当前行。也可以在调用,insertRow(),方法之前通过调用,moveToCurrentRow(),方法取消插入。,最后,可以通过调用下面的方法从一个表或,ResultSet,中删除一行数据:,public void deleteRow() throws SQLException,从结果集中删除当前行,同时从数据库中将该行删除。,7.5,访问数据库元数据 (自学),7,.5.1,获得数据库的信息,7,.5.2,获取结果集的信息,7.5.1,获得数据库的信息,在得到数据库的连接对象后,可以通过该对象获得数据库的,元信息,。其中包括数据库产品名称、版本号、使用的数据类型和存储过程等信息。,要获取这些信息,需要得到,DatabaseMetaData,接口对象,这可以通过调用,Connection,对象的,getMetaData(),方法实现。,假如,conn,是一个,Connection,对象,下面语句可以获得,DatabaseMetaData,接口对象,dbmd,:,DatabaseMetaData dbmd = conn.getMetaData() ;,得到了元数据对象后就可以调用,DatabaseMetaData,接口的方法得到数据库的各种元信息了,常用的方法有:,String getDatabaseProductName(),String getDatabaseProductVersion(),String getUserName(),String getURL(),String getDriverName(),String getDriverVersion(),7.5.2,获取结果集的信息,在对数据库的表结构已经了解的情况下,可以知道返回的结果集中各个列的一些情况,如列名、数据类型等。但有时可能并不知道结果集中各个列的情况,这时可以使用,ResultSet,的,getMetaData(),方法来获得结果集的信息。该方法的格式为:,ResultSetMetaData getMetaDate() throws SQLException,ResultSetMetaData,接口常用的方法有:,int getColumnCount(),返回结果集的列数,String getColumnLabel(int column),返回结果集中指定列的标题,String getColumnName(int column),返回结果集中指定列的名称,int getColumnType(int column),返回结果集中指定列的,SQL,数据类型。它的返回值是一个,int,型值。在,java.sql.Types,类中定义了各种,SQL,数据类型的常量,String getColumnTypeName(int column),返回结果集中指定列的数据类型在数据源中的名称,String getSchemaName(int column),返回指定列所属表的模式名,String getTableName(int column),返回指定的列所属的表名,boolaen isReadOnly(int column),返回指定的列是否只读,boolaen isNullable(int column),返回指定的列是否可取空值,7.6,预处理语句,为了提高语句的执行效率,可以使用,PreparedStatement,接口对象,调用数据库的存储过程,可以使用,CallableStatement,接口对象。,7.6.1,创建,PreparedStatement,对象,PreparedStatement,接口继承了,Statement,接口,因此它可以使用,Statement,接口中定义的方法。,PreparedStatement,对象还可以创建,带参数的,SQL,语句,,在,SQL,语句中指出接收哪些参数,然后进行预编译。,创建,PreparedStatement,对象与创建,Statement,对象类似,唯一不同的是需要给创建的,PreparedStatement,对象传递一个,SQL,命令,即需要将执行的,SQL,命令传递给其构造方法而不是,execute(),方法。,如:,PreparedStatement pstmt = con.prepareStatement(UPDATE EMPLOYEES SET SALARY = 15000.00 WHERE ID = 110592);,用,Connection,的下列方法创建,PreparedStatement,对象:,public PreparedStatement prepareStatement(String sql),public PreparedStatement prepareStatement(String sql,,,int type, in,t concurrency),public PreparedStatement prepareStatement(String sql,,,int type, int concurrency,int holdability),T,ype,为结果集类型,,concurrency,为并发类型,ResultSet,对象的,可保持性,是指当一条语句执行新的,SQL,命令或调用,commit(),时是否关闭之前打开的,ResultSet,。,JDBC 3.0,可以让,ResultSet,对象一直处于打开状态。,要指定结果集是否是可保持的,可使用,ResultSet,接口的常量:,ResultSet.HOLD_CURSOR_OVER_COMMIT,/,保持打开,ResultSet.CLOSE_CURSOR_OVER_COMMIT,/,关闭,PreparedStatement,对象通常用来执行动态,SQL,语句,此时需要在,SQL,语句通过问号指定参数,每个问号为一个参数。,上述这些方法中的第一个参数都是一个,SQL,字符串。这些,SQL,字符串可以包含一些参数,这些参数在,SQL,字符串中使用,问号(,?,)作为占位符,,在,SQL,语句执行时将被数据替换。,7.6.2,使用,PreparedStatement,对象,通过使用带参数的,SQL,语句可以大大提高,SQL,语句的灵活性。例如:,String sql = INSERT INTO books(bookid, title, price),VALUES,(?, ?, ?),;,PreparedStatement pstmt = conn. prepareStatement(,sql,);,SQL,命令中的每个占位符都是通过它们的序号被引用,从,SQL,字符串左边开始,,第一个占位符的序号为,1,,依次类推。,当把预处理语句的,SQL,发送到数据库时,数据库将对它进行编译。,通过,PreparedStatement,接口中定义的,setXXX(),方法为占位符设置具体的值。,例如,下面方法分别为占位符设置整数值和字符串值:,public void setInt(int parameterIndex,int x),public void setString(int parameterIndex, String x),1,、设置占位符,对于前面的,INSERT,语句,我们可以使用下面的方法设置占位符的值,最后再调用,executeUpdate(),方法执行该,SQL,语句:,pstmt.setString(1,801);,pstmt.setString(2,Java EE,编程指南,);,pstmt.setDouble(3, 49.00);,pstmt.executeUpdate();,注意 如果在执行,SQL,语句之前没有设置好全部参数,驱动会抛出一个,SQLException,异常。,可以在数据库中插入或更新复杂数据,例如,向表中插入日期或时间数据,可创建相应的,java.sql.Date,或,java.sql.Time,对象,把它传给预处理语句对象的,setDate(),或,setTime(),方法即可,String sql = “update Users set birthday=? where userid=1001”;,PreparedStatement pstmt = conn. prepareStatement(,sql,);,/,假设,getSqlDate(),方法返回给定日期的,Date,对象,java.sql.Date() d=getSqlDate(“28-Apr-11”);,pstmt.setDate(1,d),2,、用复杂数据设置占位符,设置好语句的全部参数后,应调用,executeUpdate(),方法:,pstmt. executeUpdate();,3,、执行预处理语句,7.7,使用数据源连接数据库,(,自学,),7.7.1,数据源与连接池介绍,7.7.2,配
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!