版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
17Java为客户端和服务器端两个部分。Java的设计意图是将它用于服务器端,而将客户端交给其JavaDelphi、VB的一个重要区别是,它不提供可视化的数据库感应控件,因而编写客户端时如果采用Java作为开发工具会有比较多的编程Java无论何种工具,要处理数据库必须做的第一件事情就是对数据进行连接。Java提供了多种连接方式,这都是通过JDBC来进行的。本节将介绍JDBC的使用。JDBCJava数据库连接(JavaDatabaseConnectivity)的简写,是一组用于连接数据库以及执行SQL语句的API。它允许用户从JAVA程序中任何支持SQL的关系型数据库,也允许用户其他的表格数据源,如Excel表格。JDBC最大的特点是无论是何种数据库,对于Java程序员而言,它的工作方式完全相同。JDBC为许多不同的数据库连接模块的前端提供了统一的接口,这样就不用为连DriverManager类建立与数据源的连接,这个连接将作为一个数据操作的起点,用类中相应的excute方法来执行SQL命令。ResultSet结果集,程序接着遍历这个源的驱动程序。JDBC有四种连接方部分JavaJDBC-Net纯Java驱动方式和本地协议纯Java驱动方JDBC-ODBC桥加上ODBCODBCWindows平台上使用最广泛的标准连接驱动。所有能在Windows上运行的数据库系统都提供何在本地机器上配置ODBC数据:果是WindowsXP,该图标在“管理17.1所示的窗口。(DSN数据源的类型。这里Access。JDBC要通过它来连接数据库文件。单击图
17.1ODBC17.217.3这里将数据源的名称命名为“otudy”,请记住该名称,后面编程要用到。然后单第16的ple.bAPI与数据源系统通JavaAPI留在客户层上并直接与数据库服务器进行 图17.4本地API连接方JDBC-ODBC更快,但它InternetJavaNativeInterfaceJVM的JDBC-Net纯Java驱动程这种连接方式的驱动程序采用一种三层化方法,JDBC数据库请求凭借这种方法,被用Java编写成的,它可以使用前面介绍的两种类型的JDBC驱动程序来完成这些工作,这17.5JDBC-NetJDBC驱动程序(KB)在客户机上执行,并通过网络把SQL命令传递给JDBC服务器,然后接收来自服务器的数据,并管理连接。这种方式考虑到了在Internet上的部署。这种方式的优点是显而易见的:大多数的三层Web应用程序都涉及到安全、以及,而这类驱动程序一JavaJava程序,不需要和安全性。不过,当数据库变成一个不同开发商产品时(尽管这种情形很少见,但不能完全排除),不能使用同一个JDBC驱动程序,需要替换该驱动程序。JDBCDBMSJava驱动程序。这些驱动程个连接方式如图17.6所示。17.6这种方式的缺点在于,程序员需要给每个数据库使用不同的JDBC驱动程序。相对而言,在Windows平台上使用第式较多,在Linux/Unix平台上使用第四为解决这一问题,JDBC使用了“连接池”的概念。在连接池中,保存了若干已经建替原有通过DriverManager类来获得数据库连接的方式。一javax.sql.DataSource接口的ContextContextctx=newDataSourceds=(DataSource)应的Connection对象。而如果当前的DataSource对象支持数据库连接池,应用程序将自动行数据的操作,完成操作后应显式地调用close()关闭数据库连接。持连接池的实现,而连接池的具体实现,JDBC3.0规范并没有做相关的规定。通过这个框JDBC3.0JDBCDriver级和ApplicationServerJDBCDriver级的实现中,任何相关的工作均由特定数据库厂商JDBCDriverJDBCDriver既需要提供对数据库连接池的支ApplicationServer级中数据库连接池JDBCDriverApplicationServer开发人员,共同实现数据库连接池的实现(ApplicationServer厂商实现的连接池的机制和规范中提到有差异)JDBCDriver提供数据库连接池的支持,而特定的ApplicationServer厂商提供数据库连接池的具体实现。消,这种取消动作被称为“回滚(rollback)”。JDBC中的事务操作是基于同一个数据连方法,都位于接口java.sql.Connection中。在JDBC中,事务操作默认是自动提交。也就是说,一条对数据库的更新表达式代表 数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交,倘若其中一个表达式操作失败,都不会执行到commit(),并且将产生相应的异常。此时,就可以trytryconn=stmt=conn.createStatement();自动提交,设置回//数据库更新操作}catch(Exceptiontry{}catch(Exception{}//事务//操作不成功则JDBCAPI5种操作支持,2种加锁密度。5种staticintTRANSACTION_NONE:事务操作和加锁staticintTRAN 重复读写(repeatablereads)和影象读写(phantomreads)staticintTR staticintTRANSACTION_SERIALIZABLE:脏数据读写、重复读写和允许影脏数据读写(dirtyreads):当一个事务修改了某一数据行的值而未提交时,另一(脏数据)重复读写(repeatablereads):当一个事务在某一数据行时,另一事务同时在JDBC根据数据库提供的默认值来设置事务支持及其加锁,它有两种加锁密度:分别Settransactionisolation(int 注意:某些数据库(如oracle)中,数据库驱动对事务处理的默认值是TRANSACTION_来说,对于只涉及到数据库的查询操作时,可以采用TRANSACTION_READ_MITTED方式;对于数据查询远多于更新的操作,可以采用TRANSACTION_ 方式;对于更新操作较多的,可以采用TRANSACTION_REPEATABLE_READ;在数据一致性要求更高的场合再考虑最后一项,由于涉及到表Java5种基本操作:增、删、改、查找和排序。在Java中,这些操作都是通过SQL语言来实现的。DriverManager 正如名称所示,该方法将建立与数据库的连接。JDBC允许用户调用DriverManagergetDriver()、getDrivers()registerDriver()。但多数情况下,DriverManager类自己Connection封装了对数据库连接的操作。一般情况下,Connetction对象是由DriverManager.getConn-ection()方法来得到的,程序只需要获取该方法返回的一个指向Connection对象的,就可以对数据库进行操作。Connection的方法比较多,但多数情况下,程序员只需要用到下体的SQL命令。Statement方法来执行SQL命令:ResultSetexecuteQuery(Stringsql)sql命令,返回一个结果集合。通常用于执行SELECT命令。于执行INSERT、UPDATE或DELETE命令。表示返回了一个结果集,需要用getResultSet()方法获取这个结果集,也可以使用getMoreResults()获取子结果集。如果为false,表示没有结果集,只需要调用PreparedStatementStatement类似SQL命令进行预编译,对于需要多次执行SQL语句而言,量转换成为SQL语句中的变量,并降低出错的可能性。它用来接受SQL语句执行后的结果,程序员可以通过next()、previous()等方法来关于这个接口,将在17.2.7中详细介绍。try-catch语句块中。注意,这里是加载ODBC驱动,无论是何种数据库,该驱动程序动程序。例如,是MySQL,加载驱动程序的代码是:java.sqlConnection类来声staticstaticConnectiongetConnection(Stringurl,Stringuser,Stringjdbc:odbc:jdbc:odbc:数据源注意:这里是数据源而非数据库名令均为空。这就是第16章建立的数据库,以及17.1节配置的ODBC数据源。//-----------连接数据库示例程序段,程序编 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载数据库ConnectionConnection("jdbc:odbc:forStudy","","");//这里是ODBC}catch(ClassNotFoundException}种异常情况,程序就不会按照正常流程运行,就可close()方法没有被调用的情况,//-----------关闭数据库示例程序段,程序编 Connection}catch(ClassNotFoundExceptioncon.close();//el){}//endtry-}//end}//endtry-catch-SQLStatementexecuteUpdate()方法就可】room、6个字段(如果您的数据库中该表的字段不是这个样子,请将其设置成这样6个字 //-----------程序名insertData.java,程序编号17.3publicclassinsertDatapublicstaticvoidmain(String[]{Connectioncon=null;Statementstmt;//要执行的SQL语StringsqlString="insertintostudentvalues('30小王','男'湖南湘潭','N- //连接数//执行插入e){e){}}}}错的事。例变量:code="30",name="小王",sex="男",address="湖南湘潭", sqlString="insertsqlString="insertintostudentvalues('code','name','sex','address', sqlString="insertsqlString="insertintostudentvalues('"+code+"','"+name+"','"+sex+"','"+address+"','"+room+"','"+ +"',)";//-----------程序名insertData.java,程序编号17.4importjava.io.*;publicclassinsertDatapublicstaticvoidmain(String[]{Connectioncon=null;Statementstmt;Stringname,sex,address,code,room, //拼装SQLsqlString="insertintostudentvalues('"+code+"','"+name++sex+"','"+address+"','"+room+"','"+e){e){}}}publicstaticStringgetInput(Stringmsg){Stringresult=null;BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));e){}return}}17.717.4SQL命令可以使用的字符串是件很sqlString="insertintostudentvalues(?,?,?,?)";//?就是占位
//替换第一个占位//替换第四个占位等来赋值。整个程序如程序17.5所示://-----------程序名insertData.java,程序编号17.5importjava.io.*;publicclassinsertDatapublicstaticvoidmain(String[]{Connectioncon=null;PreparedStatementps;StringsqlString;Stringname,sex,address,code,room, sqlString="insertsqlString="insertintostudentvalues(?,?,?,?,?,?)";ps.setString(1,code);//替换第一个占位符 ps.executeUpdate()SQL命令e){e){}}}publicstaticStringgetInput(Stringmsg){Stringresult=null;BufferedReaderin=newBufferedReader(newInputStreamReadere){}return}}SQLdelete即可。delete命令本身比较JavaSQL命令字符串之间的差异。下面是一个简//-----------程序名deleteData.java,程序编号17.6importjava.io.*;publicclassdeleteDatapublicstaticvoidmain(String[]{ConnectionStatementStatementStringsqlString="deletefromstudentwherecode='"+code+"'";//e){e){}}}publicstaticStringgetInput(Stringmsg){Stringresult=null;BufferedReaderin=newBufferedReader(newInputStreamReadere){}return}}//-----------程序名updateData.java,程序编号17.7importjava.io.*;publicclassupdateDatapublicstaticvoidmain(String[]{ConnectionStatementstmt;Statementstmt;intk;sqlString="updatestudentsetsex='女wheresex='男'";//执行SQLe){e){}}}}SELECTResultSet集中,遍历这个集此ResultSet提供了大量的方法供程序员来管理这根游标。ResultSet的方法非常多,表17.1列出了其中一些常用的方17.1ResultSet booleanabsolute(int将游标移动到指定行位置(绝对值voidvoidvoidvoidvoid立即关闭与结果集连接的数据库并释放JDBCvoidintfindColumn(Stringboolean BigDecimalgetBigDecimal(intbooleangetBoolean(intbytegetByte(intStringdoublegetDouble(intintgetInt(intlonggetLong(intintshortgetShort(String成为short数据Statement返回与结果集相关联的Statement对StringgetString(int成为Stringintvoidbooleanbooleanbooleanbooleanbooleanvoidvoidbooleanbooleanvoidbooleanrelative(int将游标移动到相对于当前位置差rows行的booleanbooleanbooleanvoidupdateByte(intcolumnIndex,byte voidupdateDate(intcolumnIndex,DatevoidupdateDouble(intcolumnIndex,doublevoidupdateInt(intcolumnIndex,intvoidupdaong(intcolumnIndex,longvoidvoidupdateShort(StringcolumnName,shortboolean测试读入进来的最后一列是否为SQLNULL//-----------程序名queryData.java,程序编号17.8importjava.sql.importjava.sql.*;importjava.io.*;publicclassqueryData{publicstaticvoidmain(String[]{Connectioncon=null;Statementstmt;ResultSetrs;//执行查询命令,并获取返回rs=stmt.executeQuery("select*fromname=rs.getString("name");//获取name字段的内容 //获取sex字段的内容System.out.println(name+""+sex+""+address+"}e){e){}}//try}//method}//classJavaGUI界面的数据库17.8这里用到的数据库仍然是前面的FirstExample,ODBC数据源名称为forStudy,表名是student,拥6个字段,如17.2所示:17.2student类长含学生代码(学号是否2否否否否注意:某些数据库不支持数据集的这些功能,只能用相应的SQL 一般情况下,这种MIS程序有三种编程思路:也可以删除记录。这需要精确记录游标的位置和记录条数。ResultSet对这两项的支持都很protectedprotectedint//publicstaticfinalintonlyRead=0,adding=1,amending=2;//protectedint //记录ResutlSet不能直接获取记录总数,需要使用SQLselectcount(*)from t的值首先来设计程序的界面,这个比较简单,用第14章介绍的知识就可以轻松完成,只//-----------程序名AddressList.java,程序编号17.9importjavax.swing.importjavax.swing.*;importjava.awt.*;importjava.sql.*;publicclassAddressListextends Containercon; Connectionconn=null;Statementstmt=null;ResultSetrs=null;protectedintrecordState=onlyRead, publicstaticfinalintonlyRead=0,adding=1,amending=2;publicstaticfinalStringlb privatestaticfinal publicAddressListmainJframenewJFrame("学生信息管理con.setLayout(newBoxLayout(con,BoxLayout.Y_AXIS));pane=newJPanel[4];for(inti=0;i++){pane[i]=newJPanel();}fieldText=newJTextField[ lbl=newJLabel[ for(inti=0; i++){fieldText[i]=newJTextField();lbl[i]=newJLabel(); }firstBtn=newJButton("第一条");preBtn=newJButton("前一条");nextBtn=newJButton("后一条");lastBtn=newJButton("最后一条");addBtn=newJButton("增加记录");editBtn=newJButton("编辑记录");delBtn=newJButton("删除记录");cancelBtn=newJButton("取消改变");saveBtn=newJButton("保存记录");for(inti=0;i<4;i++)if( t>0)showDate();}protectedvoidsetFace(){}publicstaticvoidmain(String[]{new}}其中的connection()和showDate()方法将在后面介绍。这里实际上已经提供了本程序的框架,后面的代码都要添加在AddressList.java文件中。注意:某些数据库不支持这些功能用两条SQL语句来完成。打开数据库写成一个方法,代码如下:publicvoidconnection(){publicvoidconnection(){try{rs=stmt.executeQuery("selectcount(*)fromstudent");t=rs.getInt(1);//rs=stmt.executeQuery("selectcode,name,sex,address,room,fromstudent"); //将游标移动到第一条记JOptionPane.showMessageDialog(mainJframe,"数据库无法连接或没有记录{}}以需要将关闭数据库的代码写在windowClosing事件的响应代码中。程序如下:////退出系统时要关闭数publicvoidwindowClosing(WindowEventel){try{e){}}publicvoidshowDate(){ }为了编程上的方便,需要将几个按钮都要用到的功能写成下面两个方法供其他方法调用:////设置文本框的读写protectedvoidsetTextState(booleanflag){for(inti=0;i< }protectedvoidfor(inti=0;i< }protectedprotectedvoidfalse);returnreturn}if(rs.first()){//移动游标到第一条位置showDate()显示当前记录到界面上curRow=1;//记录游标的新位置}}protectedprotectedvoidif(curRow<=1){ return} //向前移动 /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024高中语文第二单元置身诗境缘景明情梦游天姥吟留别训练含解析新人教版选修中国古代诗歌散文欣赏
- 2024高考地理一轮复习第十三单元人类与地理环境的协调发展练习含解析
- 2024高考历史一轮复习方案专题十三近现代中国的先进思想专题综合测验含解析人民版
- 2024高考地理一轮复习第一部分自然地理-重在理解第四章地表形态的塑造第12讲营造地表形态的力量学案新人教版
- DB42-T 2329-2024 固定污染源气态汞采样装置技术要求与检测方法
- 烤漆房紧急预案
- 二零二五年度粮油产品进出口代理合同3篇
- 二零二五年绿色建材认证瓷砖供应商合作协议3篇
- 镁合金成型与应用教学教案
- 北师大版数学八年级上册《平面直角坐标系中三角形面积问题》
- DB33T 2570-2023 营商环境无感监测规范 指标体系
- 上海市2024年中考英语试题及答案
- 房屋市政工程生产安全重大事故隐患判定标准(2024版)宣传海报
- 房屋市政工程生产安全重大事故隐患判定标准(2024版)宣传画册
- 2025年道路运输企业客运驾驶员安全教育培训计划
- 南京工业大学浦江学院《线性代数(理工)》2022-2023学年第一学期期末试卷
- 2024版机床维护保养服务合同3篇
- 《论拒不执行判决、裁定罪“执行能力”之认定》
- 工程融资分红合同范例
- 2024年贵州省公务员录用考试《行测》真题及答案解析
- 2024国家安全员资格考试题库加解析答案
评论
0/150
提交评论