2020/2/7第1页注意:开始用功了!2020/2/7第2页配合例子源代码一起使用Powerpoint制作:耿祥义张跃平JDBC数据库操作《Java程序设计教学做一体化教程》第8章2020/2/7第3页主要内容2020/2/7第4页8.1连接数据库8.1.1核心知识_11.JDBC为了使Java编写的程序不依赖于具体的数据库,Java提供了专门用于操作数据库的API,即JDBC(JavaDataBaseConnectivity),比如,JDBC中常用的类和接口存放在java.sql包中。程序经常使用JDBC进行如下的操作:•与一个数据库建立连接•向已连接的数据库发送SQL语句•处理SQL语句返回的结果2020/2/7第5页8.1.1核心知识_22.连接数据库的步骤程序为了能和数据库交互信息,必须首先和数据库建立连接。和数据库建立连接的常用两种方式.•建立JDBC─ODBC桥接器(使用ODBC提供的数据库驱动程序)•加载纯Java数据库驱动程序如果使用加载纯Java数据库驱动程序连接数据库需要得到数据库厂家提供的纯Java数据库驱动程序,为了便于教学,本章使用JDBC─ODBC桥接器方式和数据库建立连接,主要步骤是(1)将数据库设置成ODBC数据源(2)建立JDBC-ODBC桥接器(3)和ODBC数据源建立连接2020/2/7第6页8.1.2能力目标掌握连接数据库的步骤。2020/2/7第7页8.1.3任务驱动1任务的主要内容•创建一个数据库,并在数据库中创建名字是chengji的表•将所创建的数据库设置成名字为myData的数据源。•建立JDBC-ODBC桥接器•和数据源myData建立连接。•查询chengji的表中的全部记录。2任务步骤及代码模板(1)创建MicrosoftAccess数据库以及名字是chengji的表。(2)将所创建的数据库设置为名称是myData的数据源。(3)建立JDBC-ODBC桥接器.(4)和数据源myData建立连接.(5)阅读、调试下列模板给出的代码Appilcation8_1.java运行效果如图8.9所示。2020/2/7第8页任务小结学习使用Java中的JDBC(JavaDataBaseConnectivity)操作数据库,须选用一个数据库管理系统,以便有效地学习JDBC技术,而且学习JDBC技术不依赖所选择的数据库。本章并非讲解数据库原理,而是讲解如何在Java中使用JDBC提供的API和数据库进行交互信息,只要掌握与某种数据库管理系统所管理的数据库交互信息,就会很容易地掌握和其它数据库管理系统所管理的数据库交互信息。ODBC(OpenDataBaseConnectivity)是Microsoft引进的数据库连接技术,提供了数据库访问的通用平台,而且ODBC驱动程序被广泛的使用,建立这种桥接器后,使得JDBC有能力访问几乎所有类型的数据库。缺点是:使得应用程序依赖于ODBC,移植性较差。2020/2/7第9页8.1.4实践环节调试下列代码,并注意和任务模板中的代码的不同之处。Appilcation8_2.java2020/2/7第10页8.2查询操作8.2.1核心知识_11.简单的结果集◆和数据库建立连接con,例如:Connectioncon=DriverManager.getConnection(jdbc:odbc:myData,,);◆连接对象con调用方法createStatment()可以得到一个Statement对象sql(习惯称sql为SQL语句对象),例如:try{Statementsql=con.createStatement();}catch(SQLExceptione){}◆Statement对象sql调用相应的方法把SQL语句发送数据库,并将数据库执行SQL语句产生结果存放在一个ResultSet类声明的对象中。例如:ResultSetrs=sql.executeQuery(SELECT*FROMchengji);ResultSet对象一次只能看到一个数据行,使用next()方法移到下一数据行,获得一行数据后,ResultSet对象可以使用getXxx方法获得字段值,将位置索引或列名传递给getXxx方法的参数即可。表8.1给了出了ResultSet对象的若干方法。2020/2/7第11页表8.1ResultSet对象的若干方法2020/2/7第12页8.2.1核心知识_22.可滚动的结果集ResultSet类的next()方法顺序地查询数据,但有时候需要在结果集中前后移动、显示结果集中某条记录或随机显示若干条记录等。这时,必须要返回一个可滚动的结果集。为了得到一个可滚动的结果集,需使用下述方法获得一个Statement对象:Statementsql=con.createStatement(inttype,intconcurrency);根据参数的type、concurrency的取值情况(见page172),stmt返回相应类型的结果集:ResultSetre=sql.executeQuery(SQL语句);滚动查询经常用到ResultSet的下述方法◆publicbooleanprevious():将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时返回false.◆publicvoidbeforeFirst:将游标移动到结果集的初始位置,即在第一行之前。◆publicvoidafterLast():将游标移到结果集最后一行之后。◆publicvoidfirst():将游标移到结果集的第一行。◆publicvoidlast():将游标移到结果集的最后一行。更多方法见page172.2020/2/7第13页8.2.2能力目标查询表中的记录。2020/2/7第14页8.2.3任务驱动将下列Application8_3.java中的【代码】替换为程序代码。程序运行效果如图8.10。2020/2/7第15页任务小结无论字段是何种属性,总可以使用getString(intcolumnIndex)或getString(StringcolumnName)方法返回字段值的串表示。当使用ResultSet的getXxx方法查看一行记录时,不可以颠倒字段的顺序,JDBC使用ResultSet对象处理SQL语句从数据库表中查询的记录,应用程序在使用ResultSet对象中的数据时,就必须始终保持和数据库的连接,直到应用程序将ResultSet对象中的数据查看完毕。2020/2/7第16页8.2.4实践环节下列代码使用的模糊查询的SQL语句,请调试下列代码,然后修改代码,使用条件查询的SQL语句查询chengji表中math值大于85的记录。Application8_4.java2020/2/7第17页8.3更新、插入与删除操作8.3.1核心知识Statement对象调用方法publicintexecuteUpdate(StringsqlStatement);通过参数sqlStatement指定的方式实现对数据库表中记录的更新、添加和删除操作。1.更新更新记录的SQL语句格式:UPDATE表名SET字段名=新值WHERE条件子句UPDATEchengjiSETmath=88WHEREname='张大山'2.插入插入记录的SQL语句格式:INSERTINTO表(字段列表)VALUES(对应的具体的记录)或INSERTINTO表(VALUES(对应的具体的记录)INSERTINTOchengji(number,name,math,english)VALUES('2019','王芳',99,77)3.删除删除记录的SQL语句格式:DELETEFROM表名WHERE条件子句DELETEFROMchengjiWHEREnumber=‘2012001’2020/2/7第18页8.3.2能力目标更新表中的记录、向表中插入记录,删除表中的记录。2020/2/7第19页8.3.3任务驱动将下列Application8_5.java中的【代码】替换为程序代码。Modify.java程序运行效果如图8.11。2020/2/7第20页任务小结可以使用一个Statement对象进行更新操作,但需要注意的是,当查询语句返回结果集后,没有立即输出结果集的记录,而接着执行了更新语句,那么结果集就不能输出记录了。要想输出记录就必须重新返回结果集。2020/2/7第21页8.4预处理语句8.4.1核心知识_1Java提供了更高效率的数据库操作机制,就是PreparedStatement对象,该对象被习惯地称作预处理语句对象。1.预处理语句优点Connection连接对象con调用prepareStatement(StringSQL)方法对参数SQL指定的SQL语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在PreparedStatement对象sql中,PreparedStatementsql=con.prepareStatement(StringSQL)例如:StringSQL=SELECT*FROMchengji;PreparedStatementsql=con.prepareStatement(SQL);那么该对象sql调用下列方法都可以让数据库直接执行底层内部命令,ResultSetexecuteQuery()booleanexecute()intexecuteUpdate()例如:ResultSetrs=sql.executeQuery();只要编译好了PreparedStatement对象,那么该对象可以随时地执行上述方法,显然提高了访问数据库的速度。2020/2/7第22页8.4.1核心知识_22.使用通配符在对SQL进行预处理时可以使用通配符“?”代表字段的值,在预处理语句执行之前再设置通配符?所代表的值是多少。例如:sql=con.prepareStatement(SELECT*FROMcehngjiWHEREmath?);那么在sql对象执行之前,必须调用相应的方法设置通配符“?”代表的具体值,比如sql.setInt(1,90);指定上述预处理SQL语句中通配符“?”代表的值是90。◆voidsetInt(intparameterIndex,intx)可用来设置通配符代表的整数值,其中参数parameterIndex用来表示SQL语句中从左到右的第parameterIndex个统配符号,x是该统配符所代表的具体值。◆尽管sql=con.prepareStatement(SELECT*FROMcehngjiWHEREmathe?);sql.setInt(1,90);的功能等同于sql=con.prepareStatement(SELECT*FROMchengjiWHEREmath90);2020/2/7第23页8.4.2能力目标使用预处理语句查询记录、修改记录。2020/2/7第24页8.4.3任务驱动将Application8_6.java中的【代码】替换为程序代码。程序运行效果如图8.12。2020/2/7第25页任务小结预处理语句设置通配符“?”的值的常用方法有:voidsetDate(intparameterIndex,Datex)voidsetDouble(intparameterIndex,doublex)voidsetFloat(intparameterIndex,floatx)voidsetInt(intparameterIndex,intx)voidsetLong(intparameterIndex,longx)voidsetString(intparameterIndex,Stringx)2020/2/7第26页8.5标准化考试8.5.1核心知识可以用数据库中的表来存放标准化试题,表的一条记录存放一道题目的有关内容,比如,第一个字段是试题的内容,第2至5个字段分别存放供用户选择的答案,最后一个字段