450 likes | 664 Vues
第 15 章. 数据库编程. 15.1 数据库简介 15.2 使用 JDBC 连接数据库 15.3 建立数据源 15.4 Java 数据库编程. 15-1 数据库简介. 数据库是长期存储在计算机内的、有组织的、可共享的数据集合。在当今的信息时代,数据库无处不在。本章介绍 Java 的数据库功能。. 15-1-1 关系型数据库. 数据库是管理和组织信息和数据的综合系统,关系型数据库是目前使用最为广泛的数据库系统,在各领域中得到了广泛使用。
E N D
第15章 数据库编程
15.1 数据库简介 • 15.2 使用JDBC连接数据库 • 15.3 建立数据源 • 15.4 Java数据库编程
15-1 数据库简介 数据库是长期存储在计算机内的、有组织的、可共享的数据集合。在当今的信息时代,数据库无处不在。本章介绍Java的数据库功能。
15-1-1 关系型数据库 数据库是管理和组织信息和数据的综合系统,关系型数据库是目前使用最为广泛的数据库系统,在各领域中得到了广泛使用。 目前广泛使用的大型关系型数据库产品有Oracle,Sybase,DB2和SQL Server。除此之外,小型关系型数据库产品Access、MySQL和Visual FoxPro也使用得较多。
15-1-1 关系型数据库(续) 关系型数据库中以表为单位来组织数据,表是由行和列组成的二维表格。 表由结构和记录两部分组成。表结构对应表头信息,包括表所包含的列名、数据类型和数据长度等信息。列也称为字段。 记录是表中除结构外的各行数据。每一行称为一条记录,每条记录由若干个域组成。一个域对应表中的一列。每个域的数据要符合所在列数据类型的规定。
15-1-2 SQL简介 结构化查询语言SQL(Structured Query Language)是所有关系型数据库都支持的一种统一的数据库语言,在Java中对数据库操作是通过SQL语言来实现的。利用SQL可以非常方便地建立数据库表、查询数据,给数据库中输入新数据、修改数据及删除数据等。
1.定义表 要建立表,首先需建立表结构。建立数据库中表结构的语句为: CREATE TABLE 表名(列名1 数据类型1 [条件1],列名2 数据类型2 [条件2],┅ ) 如建立表15-1所对应的职工信息表employee的结构,可以使用如下的SQL语句: CREATE TABLE employee ( no char(4) not null, name char(8), sex char(2), salary float);
2.查询 利用SELECT语句从数据库中查询信息,其句型如下: SELECT 列名1, 列名2, ┅ FROM 表名1,表名2,┅ [ WHERE 条件] 例如,查询表employee中男性职员的信息,使用语句: SELECT no, name, sex, salary FROM employee WHERE sex=‘男‘;
如要查询salary在700以上职员的no和name信息,使用语句:如要查询salary在700以上职员的no和name信息,使用语句: SELECT no, name FROM employee WHERE salary>700;
3. 插入 利用INSERT语句向表中插入记录,INSERT语句的格式如下: INSERT INTO 表名 VALUES (列1值,列2值,┅) 如要向表employee中插入一条记录,其no,name,sex,salary的值分别为: 1020、孙红军、男、575.50 使用如下的INSERT语句: INSERT INTO employee VALUES(‘1020’, ‘孙红军’, ‘男’, 575.50);
4. 删除 要删除表中的一条或多条记录,可以使用DELETE语句,其格式如下: DELETE FROM 表名 WHERE 条件 例如,要删除表employee中no值为1004的记录,语句如下: DELETE FROM employee WHERE no=‘1004’;
5. 修改 要修改表中的记录,可以使用UPDATE语句,其格式如下: UPDATE 表名 SET 列名1=值1, 列名2=值2,┅ WHERE 条件 例如,要将employee中,no为1004职员的name改为“王大海”,salary改为800,其语句如下: UPDATE employee SET name="王大海", salary=800 WHERE no="1004";
15-2 使用JDBC连接数据库 15-2-1 JDBC简介 在Java程序中,连接数据库采用JDBC(Java Database Connectivity)技术。 JDBC是由Sun公司提供的与平台无关的数据库连接标准,它将数据库访问封装在少数几个方法内,使用户可以极其方便地查询数据库、插入新的数据、更改数据。 JDBC是一种规范,目前各大数据库厂商基本都提供JDBC驱动程序,使得Java程序能独立运行于各种数据库之上。
15-2-1 JDBC简介(续) JDBC提供的主要接口有: • java.sql.DriverManager:用于驱动程序的调入。 • java.sql.Connection:与特定数据库建立连接。 • java.sql.Statement:用于SQL语句的执行,包括查询语句、更新语句、创建数据库语句等。 • java.sql.ResultSet:用于保存查询所得的结果。
15-2-2 JDBC驱动程序 JDBC驱动程序有4类 • JDBC-ODBC桥驱动程序 • 原生API结合JAVA驱动程序 • 网络协议搭配完整的JAVA驱动程序 • 原生协议搭配完整的JAVA驱动程序
1.JDBC-ODBC桥驱动程序 Sun公司在Java 2中免费提供JDBC-ODBC桥驱动程序,供存取标准的ODBC数据源。如用来存取Microsoft Access数据库、Visual FoxPro 数据库等。
2.原生API结合Java驱动程序 这类驱动程序将JDBC的调用转换成个别数据库系统的原生码调用,由于使用原生码,任何错误都可能使服务器死机。
3.网络协议搭配完整的Java驱动程序 这类驱动程序将JDBC调用转换成个别数据库系统的独立网络协议,再转换成个别数据库系统的原生码调用。这类驱动程序最具弹性,最适合applet程序的开发,不过要考虑安全性及防火墙等额外负担。
4.原生协议搭配完整的Java驱动程序 这类驱动程序全由Java写成,利用随数据库而异的原生协议直接与数据库沟通,不用通过中介软件,它是属于专用的驱动程序,要靠厂商直接提供。
15-3 建立数据源 使用第1类驱动程序连接数据库,需要首先建立数据源。本节以国内广泛使用的Windows 2000操作系统和Microsoft Access 2000数据库为例,说明数据源的建立方法。
15-3-1 建立数据库 数据源是连接到数据库的接口,要建立数据源首先需建立数据库。 1.建立数据库 2.建立表的结构 3.输入记录
15-3-2 建立数据源 • 单击“开始”按钮,选择“设置”菜单中的“控制面版”,出现控制面板窗口。 • 在控制面板窗口中,双击“管理工具”图标,出现“管理工具”窗口。 • 在“管理工具”窗口中,双击“数据源(ODBC)”图标,出现“ODBC数据源管理器”窗口,选择“系统DSN”选项卡。 • 单击“添加”按钮,出现“创建新数据源”对话框,让用户选择数据源的驱动程序。
15-3-2 建立数据源(续) • 选择“Microsoft Access driver(*.mdb)”,并单击“完成”按钮,出现“ODBC Microsoft Access安装”对话框。让用户输入数据源的名称、简短说明及数据库。 • 在“数据源名”文本框中输入数据源的名称,在“说明”文本框中输入对数据源的简短说明。本例中,分别输入myDB和“职员数据库”。 • 单击“选择”按钮,出现“选择数据库”对话框。让用户选择数据库的存放位置和名称。
15-3-2 建立数据源(续) • 在“驱动器”下拉列表框中选择数据库所在的驱动器,在“目录”下拉列表框中选择数据库所在的目录,在“数据库名”列表框中选择数据库的名称。 • 单击“确定”按钮,完成数据库的选择,回到“ODBC Microsoft Access安装”对话框。 • 如果要设置数据库的用户名和密码,单击“高级”按钮,出现“设置高级选项”对话框, • 单击“确定”按钮,完成数据源的建立。
15-4 Java数据库编程 本节首先介绍数据库编程的一般过程,然后通过几个有代表性的实例介绍数据库编程方法。
15-4-1 数据库编程的一般过程 • 加载驱动程序 要连接数据库,首先要加载JDBC驱动程序。加载JDBC驱动程序的语句如下: Class.forName(JDBC驱动程序名) 例如,要加载JDBC-ODBC桥驱动程序,使用以下语句; Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”) 使用JDBC-ODBC桥驱动程序,可以通过ODBC数据源连接数据库。
连接数据库 加载了JDBC驱动程序后,便可以连接数据库了。连接数据库使用以下语句; Connection 连接变量=DriverManager. getConnection(数据库URL,用户帐号, 用户密码) 例如Connection conn=DriverManager. getConnection(“jdbc:odbc:myDB”, “li”, “1234”) 如果连接成功,对数据库的任何操作都可以通过conn来进行了。
执行SQL 要对连接的数据库进行查询、更改或添加数据,可通过SQL语句。执行SQL语句需要建立SQL语句(Statement)对象变量。建立SQL语句变量的句型如下: Statement SQL语句变量=连接变量. createStatement() 如已经建立了连接变量conn,可以用下面的语句建立SQL语句变量stmt: Statement stmt=conn.CreateStatement() 建立了SQL语句变量,便可以执行SQL语句。使用下列语句: rs=stmt.executeQuery("SELECT * FROM employee WHERE sex=’男’ ”) ResultSet对象以类似表中记录的组织方式来组织查询到的结果。使用下列的循环语句对查询结果逐行处理。 while (rs.next()) { 对每行记录进行处理 }
关闭连接 对数据库操作完成后,应该将与数据库的连接关闭。关闭连接使用的方法是close()。其句型是: 连接变量.close() 例如,要关闭前面建立的连接conn,使用以下语句: conn.close() 执行完SQL语句,还应该将SQL语句变量关闭。同样,如果执行的是查询语句SELECT,执行完后,还应该关闭结果集。
15-4-2 数据库编程实例 1 查询数据库 例:查询数据库 假定对数据库myDB.mdb已经建立了数据源myDB,myDB.mdb中有一个表employee。该实例利用JDBC-ODBC桥驱动程序,访问Access数据库myDB.mdb,显示表中所有职员的no(编号)、name(姓名)、sex(性别)和salary(工资)。 import java.sql.*; class Query { public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { System.out.println("SQLException:"+ce.getMessage()); }
try { Connection con = DriverManager.getConnection("jdbc:odbc:myDB"); Statement stmt = con.createStatement(); ResultSet rs=stmt.executeQuery("select * from employee"); while (rs.next()) { System.out.println( "编号" + rs.getString(no) + "\t" + "姓名 " + rs.getString(name) + "\t" + "性别 " + rs.getString(sex) + "\t" + "工资 " + rs.getFloat(salary) ); } rs.close(); stmt.close(); } catch (SQLException e) { System.out.println("SQLException:"+e.getMessage()); } } }
2.插入记录 假定对数据库myDB.mdb已经建立了数据源myDB,myDB.mdb中有一个表employee,该实例利用JDBC-ODBC桥驱动程序,访问Access数据库myDB.mdb,在表中插入2条记录,其数据分别为:2001,邢雪花,女,650和2020,翟建设,男,746。 import java.sql.*; class Insert1 { public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { System.out.println("SQLException:"+ce.getMessage()); }
try { Connection con = DriverManager.getConnection("jdbc:odbc:myDB","li","1234"); Statement stmt = con.createStatement(); String sqlstr = "insert into employee values('2001', '邢雪花','女',650)"; stmt.executeUpdate(sqlstr); stmt.executeUpdate("insert into employee values('2020','翟建设','男',746)"); stmt.close(); con.close(); } catch (SQLException e) { System.out.println("SQLException:"+e.getMessage()); } } }
3.修改记录 该实例利用JDBC-ODBC桥驱动程序访问Access数据库myDB.mdb,修改表中2条记录,将name为翟建设的记录的no改为3000,将no值为2001记录中的salary改为900。 import java.sql.*; class Update1 { public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { System.out.println("SQLException:"+ce.getMessage()); }
try { Connection con = DriverManager.getConnection("jdbc:odbc:myDB","li","1234"); Statement stmt = con.createStatement(); String sql = "update employee set no= '3000'" + "where name= '翟建设'"; stmt.executeUpdate(sql); sql = "update employee set salary=900 "+"where no = ‘2001'"; stmt.executeUpdate(sql); stmt.close(); con.close(); } catch (SQLException e) { System.out.println("SQLException:"+e.getMessage()); } } }
4. 删除记录 该实例利用JDBC-ODBC桥驱动程序,访问Access数据库mdDB.mdb,删除employee表中no值为1004的记录。 import java.sql.*; class Delete { public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { System.out.println("SQLException:"+ce.getMessage()); }
4. 删除记录(续) try{ Connection con = DriverManager.getConnection("jdbc:odbc:myDB","li","1234"); Statement stmt = con.createStatement(); String sql = "delete from employee where no=‘1004'"; stmt.executeUpdate(sql); stmt.close(); con.close(); } catch (SQLException e) { System.out.println("SQLException:"+e.getMessage()); } } }
5. 建立表 该实例利用JDBC-ODBC桥驱动程序访问Access数据库mdDB.mdb,建立表student,其中有s_num(学号)、s_name(姓名)和score(成绩)3列数据。给表中输入一条记录,其数据为:9901,张学军,85。 import java.sql.*; class Create { public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { System.out.println("SQLException:"+ce.getMessage()); }
try { Connection con = DriverManager.getConnection("jdbc:odbc:myDB","li","1234"); Statement stmt = con.createStatement(); String sql= "create table student (s_num char(4), s_name char(6) null, score int)"; stmt.executeUpdate(sql); sql = "insert into student(s_num, s_name,score) values('9901', '张学军',85)"; stmt.executeUpdate(sql); stmt.close(); con.close(); } catch (SQLException e) { System.out.println("SQLException:1 "+e.getMessage()); } } }
6. 删除表 该实例利用JDBC-ODBC桥驱动程序访问Access数据库myDB.mdb,删除表student。 import java.sql.*; class Drop { public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { System.out.println("SQLException:"+ce.getMessage()); }
try{ Connection con = DriverManager.getConnection("jdbc:odbc:myDB","li","1234"); Statement stmt = con.createStatement(); String sql = "drop table student"; stmt.executeUpdate(sql); stmt.close(); con.close(); } catch (SQLException e) { System.out.println("SQLException:1 "+e.getMessage()); } } }
7.取表中各列名称 该实例利用JDBC-ODBC桥驱动程序访问Access数据库myDB.mdb,取表student中各列名称。 import java.sql.*; class Meta { public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException ce) { System.out.println("SQLException:"+ce.getMessage()); }
try { Connection con = DriverManager.getConnection("jdbc:odbc:myDB","li","1234"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery ("SELECT * FROM student"); ResultSetMetaData rsmd = rs.getMetaData(); for(int i = 1; i <= rsmd.getColumnCount(); i++) {if( i==1 ) System.out.print(rsmd.getColumnName(i)); else System.out.print(","+ rsmd.getColumnName(i)); } rs.close(); stmt.close(); con.close(); } catch (SQLException e) { System.out.println("SQLException:1 "+e.getMessage()); } } }