JAVA数据库编程(10).ppt
第十章数据库应用软件工程学院主讲人:张昊1目标掌握使用掌握使用JDBC-ODBCJDBC-ODBC连接数据库连接数据库掌握对数据库的增、删、改、查操作掌握对数据库的增、删、改、查操作2数据库应用n n JDBC JDBC(J Java ava D DataataB Basease C Connectivityonnectivity)n nJavaJava数据库连接,是用于执行数据库连接,是用于执行数据库连接,是用于执行数据库连接,是用于执行SQLSQL语句的语句的语句的语句的JavaJava应用程序接口,由一组用应用程序接口,由一组用应用程序接口,由一组用应用程序接口,由一组用JavaJava语言编写语言编写语言编写语言编写的类与接口组成,的类与接口组成,的类与接口组成,的类与接口组成,n n用用用用JDBCJDBC写的程序能够自动地将写的程序能够自动地将写的程序能够自动地将写的程序能够自动地将SQLSQL语句传送语句传送语句传送语句传送给几乎任何一种数据库管理系统(给几乎任何一种数据库管理系统(给几乎任何一种数据库管理系统(给几乎任何一种数据库管理系统(DBMSDBMS)n n隔离了隔离了隔离了隔离了JavaJava与不同数据库之间的对话,使得程与不同数据库之间的对话,使得程与不同数据库之间的对话,使得程与不同数据库之间的对话,使得程序员只须写一遍程序就可让它在任何数据库管序员只须写一遍程序就可让它在任何数据库管序员只须写一遍程序就可让它在任何数据库管序员只须写一遍程序就可让它在任何数据库管理平台上运行理平台上运行理平台上运行理平台上运行3JDBC完成的功能:n与一个数据库建立连接与一个数据库建立连接n向数据库发送向数据库发送SQL语句语句n处理数据库返回的结果处理数据库返回的结果n关闭数据库连接关闭数据库连接4nJDBC的Driver可以分为4种类型JDBC-ODBCJDBC-ODBC桥接驱动程序桥接驱动程序 Native-APINative-API结合结合JavaJava驱动程序驱动程序 JDBC-NetJDBC-Net本地协议本地协议 Native ProtocolNative Protocol5lJava程序通过程序通过JDBC访问数据库的关系访问数据库的关系6n在这四种驱动器中,后两种“纯Java”的驱动器效率更高,也更具有通用性。n如果不能得到纯Java的驱动器,则可以使用前两种驱动器作为中间解决方案,因为它们比较容易获得,使用也较普遍。7n由微软公司提出,用于在数据库管理系统中存取数据n是一套用C语言实现的访问数据库的APIn通过ODBC API,应用程序可以存取保存在不同数据库管理系统中的数据,而不论DBMS使用了何种数据存储格式和编程接口n通过JDBC-ODBC桥来访问没有提供JDBC接口的数据库是一个常用的方案,使用这种方式使得JDBC有能力访问几乎所有类型的数据库ODBC(OpenDatabaseConnectivity)8n一个基本的JDBC程序开发包含如下步骤n设置环境,引入相应的JDBC类n选择合适的JDBC驱动程序并加载n建立与数据库的连接n对数据库进行操作n关闭数据库连接91设置环境,引入相应的JDBC类n在本机上安装有关数据库软件n下载相应数据库驱动程序并安装n在Java程序中引入相应的类和包。任何使用JDBC的源程序都需要引入java.sql包,如必要的时候还需要装载相应的JDBC-ODBC驱动程序的包import java.sql.*;import sun.jdbc.odbc.JdbcOdbcDriver;10n通过JDBC-ODBC桥访问数据库n安装 Java 和 JDBC APIn安装JDK的同时就自动安装了n安装数据库驱动程序n安装JDK的同时就自动安装了JDBC-ODBC桥驱动程序n安装 DBMSn建立一个数据库,并注册数据源11l1确定数据源名称和说明。依次进入本机的控制面板管理工具数据源(ODBC),弹出“ODBC数据源管理器”对话框,单击“系统DSN”选项卡,选择”Add”按钮12l2.单击“添加”按钮后弹出“创建数据源”对话框,选择“Microsoft AccessDriver”选项。单击“完成”按钮后,弹出“ODBC Microsoft Access安装”对话框,在“数据源名”输入框中填写“PIMS”;在“说明”输入中填写“员工信息管理系统”;单击选择按钮,弹出“选择数据库”对话框,在目录中选定刚刚建好的数据库文件“PMS.mdb”13l3.单击“高级”按钮,弹出“设置高级选项”对话框,在“登录名称”文本编辑框中设定登陆名称为“Test”,在“密码”文本编辑框中设定密码为“1234”。依次确定返回到“ODBC 数据源管理器”对话框,这时可以发现“系统数据源”选项中增添了一个新确定的数据源“PIMS”,单击“确定”按钮,就完成了数据源的注册142选择合适的JDBC驱动程序并加载n接下来要建立和DBMS的连接。包括两个步骤n装载驱动器装载驱动器,用Class.forName方法显式装载驱动程序,如:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);n这里“sun.jdbc.odbc.JdbcOdbcDriver”是驱动器类的名字n需要注意的是,驱动器类有可能不存在,使用此方法就可能会抛出ClassNotFoundException异常,因此需要捕获这个异常:try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);catch(ClassNotFoundException e)System.out.println(e.getMessage);15n例如,我们要连接上一节创建的数据源PIMS,语句如下:Connection con=DriverManager.getConnection(jdbc:odbc:PIMS,test,1234);nConnection是一个接口,表示与指定数据库的连接n调用DriverManager.getConnection()方法。3建立与数据库的连接建立与数据库的连接164对数据库进行操作n建立好数据库连接后,就可以对数据库进行操作了,一般包括如下三个步骤n使用Connection对象创建Statement对象Statement代表一个特定的容器,容纳并执行SQL语句n使用Statement对象执行SQL命令n从上一步骤返回的ResultSet对象中提取执行结果17n调用Connection接口的createStatement方法,可用来创建向数据库发送SQL语句的对象,用于执行简单的SQL语句:Statement stmt=con.createStatement();Statement stmt=con.createStatement(int resultSetType,int resultSetConcurrency);resultSetType:结果集的类型结果集的类型TYPE_FORWARD_ONLY告诉系统读取资料列时只向前卷动告诉系统读取资料列时只向前卷动.TYPE_SCROLL_SENSITIVE修改後马上反映在修改後马上反映在ResultSet中中.TYPE_SCROLL_INSENSITIVE修改後不反映在修改後不反映在ResultSetresultSetConcurrency:结果集的同步类型:结果集的同步类型CONCUR_READ_ONLY告诉系统将不修改告诉系统将不修改ResutlSetCONCUR_UPDATABLE告诉系统将会修改告诉系统将会修改ResutlSet创建Statement对象18nStatement 接口提供了执行 SQL 语句的方法nexecuteQueryn用于产生单个结果集的语句,例如 SELECT 语句 ResultSet rs=stmt.executeQuery(Select*From person);nexecuteUpdaten用于执行 INSERT、UPDATE 或 DELETE 语句,以及 CREATE TABLE stmt.executeUpdate(“delete from person WHERE name=李四);使用使用Statement对象执行对象执行SQL命令命令19n查询结果作为结果集(ResultSet)对象返回后,我们可以从ResultSet对象中提取结果n使用next方法nResultSet对象中含有检索出来的行,其中有一个指示器,指向当前可操作的行,初始状态下指示器是指向第一行之前n方法next的功能是将指示器下移一行。n方法previous将游标上移一行提取执行结果提取执行结果20n使用getXXX()方法可以从当前行的指定列中从当前行的指定列中获取字段的值。n取String类型数据时就要用getString方法,而提取FLOAT类型数据的方法是getFloat()n允许使用列名或列序号作为getXXX方法的参数nString s=rs.getString(Name);nString s=rs.getString(2);/提取当前行的第2列数据使用使用getXXX方法方法21执行基本的SQL语句n在SQL语言中,对数据库中数据的操作可分为读写两种n读操作(查询)通过SELECT语句实现,该语句的执行不会改变数据库中的数据n涉及到写操作的语句共有3个nINSERTnUPDATEnDELETE22n向指定表中插入一条记录。insert into table_name values(value1,value2,.)n例如在person表中插入一行insert into person values(1,张三,3000,3);插入语句插入语句23n修改指定记录中某列的值n其格式为update table_name set column_name=new_valueWHERE column_name=some_valuen例如:将person表中id号为1的人员的工资修改为3700元update person set salary=3700 /指定对哪列进行修改、如何修改where id=1;/选择要修改的行 修改语句修改语句24删除表中的指定的数据n其格式为delete from table_name where column_name=some_valuen例如删除部门号为4的员工记录delete from person where department=4;删除语句删除语句25n从指定表中取出指定的数据SELECT select_list FROM table_source WHERE search_condition ORDER BY order_expression ASC|DESC 查询语句查询语句26n如:查询工资大于2000的员工的姓名及编号SELECT id,nameFROM person /从person表中查询WHERE salary2000 ;/查询条件27limport java.sql.*;lpublic class dbcon lpublic static void main(String args)throws Exception l Connection con=null;l Statement stmt=null;l ResultSet rs=null;ltryl Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);l/加载驱动器加载驱动器 lcon=DriverManager.getConnection(jdbc:odbc:PIMS,“test,1234);/连接数据库连接数据库lstmt=con.createStatement();/创建创建Statement对象对象通过通过JDBC访问访问PIMS数据库,进行查询、添加操作数据库,进行查询、添加操作28l rs=stmt.executeQuery(Select*From person);/查询表查询表lwhile(rs.next()/显示所有记录显示所有记录l System.out.print(rs.getInt(id)+);l System.out.print(rs.getString(name)+);l System.out.print(rs.getDouble(salary)+);l System.out.print(rs.getInt(department)+);l System.out.print(n);l;29lstmt.executeUpdate(insert into person values(12,王五王五,2800,4);/添加一条记录添加一条记录l System.out.println(添加后信息添加后信息);l rs=stmt.executeQuery(Select*from person);/查查询表格询表格l while(rs.next()/显示显示l System.out.print(rs.getInt(id)+);l System.out.print(rs.getString(name)+);l System.out.print(rs.getDouble(salary)+);l System.out.print(rs.getInt(department)+);l System.out.print(n);l ;30l stmt.executeUpdate(update person set salary=8000 where Name=王五王五);l System.out.println(更新后更新后);lrs=stmt.executeQuery(Select*From person);l/查询表格查询表格l while(rs.next()/显示显示l System.out.print(rs.getInt(id)+);l System.out.print(rs.getString(name)+);l System.out.print(rs.getDouble(salary)+);l System.out.print(rs.getInt(department)+);l System.out.print(n);l ;31lstmt.executeUpdate(delete from person where Name=王王五五);l System.out.println(删除后删除后);lrs=stmt.executeQuery(Select*From person);l/查询表格查询表格l while(rs.next()/显示显示l System.out.print(rs.getInt(id)+);l System.out.print(rs.getString(name)+);l System.out.print(rs.getDouble(salary)+);l System.out.print(rs.getInt(department)+);l System.out.print(n);l ;32l rs.close();/关闭语句关闭语句l stmt.close();/关闭语句关闭语句l con.close();/关闭连接关闭连接lcatch(Exception e)l l 33