第11章JDBC数据库编程-ok20151201_第1页
第11章JDBC数据库编程-ok20151201_第2页
第11章JDBC数据库编程-ok20151201_第3页
第11章JDBC数据库编程-ok20151201_第4页
第11章JDBC数据库编程-ok20151201_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第11章JDBC数据库编程计算机科学与技术教研室龚平JDBC概述数据库的连接数据库操作应用实例2本章主要内容JDBCTMisaJavaTMAPIforexecutingSQLstatements.(Asapointofinterest,JDBCisatrademarkednameandisnotanacronym;nevertheless,JDBCisoftenthoughtofasstandingfor''JavaDatabaseConnectivity''.)

——摘自/docs/books/jdbc/intro.html11.1JDBC概述在JAVA技术系列中,访问数据库的技术叫做JDBC,它提供了一系列的API。JDBCAPI是Java程序语言内针对数据库开发提供的编程接口,它由一组类和接口构成,JDBCAPI使得开发人员可以使用纯Java的方式与关系型数据库进行交互。4JDBCAPI基本功能包括:①指定JDBC驱动程序类型,并建立与指定数据库的连接。②向数据库发送SQL语句并处理返回结果。③获得所连接数据库的各种信息,包括驱动程序、数据库、表、列的属性等。有了JDBCAPI,就不必为访问MySQL数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,为访问SQLServer数据库又写另一个程序等。只须用JDBCAPI写一个程序就够了,它可以向相应数据库发送SQL语句。11.1.1JDBC组件JDBC包含了4大组件:JDBCAPI、JDBCDriverManager、JDBCTestSuite、JDBC-ODBCBridge。71)JDBCAPIJDBCAPI提供了Java语言访问关系数据的程序代码支持,使用JDBCAPI可以执行SQL命令,获取返回结果和数据库事务操作。目前的JDBCAPI被分割在了java.sql和javax.sql包下。java.sql基本功能这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及预处理语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。9java.sql常用类和接口DriverManager类DriverConnectionStatementPreparedStatementCallableStatementResultSetResultSetMetaDatajavax.sql扩展功能它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集(RowSet)等。112)JDBC驱动管理器(JDBCDriverManager)JDBC驱动管理器是JDBCAPI定义了能够通过JDBC连接到数据库的一系列对象。它与实际连接到数据库的第三方驱动进行通信,并返回查询的信息,或是执行由该SQL规定的操作。3)JDBCTestSuiteJDBC驱动程序测试套件帮助程序员确定JDBC驱动程序将运行的程序。4)JDBC-ODBCBridgeJDBC-ODBCBridge使得Java程序通过ODBC桥提供的JDBC驱动程序访问关系型数据。//JDK8不再提供JDBC-ODBCBridge1211.1.2JDBC架构JDBCAPI通常提供“两层”和“三层”两种模型来访问数据库:1)两层模型13在两层模型中,Java程序直接与数据库进行对话。这将需要一个JDBC驱动程序来与所访问的特定数据库管理系统进行通信。程序中的SQL语句被送往数据库中,其结果将被返回给程序。2)三层模型14在三层模型中,命令先是被发送到中间层,然后由中间层将SQL语句发送给数据库。数据库对SQL语句进行处理并将结果返回到中间层,中间层再将结果返回给用户。Java应用程序进行数据库开发一般遵循下列几个步骤:注册(加载)JDBC驱动程序;建立到数据库的连接;创建SQL语句对象;发送SQL语句;处理返回结果;从数据库断开连接;11.2数据库的连接在连接数据库前,首先必须下载数据库对应的JDBC驱动程序。不同的数据库厂商提供有不同的JDBC驱动。16SQLServerMySQLoracle下载相应的数据库针对Java的驱动后,(解压)找到具体的.jar文件,添加到Java项目中。SQLServerMySQL

