460 likes | 662 Views
Java 程序设计. 单元十二 数据库编程. 内容. 教学目标. 学习内容. 课后作业. 能力训练. 单元实践. 本章小结. 教学目标. 一、专业能力: 应知: 1 、了解 JDBC 与 ODBC 2 、了解 JDBC 体系结构 应会: 1 、掌握 JDBC 驱动的配置方法 2 、掌握在 Eclipse 中通过 JDBC 访问 SQL Server 数据库的方法 3 、掌握使用 JDBC 设计数据库管理程序的方法. 二、方法能力:
E N D
内容 教学目标 学习内容 课后作业 能力训练 单元实践 本章小结
教学目标 一、专业能力: 应知: 1、了解JDBC与ODBC 2、了解JDBC体系结构 应会: 1、掌握JDBC驱动的配置方法 2、掌握在Eclipse中通过JDBC访问SQL Server数据库的方法 3、掌握使用JDBC设计数据库管理程序的方法 二、方法能力: 学会学习、学会工作;培养科学的思维方法、开拓创新的精神和严谨的工作作风;拓展自我天赋、可持续发展能力和创造性解决问题的能力。 三、社会能力: 学会合作,学会做人,与他人和谐相处;具有良好的团队精神、职业道德和社会责任感。
重点难点 • 重点: 1、JDBC的连接方法 2、数据操作(录入/修改/查询)的过程及方法 • 难点: 1、JDBC的连接方法 2、数据操作(录入/修改/查询)的过程及方法
学习内容 任务一 :使用JDBC连接数据库 任务二 :建立数据源 任务三 :数据库编程
12.1 任务一 使用JDBC连接数据库 12.1.1 JDBC简介 1.JDBC概述 JDBC(Java Database Connectivity,即Java数据库连接),是一种在Java应用程序中访问数据库的综合技术,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成,主要提供三方面的功能:建立同数据库的连接,然后向数据库发送SQL语句,处理从数据库中返回的SQL执行结果。
JDBC在Web和Internet应用程序中的作用和ODBC在 Windows系列平台应用程序中的作用类似,但ODBC只针对Windows平台,而且ODBC需要在客户机上安装和注册,因而维护成本相对较大。而JDBC是由Java语言编写的,使得JDBC代码可在所有Java平台上运行,这样使得程序的可移植性和安全性显著提高了。 应用程序通过相应接口(API)访问数据库,JDBC是Java应用程序访问数据库的通用接口,称为JDBC API。
Java数据库应用程序 JDBC API JDBC驱动程序管理器 JDBC Driver API JDBC驱动器 数据库DBMS SQL命令 使用JDBC来完成对数据库的访问包括以下四个主要组件: Java的应用程序、JDBC驱动器管理器、驱动器和数据源。 图 12-1 JDBC框架图
2.JDBC的结构 (1)、面向应用程序设计的JDBC API:它主要是由一系列的接口组成,通过调用此API从而实现连接数据库、执行SQL语句并返回结果集等编程数据库的能力,如: java.sql.DriveManager:该接口主要定义了用来处理装载驱动程序并且为创建新的数据库连接提供支持。 java.sql.Connection:该接口主要定义了实现对某一种指定数据库连接的功能。 java.sql.Statement:该接口主要定义了在一个给定的连接中作为SQL语句执行声明的容器以实现对数据库的操作。它主要包含有如下的两种子类型。 java.sql.PreparedStatement:该接口主要定义了用于执行带或不带 IN 参数的预编译 SQL 语句。
java.sql.CallableStatement:该接口主要定义了用于执行数据库的存储过程的雕用。java.sql.CallableStatement:该接口主要定义了用于执行数据库的存储过程的雕用。 java.sql.ResultSet:该接口主要定义了用于执行对数据库的操作所返回的结果集。 (2)、面向数据库厂商的JDBC Drive API : 数据库厂商必须提供相应的驱动程序并实现JDBC API所要求的基本接口(每个数据库系统厂商必须提供对DriveManager、Connection、Statement、ResultSet等接口的具体实现),从而最终保证Java程序员通过JDBC实现对不同的数据库操作。
12.1.2 JDBC驱动 目前比较常见的JDBC驱动程序可分为以下四个种类型: 1.JDBC-ODBC桥接 通过JDBC-ODBC桥接可以很容易地使用JDBC访问ODBC数据源。JDBC-ODBC 桥接方式是利用微软的开放数据库互连接口(ODBC API)同数据库服务器通讯的,它要求客户端上都要安装ODBC驱动,同时还要求配置ODBC数据源。这种连接方式虽然简单但效率低。这种类型的驱动程序最适合于企业网络,或者是用Java编写的三层结构的应用程序服务器代码。 2.部分Java的本地API驱动程序 这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。它比第一种驱动要快。
3.JDBC网络纯Java驱动程序 这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。通常,这是最为灵活的JDBC驱动程序。此种驱动很适合Internet应 4.本地协议纯Java驱动程序
12.2 任务二 建立数据源 12.2.1 建立Access数据库 1.ACCESS数据库的设计 在设计数据库时要确定设计数据库的目的、库中需要的表及表中需要的字段。每张表只包含关于一个主题的信息,在设计表时,应注意: • 明确有唯一值的字段 • 确定表间的关系 • 优化设计 • 添加数据和新建其他数据库对象 根据用户需求,表的结构设计完成后,就可以继续创建所需的任何查询、窗体、报表、宏和模块等。
2.表的创建及操作 Access提供了四种创建空表的方法: (1)、使用数据库向导,可以在一个操作中创建整个数据库所需的全部表、窗体及报表。数据库向导用于新建数据库,但不能用来将新表、窗体或报表添加到已有的数据库中。 (2)、使用表向导来选择表的字段,这些字段可以从各种各样预先定义好的表中选择。 (3)、将数据直接输入到空白的数据表中。当保存新的数据表时,Access将分析数据并且自动为每一字段指定适当的数据类型及格式。 (4)、使用“设计”视图从无到有指定表的全部细节。创建了数据表后,可以针对表进行添加记录 、定位记录 、编辑数据 、插入记录、选择记录、删除记录和记录的复制等操作了。
12.2.2 建立数据源 1.在window xp系统中,单击【开始】->【设置】->【控制面板】->【管理工具】 。 2.在弹出的窗口中双击打开【数据源ODBC】应用程序图标,再在打开的【ODBC数据源管理器】窗口中选择【系统DSN】标签。 3.单击【添加】按钮,在弹出的对话框中选择【Microsoft Access Driver (*.mdb) 】标签。 4.点击【完成】后,在弹出的Access数据源设置对话框中,输入【数据源名】为”mylibDB”,然后单击【选择】按钮,找到刚才建立的数据库(即E盘jpp文件夹下的library.mdb文件),选中它并确定即可。(如果想设置访问密码,可以单击【高级】按钮,会弹出“高级设置选项”对话框)。 5.单击确定后,ODBC数据源的设置就完成了。
12.3 任务三 数据库编程 12.3.1 数据库编程过程 1.JDBC数据库编程用到的相关类和接口 (1)、DriverManager类: 负责管理JDBC驱动程序。使用JDBC驱动程序之前,必须先将驱动程序加载并向DriverManager注册后才可以使用,同时提供方法来建立与数据库的连接。 方法如下: Class.forName(String driver):加载注册驱动程序 。 Static Connection getConnection(String url,String user,String password) throws SQLException:取得对数据库的连接 。 Static Driver getDriver(String url) throws SQLExcetion:在已经向DriverManager注册的驱动程序中寻找一个能够打开url所指定的数据库的驱动程序。
(2)、Connection类 Connection对象是通过DriverManager.getConnection()方法获得的,主要负责维护JSP/JAVA数据库程序和数据库之间的联机,建立Java程序与数据库之间的连接,并生成三个非常有用的类对象:Statement类对象、DatabaseMetaData类对象和PreparedStatement类对象。 建立Statement类对象的方法如下: • Statement createStatement() throws SQLException; • Statement createStatement(int resultSetType,int resultSetConcurrency) throws SQLException; • 建立DatabaseMetaData类对象的方法如下 : • DatabaseMetaData getMetaData() throws SQLException; 建立PreparedStatement类对象的方法如下: • PreparedStatement prepareStatement(String sql) throws SQLException;
(3)、Statement类 Statement类用于将SQL语句发送到已连接的数据库中,通过Statement类所提供的方法(见表12-4),可以利用标准的SQL命令,对数据库直接新增、删除或修改等操作。 (4)、PreparedStatement类 PreparedStatement类和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待使用,当有单一的SQL指令比多次执行时,用PreparedStatement类会比Statement类有效率。
(5)、DatabaseMetaData类 DatabaseMetaData类保存了数据库的所有特性,并且提供许多方法(见表12-6)来取得这些信息。 (6)、ResultSet类 ResultSet类是Statement类招待SQL语句后生成的记录集。可以认为它是一个二维的表格,主要负责存储查询数据库的结果。并提供一系列的方法(见表12-7)对数据库进行新增、删除和修改操作。也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。 (7)、ResultSetMetaData类 ResultSetMetaData类对象保存了所有ResultSet类对象中关于字段的信息,提供许多方法(见表12-8)来取得这些信息:
2. 数据库访问过程 (1)、 首先装载驱动程序 装载驱动程序DriverManager类使用Class类的forName方法。语法如下: Class.forName("<driver>")或Class.forName("<driver>").newInstance() 根据需要装载的驱动的不同,具体方法也不同。这里是加载ODBC-JDBC桥接的例子: String jdbcDriver="sun.jdbc.odbc.JdbcOdbcDriver" try { Class.forName(jdbcDriver); }catch(java.lang.ClassNotFoundException e) { System.out.println("类未找到错误!"+e); } 注意: 装载驱动程序要处理异常。
(2)、 建立连接 指定装载的数据库驱动程序后,可用DriverManager类来进行数据源或数据库的连接。DriverManager类是JDBC基础,用来管理JDBC驱动程序。该类有静态的getConnection()方法,用于验证JDBC数据源,并返回接口Connection对象。 使用JDBC-ODBC桥接器的例子: Connection con = DriverManager.getConnection ("jdbc:odbc:mylibDB"); 其中的"mylibDB"为建立的数据源的名称。
根据需要装载的驱动的不同,具体的连接方法也不同。根据需要装载的驱动的不同,具体的连接方法也不同。 A、这里是加载mySQL JDBC驱动程序 Class.forName("org.gjt.mm.mysql.Driver ").newInstance(); String url="jdbc:mysql://localhost/myDB? user=mymouse&password=mouse2008&useUnicode=true&characterEncoding=8859_1" Connection con=DriverManager.getConnection(url)
B、装载Oracle JDBC OCI驱动程序(用thin模式) Class.forName("oracle.jdbc.driver.OracleDriver "); String url="jdbc:oracle:thin:@localhost:1521:orcl“; String user="bigmouse"; String password="mouse"; Connection con=DriverManager.getConnection(url,user,password); 注意:也可以通过con.setCatalog("MyDatabase")来加载数据库。
C、装载DB2驱动程序 Class.forName("COM.ibm.db2.jdbc.app.DB2Driver ") String url="jdbc:db2://localhost:5000/mydata"; // mydata为你的数据库名 String user="admin"; String password=""; Connection con= DriverManager.getConnection(url,user,password);
D、装载MicroSoft SQLServer驱动程序 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=bookstore"; // bookstore为你的数据库 String user="book"; String password=""; Connection con= DriverManager.getConnection(url,user,password);
(3)、 获取数据库信息和创建接口Statement对象 数据库连接成功后,可以使用Connection对象的getMetaData方法取得接口DatabaseMetaData(提供大量的方法)对象来了解数据源或数据库的各种信息。 数据库连接成功后,还可以使用向数据库发送访问数据库的SQL语句的方法来存取数据库。JDBC使用接口Statement的对象(或执行数据库存储过程的子接口CallableStatement、发送带参数的SQL语句的子接口PreparedStatement)来发送SQL语句,Statement对象可用Connection的方法createStatement()来返回。例如: Statement st = con.createStatement();
(4)、 执行SQL语句以存取数据库 希望执行的SQL语句串作为Statement的方法execute()等的参数向数据库传送,以交给数据库引擎,执行SQL对数据库的访问操作。对数据库访问结果是一个数据表的情况,可将这个表(结果集)存入接口ResultSet的对象。 提交SQL语句的Statement的方法有execute、executeQuery和executeUpdate等,分别用于不同类型的SQL语句的提交。 • executeQuery:用于产生单个结果集的语句,如查询语句select。 • executeUpdate:用于执行不产生结果集的语句,如insert,delete,update等。 • execute:可用于执行产生多个结果集或对数据库进行多个操作的SQL语句。
(5)、 对执行SQL语句的结果进行处理 Statement对象将SQL语句封装起来交给数据库引擎,执行select查询语句,将得到结果集ResultSet对象(注意:执行insert、delete、update等查询语句无结果集)。 接口ResultSet对象封装了执行SQL语句的返回结果,以后可根据需要,以便在屏幕上显示结果或做进一步的处理。 在执行select语句后的返回结果中,包含了数据表和数据表内容的相关信息。关于数据表的信息可通过ResultSet的getMetaData方法来创建ResultSetMetaData对象,由这个对象可获取所需数据库的信息。
例如: ResultSetMetaData rsmd = rs.getMetaData(); rsmd.getColumnCount() // 获取列(字段)数 rsmd.getColumnName(列号) // 获取指定列(字段)的列名 在ResultSet中,提供了一整套的getXXX方法(如getInt,getString,getFloat,getDouble等)来访问结果集中当前行的不同列(用列序号或列标题作为这些方法的参数)的数据(类型不同时可将字段类型按照XXX类型来进行类型转换),而next方法可使得访问可对不同的行来进行。
例如,可用下面的程序段对book表的书名(name)和作者(author)进行访问: ResultSet rs = st.executeQuery( “select name,author from book"); while(rs.next()){ System.out.println(rs.getString(name) +" " + rs.getString(3)); }
ResultSet自动维护结果集当前数据行的指向光标,首先获得结果集时,指向光标置于结果集的第一行前,以后每调用一次next方法,光标就向下移动一行,这样可按照顺序从第一行到最后一行逐行访问结果集的每一行(访问结束时next返回false值)。 在有些情况下,可能希望任意访问而不是顺序访问结果集的数据行,对某些结果集,可能还希望通过结果集修改数据库的数据,则应在createStatement 方法中加入如下的两个参数,即: Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
如果只希望任意滚动结果集的指向光标,而不修改数据库的数据,则可在上述两个参数中将第二个参数设置为ResultSet.CONCUR_READ_ONLY。 通过参数的设置,就可以用ResultSet的first,last,previous,absolute,relative等方法来设置当前行,并且还可以根据参数的更新设置,用insertRow(插入行)、deleteRow(删除行)、updateRow(更新行)等方法来对数据库表进行增、删、改的操作。 (6)、 关闭连接 数据库访问结束,为保证数据库数据的完整性和释放系统资源,应明确地关闭数据库的连接:一般是关闭结果集、关闭数据库访问对象和关闭连接。
12.3.2 数据库编程实例 1.查询数据库举例 利用前面创建的数据库library.MDB和数据源mylibDB来对数据库中的表book进行查询,显示表中所有图书的编号(no)、书名(name)、作者(author)、出版日期(printdate)和版次(times)。 【例12-2】查询数据库举例。 import java.sql.*; class jdbccx{ public static void main(String args[]){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(ClassNotFoundException ce){ System.out.println("SQLException:"+ce.getMessage()); }
try{ Connection conn= DriverManager.getConnection("jdbc:odbc:mylibDB"); Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery("select * from book"); while(rs.next()) { System.out.println(“编号:”+rs.getString(“no”)+“\t”+ “书 名:"+rs.getString("name")+"\t"+"作者:"+rs.getString ("author")+"\t"+"出版日期:"+rs.getDate(4)+"\t" +"印刷次数:"+rs.getInt(5)+"\t"+"价格:"+rs.getFloat(6)); } rs.close(); stmt.close(); }catch(SQLException ce){ System.out.println("SQLException"+ce.getMessage()); } } }
【程序解析】 (1)、首先引入包:java.sql中的所有类。 (2)、利用查询语句:select*from book查询表中的记录,查询结果保存在结果集rs中。 (3)、通过while循环,将查询结果中的每一行记录显示在屏幕上。 (4)、 取得rs中的列值时,可以使用方法getXXX(列名),如程序中的rs.getString(“no”);表示取得列名为“no”的数据。XXX取决于该列的数据类型。如果该列为字符串型,则使用getString(),如果该列为整型,则使用getInt(),如果该列为浮点型,则使用getFloat()。 (5)、有时候,使用方法getXXX(列名)时,参数可以不使用列名,可以使用列的序号。 (6)、注意捕获例外,见程序中的几种例外类型。 (7)、程序中,在while循环体中“\t”表示水平制表 (8)、在实际查询中,往往只要查询数据库中的一些特定数据,而不要查询整个表中的所有记录,使用参数查询数据库可以实现按条件查询,SQL查询语句SELECT中,应用条件选项WHERE实现有条件地查询。
2.插入记录举例 通过Java程序,可以向数据库中的表student中插入记录。 见书【例12-3】插入记录举例。 【程序解析】 (1)、插入记录使用方法是executeUpdate(),此方法不产生结果集。 (2)、需要注意的是:向表中插入记录只允许插入不重复的记录。 (3)、A行也可以改成: PreparedStatement pstmt=conn.prepareStatement("insert into book values(?,?,?,?,?,?)"); pstmt.setString(1,"85492"); pstmt.setString(2,"java2实务"); pstmt.setString(3,"杜江"); pstmt.setDate(4,Date.valueOf("2008-12-12")); pstmt.setInt(5,4); pstmt.setFloat(6,34.5f); pstmt.executeUpdate(); 用PreparedStatement语句时,可使用“占位符”—?来表示SQL命令中可变部分提高效率。setXXX()方法中的第一个参数是所对应“?”的参数序号,第二个参数是“?”代表的参数的值。
3.修改记录举例 修改表book中的第1条记录:将java程序设计的no改为20090110。 【例12-4】修改记录举例。
4.删除记录举例 【例12-5】将表book中的作者是杜江的图书记录。
5.建立表举例 不但可以在数据库中创建表,也可以在程序中通过JDBC来建立一个新表,建立表包括建立的表的结构和记录。例如,建立表publishing,表结构有press(出版社)和num(销量),然后向表中插入如下两条记录: 清华大学 ,120000000 中国水利水电,110000000
【例12-6】建立表举例。 import java.sql.*; class jdbcjianlibiao{ public static void main (String args[]){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(ClassNotFoundException ce){ System.out.println("SQLException:"+ce.getMessage()); } try{ Connection conn= DriverManager.getConnection("jdbc:odbc:mylibDB"); Statement stmt=conn.createStatement(); //建立表的表结构 //stmt.executeUpdate("delete table publishing"); String sql="create table publishing(press char(40),num long)"; stmt.executeUpdate(sql); //插入两条记录
sql="insert into publishing (press,num)values('清华大学',120000000)";// stmt.executeUpdate(sql); sql="insert into publishing values('中国水利水电',110000000)"; stmt.executeUpdate(sql); //显示查询结果 ResultSet rs=stmt.executeQuery("select * from publishing"); while(rs.next()){ System.out.println("出版社:"+rs.getString("press")+"\t"+ "销售数量:"+rs.getInt("num")); } rs.close(); stmt.close(); }catch(SQLException ce){ System.out.println("SQLException:"+ce.getMessage()); } } }
课后作业 • 一个简单的用户管理系统学习。 程序功能如下: • 用户登录:用户输入用户名和密码后,如果在数据库中找到相应的记录,则显示登录成功,否则显示登录失败。 • 用户注册:在输入用户名和密码后,如果在数据库中找到同名用户的记录,则显示注册失败,否则将用户名和密码插入到数据库表中,并显示注册成功。 • 修改密码:输入用户名、旧密码和新密码后,如果在数据库中找到用户名和密码正确的记录,则用新密码替换旧密码,并显示修改成功,否则显示修改失败。
能力训练 实训:完成学籍管理系统。 • 实训内容改进学籍管理系统,学生信息存入数据库中,实现数据库编程过程。 • 实训目的熟练进行数据库编程操作。 • 实训过程
单元实践 实训:数据库编程 • 实训内容要求读者编写一个有关JDBC数据库技术的应用程序:实现数据库的添加、删除、修改等简单操作。运用前面所用的编程技能,正确的编写此应用程序。 • 实训目的熟练进行数据库编程操作。 • 实训过程
本章小结 本章首先介绍了JDBC的基本概念及JDBC的工作原理,掌握了四种JDBC驱动程序类型及JDBC API 几个重要的类及接口,重点介绍数据库的连接及编程过程,学会用几个重要的对象编写加载数据库驱动和连接数据库的Java程序和应用Java.sql包中的类和接口编写操作数据库的应用程序。