加载JDBC驱动try{Class.forName(“驱动包.类")}catch(Exceptione){}SQLServer:com.microsoft.sqlserver.jdbc.SQLServerDriverMySQL:com.mysql.jdbc.Driver或org.git.mm.mysql.DriverOracle:oracle.jdbc.driver.OracleDriver结合实际的JAR包来写建立连接Connection的对象代表与数据库的连接。一个应用程序可与单个数据库有一个或多个连接,也可与许多数据库有连接。在连接的过程中需要用DriverManager类来处理驱动的调入并且对产生新的数据库连接提供支持。多数情况下,让DriverManager类管理建立连接的细节为上策。其中,DriverManager类中的getConnection方法有下边3种定义:publicstaticConnectiongetConnection(String

url,Properties

info)throwsSQLExceptionpublicstaticConnectiongetConnection(String

url,String

user,String

password)throwsSQLExceptionpublicstaticConnectiongetConnection(String

url)throwsSQLException

如何创建Connection的对象url参数的格式:jdbc:<subprotocol>:<subname>参数url具体写法:MySQL:jdbc:mysql://localhost:端口/数据库名Oracle:jdbc:oracle:thin:@主机host:端口号:数据库名SQLServer:jdbc:sqlserver://localhost:1433;DatabaseName=test24连接SQLServer2005/2008:Stringurl="jdbc:sqlserver://localhost:1433;DatabaseName=test";Connectioncon=DriverManager.getConnection(url,”sa”,”asdf”);操作演示:连接SQLServer11.3数据库操作利用JDBCAPI对数据库进行操作(数据查询、数据新增、数据修改、数据删除等)。对数据库的操作主要会涉及到几个类和接口:Connection、Statement、PreparedStatement、CallableStatement、ResultSet等。26Statement的对象用于将SQL语句发送到数据库中。实际上有三种Statement:

StatementPreparedStatement(它从Statement继承而来)和CallableStatement(它从PreparedStatement继承而来)创建SQL语句对象做法1通过Connection接口的下列方法创建Statement接口的对象Statement

createStatement()throwsSQLExceptionStatement

createStatement(int

resultSetType,int

resultSetConcurrency)throwsSQLExceptionresultSetType

结果集的方式。值可以取:ResultSet.TYPE_FORWARD_ONLY

结果集游标只能向前滚动。ResultSet.TYPE_SCROLL_INSENSITIVE

结果集的游标可以上下移动,当数据库变化时,当前结果集不变。ResultSet.TYPE_SCROLL_SENSITIVE结果集的游标可以上下移动,当数据库变化时,当前结果集同步改变。resultSetConcurrency

设定当前结果集与数据库的关系。值可以取:ResultSet.CONCUR_READ_ONLY

只读,即不能用结果集更新数据库中的表。ResultSet.CONCUR_UPDATABLE

可更新的,即可以用结果集更新数据库中的表。通过Connection接口的下列方法创建PreparedStatement接口的对象PreparedStatement

prepareStatement(String

sql)throwsSQLExceptionPreparedStatement

prepareStatement(String

sql,int

resultSetType,int

resultSetConcurrency)throwsSQLExceptionCallableStatement

prepareCall(String

sql)throwsSQLException创建SQL语句对象做法2使用Statement接口提供的方法:ResultSet

executeQuery(String

sql)throwsSQLExceptionint

executeUpdate(String

sql)throwsSQLExceptionboolean

execute(String

sql)throwsSQLException代码清单11-2发送SQL命令做法1使用PreparedStatement提供的方法ResultSetexecuteQuery()intexecuteUpdate()booleanexecute()31代码清单11-3发送SQL命令做法2当向数据库发送一个SQL语句,数据库中的SQL解释器负责把SQL语句生成底层的内部命令,然后执行。如果不断的发送SQL语句,势必增加数据库中SQL解释器的负担,影响执行的速度。能不能事先就将SQL语句解释为底层的内部命令,然后再发送到数据库直接执行呢?

PreparedStatement接口答案是肯定的。Java提供了更高效率的数据库操作机制,就是PreparedStatement接口,它的对象被习惯地称作预处理语句对象。

在对SQL进行预处理时,可以使用通配符“?”来代替字段的值,并在预处理语句执行之前对通配符所表示的内容进行具体值的设定。如:

PreparedStatementpre=con.prepareStatement(“select*fromscorewheremaths<?”);pre.setInt(1,60);//1表示出现的第一个通配符

预处理设置通配符值的常用方法:voidsetDate(intindex,Datex)voidsetDouble(intindex,doublex)voidsetFloat(intindex,floatx)voidsetInt(intindex,intx)voidsetLong(intindex,longx)voidsetString(intindex,Stringx)预处理语句具有两个主要的优点:只需要被解析(或准备)一次,可以使用相同或不同的参数(针对通配符?)执行多次。传给预处理语句的参数不需要使用引号,底层驱动会处理这个。11.3.6数据库SQL操作数据库基本操作包括查询、删除、插入、更新等,主要涉及Statement接口、PreparedStatement接口、ResultSet接口等的操作。37(1)数据查询数据查询分为一般查询、带参数的查询,一般查询使用Statement接口,带参数的查询使用PreparedStatement接口。例如:一般查询:Stringsql="SELECT*FROMt_userWHEREage>20";带参数的查询:Stringsql="SELECT*FROMt_userWHEREage>?";条件查询select字段列表/*from表名where条件排序查询select字段列表/*from表名orderby字段asc/desc模糊查询select字段列表/*from表名where字段like‘%xxx%’统计查询selectcount(字段/*)from表名等等。具体请参照SQL命令。向数据库发送查询命令,返回查询结果集Statementst=con.createStatement();ResultSetrs=st.executeQuery(sql);或者,PreparedStatementps=con.createStatement(sql);ResultSetrs=ps.executeQuery();ResultSet的对象所包含的结果集中往往有多条记录,形式如下图所示:Stringsql="selectuserID,usrname,age,genderfromt_userwheregender='女'";ResultSetrs=st.executeQuery(sql);booleanabsolute(int

row)booleanfirst()booleanlast()booleanrelative(int

rows)booleanprevious()booleannext()intgetInt(String

columnName)intgetInt(int

columnIndex)StringgetString(int

columnIndex)StringgetString(String

columnName)ResultSet接口常用的方法如何处理查询的返回结果?

处理返回结果——查询

a.获取结果集中的列名、类型ResultMetaDatarsmd=rs.getMetaData();intcc=rsmd.getColumnCount();for(inti=1;i<=cc;i++)System.out.println(rsmd.getColumnName(i)+””+rsmd.getColumnTypeName(i));b.对结果集中的数据进行输出while(rs.next()){id=rs.getInt(1);name=rs.getString(2);account=rs.getString(3);password=rs.getString(4);System.out.println(id+””+name+””+account+””+password);}最初游标的位置在第1条记录之前。默认情况下,只能对结果集执行读操作,不允许更改结果集的内容。查询结果集通常会含有多条记录,可以通过循环逐行操作,如下所示:默认情况下,游标只能“从前往后”移动。方向性:Forward1→2→3→4→…执行rs.next()执行rs.next()记录非空,返回true记录非空,返回true执行rs.next()记录为空,返回false值得注意的是,即使在创建Statement或PreparedStatement时把参数设置为游标可滚动的和结果集可更新,实际得到的结果集仍然有可能不允许滚动或更新。有以下两方面的原因:底层JDBC驱动器有可能不支持可滚动或可更新。某些查询语句的结果集不允许更新。例如,JDBC规范规定,只有对一张表查询,并且查询字段包含表中的主键,这样的查询语句的结果集才能够被更新。补充演示案例:查询(2)数据插入数据插入可以有两种方法,一种是通过发送SQL方式进行插入,另外一种就是通过结果集进行插入。1)发送SQL方式进行插入在SQL语句中使用insert语句,并通过Statement的executeUpdate方法发送SQL语句实现插入,如:Stringsql="INSERTINTOcustomer(cName,cAge,cAddress,cEmail)values('MikeJoden',45,'NewYorkThreeStreet','mjoden@135.net')";st.executeUpdate(sql);51也可使用PreparedStatement的executeUpdate方法实现,如:StringsqlStr="insertintoAdmin(name,account,password,role_type)values(?,?,?,?)";PreparedStatementps=con.prepareStatement(sqlStr);ps.setString(1,"fang");ps.setString(2,"lucy");ps.setString(3,"lucy");ps.setInt(4,0);intcount=ps.executeUpdate();if(count>0){//处理返回结果System.out.println("插入成功");}52(3)数据更改数据更改即记录的更改,有两种方式:发送SQL方式和ResultSet结果集方式。1)发送SQL方式更改在sql语句中使用update语句,并通过Statement中的executeUpdate方法实现插入,如:st.executeUpdate(“updateAdminsetname=’wf’whereid=7");53或者使用PreparedStatement通过带参数的sql语句进行更改,如:StringsqlStr="updateAdminsetname=?whereid=?";PreparedStatementps=con.prepareStatement(sqlStr);ps.setString(1,"wf");ps.setInt(2,"7");intcount=ps.executeUpdate();if(count>0){//处理返回结果System.out.println("更新成功");}54(4)数据删除数据删除即对数据表中的某些记录进行删除,同样它有两种方式操作,发送SQL方式和结果集方式1)发送SQL方式方式删除在sql语句中使用delete语句,并通过Statement中的executeUpdate方法实现删除,如:st.executeUpdate(“deletefromAdminwherename=’wf’);55或者使用PreparedStatement通过带参数的sql语句进行更改,如:StringsqlStr="deletefromAdminwherename=?";PreparedStatementps=con.prepareStatement(sqlStr);ps.setString(1,"wf");intcount=ps.executeUpdate();if(count>0){System.out.println("删除成功");}56

从数据库断开连接try{…}catch(Exceptione){}finally{

try{

if(con!=null)con.close();}catch(Exceptionee){}}加载驱动程序Class.forName(…);创建数据库连接对象Connectioncon=xxx.getConnection(…);创建Statement对象Statementst=con.createStatement();向数据库发送SQL命令Stringsql=“select……”;//查询ResultSetrs=st.executeQuery(sql);Stringsql=“delete……”;//增删改intn=st.executeUpdate(sql);处理返回结果(1)查询,处理rs

(2)增删改,处理n关闭与数据库的连接con.close();11.4应用实例59数据库名info,t_user表如下:通过ResultSet的对象插入、删除、修改数据课后自习voidmoveToInsertRow()throwsSQLException

voidupdateInt(intcolumnIndex,intx)throwsSQLExceptionvoidupdateInt(StringcolumnLabel,intx)throwsSQLExceptionvoidupdateString(intcolumnIndex,Stringx)throwsSQLExceptionvoidupdateString(StringcolumnLabel,Stringx)throwsSQLExceptionvoidupdateRow()throwsSQLExceptionvoiddeleteRow()throwsSQLExceptionvoidinsertRow()throwsSQLExceptionResultSet接口常用的方法1.数据插入当通过Statement对象或者是PreparedStatement对象使用select的sql语句获得了结果集之后,就可以利用现有的结果集进行插入操作。具体做法:rs.absolute(n);//先定位”游标”到某行的位置,或省略直接利用当前行rs.moveToInsertRow();//将这个位置作为插入行的位置rs.updateXXX(…,…);//对“不允许为空”的列赋值,如rs.updateString(2,”晒太阳的猫”);rs.updateXXX(…,…);//对“不允许为空”的列赋值,如rs.updateInt(3,22);……rs.insertRow();//执行插入行操作67代码清单11-4结果集更新在创建Statement对象或者是PreparedStatement对象的时候必须指明结果集可更新,否则会报出异常。得到一个结果集之后,可以将游标移动到制定的行,然后使用updateXXX()方法更新该列的数据,最后使用updateRow()提交更新的数据,同步更改数据库。68代码清单11-52.数据修改首先根据sqlStr查询条件获得ResultSet对象,然后将游标移到对应行,最后执行deleteRow()方法,即可实现数据的删除。StringsqlStr="select*fromAdminwhereid=6";PreparedStatementps=con.prepareStatement(sqlStr,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSetrs=ps.executeQuery();rs.next();rs.deleteRow();con.close();693.数据删除对数据表的操作(创建表、删除表、增加表中的列、删除表中的列)课后自习常常在程序中也需要对数据库或者是数据表进行操作,如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论