1 / 59

第 12 章 JDBC 数据库应用程序设计

第 12 章 JDBC 数据库应用程序设计. 12.1 JDBC 概述. JDBC(Java Data Base Connectivity ,其中文含义是 Java 数据库连接 ) ,可以将它理解为一种数据库存取的综合技术。 JDBC 内嵌于 Java 中, 提供存取关系数据库的标准库。其主要由两部分组成: JDBC API 和 JDBC 驱动程序管理器。所有用户界面的生成,事件驱动,对数据库的存取等功能均是由 Java 来实现的。

tasya
Download Presentation

第 12 章 JDBC 数据库应用程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第12章 JDBC数据库应用程序设计

  2. 12.1 JDBC概述 • JDBC(Java Data Base Connectivity,其中文含义是Java数据库连接),可以将它理解为一种数据库存取的综合技术。 • JDBC内嵌于Java 中, 提供存取关系数据库的标准库。其主要由两部分组成:JDBC API和JDBC 驱动程序管理器。所有用户界面的生成,事件驱动,对数据库的存取等功能均是由Java 来实现的。 • 因为数据库应用的重要性,在JDK 6中集成了Java数据库系统Java DB,JDBC API也进行了升级,使得数据库的访问更加方便和有效。

  3. 1.数据库概述 • 数据库是指长期存储在计算机内,有组织、可共享的数据集合。有大量的数据库产品可应用于实际的数据库管理和程序设计。例如,Oracle,SQL Server,DB2,SyBase,FoxPro,Access,MySQL等。其中大量应用的数据库产品是关系型数据库系统,关系数据库有严格的数学理论为基础,数据和数据之间的联系表示为二维表的形式(关系),用户使用直观、简单。

  4. 通常按照习惯,将二维表的行称为记录,列称为字段或域。一个数据库由若干表(即关系)构成,其中一些表可表示数据,另一些表可表示数据之间的联系。通常按照习惯,将二维表的行称为记录,列称为字段或域。一个数据库由若干表(即关系)构成,其中一些表可表示数据,另一些表可表示数据之间的联系。 • 例如:设在“学生”数据库中有“学生成绩”表,其内容如表12-1所示: • 表12-1“学生成绩”数据表

  5. 2.JDBC连接数据库的方式 • 在Java程序中要对数据库进行各种操作,可使用JDBC技术实现对数据库的连接和访问。本书主要介绍JDBC连接数据库的两种方式:使用JDBC-ODBC桥接器和直接使用某种数据库的驱动程序。 (1)使用JDBC-ODBC Bridge(桥接器) • 此种方式利用微软公司定义的ODBC(开放数据库连接)对数据库访问的通用接口来访问操作数据库。因为ODBC支持大多数数据库的连接和访问,JDBC通过JDBC-ODBC桥来将JDBC API转换成ODBC API,进而通过ODBC来存取数据库。

  6. 为了使用这种方式连接和访问数据库,需在Windows系统中创建与数据库对应的数据源。 • 在Windows XP中,可在控制面板中选择“管理工具”,在其中的项目中选择“数据源(ODBC)”,可设置SQL Server 2000 数据库中的数据库 “学生”(在SQL Server中已经建立) 为ODBC数据源。 名称为student的数 据源设置完成后的 情况见图。

  7. (2)使用某种数据库的专用驱动程序 • 此种方式是JDBC与某种数据库的专用驱动程序相连,不用创建数据源就能存取相应的数据库。如对SQL Server,可以到下面的网页去下载“SQL Server Driver for JDBC”: http://www.microsoft.com/china/sql/downloads/download.mspx • 下载后得到一个3MB多的sqljdbc_3.0.1301.101_chs.exe文件,这是SQL Server 2000、2005和2008都能使用的较新的JDBC驱动程序,运行该文件可进行驱动的安装。在安装目的文件夹中可以找到sqljdbc.jar和sqljdbc4.jar文件,按照说明书的要求,由于所用的是JDK版本6,因此这里应使用sqljdbc4.jar,可将它设置到classpath类搜索路径中。

  8. 若是用JDK命令行方式进行Java程序的编译和运行,可在“我的电脑”的属性对话框(右单击“我的电脑”出现该对话框)中的“高级”选项卡中选择“环境变量”按钮后出现的“环境变量”对话框中的系统变量部分对classpath参数进行设置,classpath的值应为:若是用JDK命令行方式进行Java程序的编译和运行,可在“我的电脑”的属性对话框(右单击“我的电脑”出现该对话框)中的“高级”选项卡中选择“环境变量”按钮后出现的“环境变量”对话框中的系统变量部分对classpath参数进行设置,classpath的值应为: {安装文件夹}\sqljdbc_3.0\chs\sqljdbc4.jar • 若是用JCreator开发工具进行程序设计,则可选择JCreator的configure菜单的Options菜单项,在左边的列表中选择JDK Profile并选中右边的列表项后,选择Edit按钮,在出现的JDK Profile对话框,点击“Add”按钮,并选择add archive项,再在“打开”对话框中选择sqljdbc4.jar文件来进行classpath的设置。使用专用驱动程序的方式,不需要做更多的设置,但是,SQL Server 2000需要安装SP4补丁才能使用。另外,需注意的是,使用sqljdbc4.jar新驱动程序,在程序中代码部分写法与早期的驱动写法有所不同。

  9. 3.JDBC连接数据库程序设计的主要步骤 • 应用JDBC设计数据库应用程序,需要使用到较多的Java类与接口,掌握这些类与接口,并遵从一定的操作步骤,就能顺利进行数据库的存取,从而进行数据库应用程序的设计。JDBC的类和方法都包含在java.sql包中,Java数据库应用程序的设计都需要引入java.sql包。下面从基本应用的角度,按照数据库应用程序的设计步骤来介绍JDBC相关类和接口。 (1)装载驱动程序 • 首先使用Class类的forName方法来装载驱动程序。装载驱动程序要处理异常。两种装载驱动程序的方法如下:

  10. 使用ODBC-JDBC桥接器的例: try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(java.lang.ClassNotFoundException e) { System.out.println("类未找到错误!"+e); } • 使用SQL Server 2000驱动程序的例: try { Class.forName("com.microsoft.jdbc.sqlserver .SQLServerDriver"); }catch(java.lang.ClassNotFoundException e) { System.out.println("类未找到错误!"+e); }

  11. (2)定义连接URL • 指定装载的数据库驱动程序后,可用DriverManager类来进行数据源或数据库的连接。DriverManager类是JDBC基础,用来管理JDBC驱动程序。该类有静态的getConnection()方法,用于验证JDBC数据源,并返回接口Connection对象。 • 使用ODBC-JDBC桥接器的例: Connection con = DriverManager.getConnection ("jdbc:odbc:student","sa","123456"); • 其中的"student"为建立的数据源的名称,"sa"和"123456"为安装SQL Server 2000数据库系统时设置的用户名和访问密码(这里可根据实际用户名和密码来进行设置)。

  12. 使用SQL Server 2000驱动程序方式的例: Connection con = DriverManager.getConnection ("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=学生","sa","123456"); • 其中的"localhost "表示使用本地服务器(可根据实际名称填写),"1433"为访问SQL数据库的服务器默认端口号,"学生"为SQL Server 2000数据库文件名, "sa"和"123456"的意义为安装SQL Server 2000时设置的用户名和密码(可根据实际情况来填写)。 (3) 获取数据库信息和创建接口Statement对象 • 数据库连接成功后,可以使用Connection对象的getMetaData方法取得接口DatabaseMetaData(提供大量的方法)对象来了解数据源或数据库的各种信息。

  13. 例如: • DatabaseMetaData dbmd = con.getMetaData(); • // 返回DatabaseMetaData对象 • dbmd.getURL() // 获得数据库的URL • dbmd.getUserName() // 获得用户名 • dbmd.getDriverName() // 获得数据库驱动程序名 • dbmd.getDriverVersion() // 获得数据库驱动程序版本 • dbmd.getDatabaseProductName()// 获得数据库产品名称 • dbmd.getDatabaseProductVersion()//获得数据库产品版本 • dbmd.getTables()//获得数据库中数据表的信息(有方法参数) • dbmd.getColumns()//获得数据表中各列的信息(有方法参数)

  14. 数据库连接成功后,还可以使用向数据库发送访问数据库的SQL语句的方法来存取数据库。JDBC使用接口Statement的对象(或执行数据库存储过程的子接口CallableStatement、发送带参数的SQL语句的子接口PreparedStatement)来发送SQL语句,Statement对象可用Connection的方法createStatement()来返回。例如:数据库连接成功后,还可以使用向数据库发送访问数据库的SQL语句的方法来存取数据库。JDBC使用接口Statement的对象(或执行数据库存储过程的子接口CallableStatement、发送带参数的SQL语句的子接口PreparedStatement)来发送SQL语句,Statement对象可用Connection的方法createStatement()来返回。例如: Statement st = con.createStatement(); (4) 执行SQL语句以存取数据库 • 希望执行的SQL语句串作为Statement的方法execute()等的参数向数据库传送,以交给数据库引擎,执行SQL对数据库的访问操作。对数据库访问结果是一个数据表的情况,可将这个表(结果集)存入接口ResultSet的对象。

  15. 提交SQL语句的Statement的方法有execute、executeQuery和executeUpdate等,分别用于不同类型的SQL语句的提交。 • executeQuery方法用于产生单个结果集的语句,如查询语句select。executeUpdate方法用于执行SQL语句中不产生结果集的语句,如insert,delete,update等语句和数据定义语句等(它的返回值为本次操作影响数据库表中数据行行数的整数值或零)。execute方法可用于执行产生多个结果集或对数据库进行多个操作的SQL语句(例如,执行数据库的存储过程)。下面是使用executeQuery方法和executeUpdate方法的例子: ResultSet rs = st.executeQuery("select * from 学生成绩"); int n=st.executeUpdate( "delete from 学生成绩 where 综合<60");

  16. (5)对执行SQL语句的结果进行处理 • Statement对象将SQL语句封装起来交给数据库引擎,执行select查询语句,将得到结果集ResultSet对象(注意:执行insert、delete、update等查询语句无结果集)。接口ResultSet对象封装了执行SQL语句的返回结果,以后可根据需要,以便在屏幕上显示结果或做进一步的处理。 • 在执行select语句后的返回结果中,包含了数据表和数据表内容的相关信息。关于数据表的信息可通过ResultSet的getMetaData方法来创建ResultSetMetaData对象,由这个对象可获取所需数据库的信息。

  17. 例如: ResultSetMetaData rsmd = rs.getMetaData(); rsmd.getColumnCount() // 获取列(字段)数 rsmd.getColumnName(列号) // 获取指定列(字段)的列名 • 在ResultSet中,提供了一整套的getXXX方法(如getInt,getString,getFloat,getDouble等)来访问结果集中当前行的不同列(用列序号或列标题作为这些方法的参数)的数据(类型不同时可将字段类型按照XXX类型来进行类型转换),而next方法可使得访问可对不同的行来进行。

  18. 例如,可用下面的程序段对学生成绩表的姓名和出生日期进行访问:例如,可用下面的程序段对学生成绩表的姓名和出生日期进行访问: ResultSet rs = st.executeQuery( "select 姓名,出生日期 from 学生成绩"); while(rs.next()){ System.out.println(rs.getString("姓名") // 用字段(列)名 +" " + rs.getString(2).substring(0,10)); // 用字段(列)序号, //而且将日期类型的字段转换为String类型进行显示。 }

  19. ResultSet自动维护结果集当前数据行的指向光标,首先获得结果集时,指向光标置于结果集的第一行前,以后每调用一次next方法,光标就向下移动一行,这样可按照顺序从第一行到最后一行逐行访问结果集的每一行(访问结束时next返回false值)。ResultSet自动维护结果集当前数据行的指向光标,首先获得结果集时,指向光标置于结果集的第一行前,以后每调用一次next方法,光标就向下移动一行,这样可按照顺序从第一行到最后一行逐行访问结果集的每一行(访问结束时next返回false值)。 • 在有些情况下,可能希望任意访问而不是顺序访问结果集的数据行,对某些结果集,可能还希望通过结果集修改数据库的数据,则应在createStatement 方法中加入如下的两个参数,即: Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

  20. 如果只希望任意滚动结果集的指向光标,而不修改数据库的数据,则可在上述两个参数中将第二个参数设置为ResultSet.CONCUR_READ_ONLY。如果只希望任意滚动结果集的指向光标,而不修改数据库的数据,则可在上述两个参数中将第二个参数设置为ResultSet.CONCUR_READ_ONLY。 • 通过参数的设置,就可以用ResultSet的first(定位到第一行)、last(定位到最后一行)、previous(定位到前一行)、absolute(绝对行号)和relative(相对当前行的行号)等方法来设置当前行,并且还可以根据参数的更新设置,用insertRow(插入行)、deleteRow(删除行)、updateRow(更新行)等方法来对数据库表进行增、删、改的操作。

  21. (6)关闭连接 • 数据库访问结束,为保证数据库数据的完整性和释放系统资源,应明确地关闭数据库的连接:一般是关闭结果集、关闭数据库访问对象和关闭连接。

  22. 12.2 JDBC数据库操作实例 • 【例12.1】用表12.1的数据在数据库“学生”中建立数据表“学生成绩”,并显示建表以后的结果。在程序中给出的是使用直接驱动程序方式连接数据库的代码,并用注释方式给出了使用JDBC-ODBC桥接器方式连接数据库的代码。(使用JDBC-ODBC桥接器方式时将该语句的注释符号去掉,并将上面有“*”号注释的语句去除或设置为注释。)如前所述,程序中的第一个try - catch语句部分可以省略不写,使得程序变得简单。 import java.sql.*; class JdbcDemo{ public static void main(String args[]){ Connection con; // 定义连接类的对象

  23. Statement st; // 为SQL语句的使用定义对象 ResultSet rs; // 定义结果集对象 String user="sa",pass="123456"; // 设置数据库的用户名和密码 try { //Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");// * }catch(ClassNotFoundException e) { System.out.println("类未找到错误!" + e); } try{ con=DriverManager.getConnection("jdbc:odbc:student",user,pass); con = DriverManager.getConnection ("jdbc:sqlserver://localhost:1433;DatabaseName=学生",user,pass);//*

  24. DatabaseMetaData dbmd = con.getMetaData(); System.out.println("数据库的URL:"+ dbmd.getURL()); System.out.println("数据库用户名:"+ dbmd.getUserName()); System.out.println("数据库驱动程序名:"+ dbmd.getDriverName()); System.out.println("数据库驱动程序版本号:"+ dbmd.getDriverVersion()); System.out.println("数据库产品名:"+ dbmd.getDatabaseProductName()); System.out.println("数据库产品版本号:"+ dbmd.getDatabaseProductVersion());

  25. st=con.createStatement(); String query = "create table 学生成绩("+ "考号 char(10),姓名 char(8), 性别 char(2),出生日期 datetime," + "数学 integer,语文 integer,英语 integer, 综合 integer)"; st.executeUpdate(query); String s1="insert into 学生成绩 values(" +"'4201025001','王丹','女','1989-10-15', 95,87,88,78)"; String s2="insert into 学生成绩 values(" +"'4201025002','李屹','男','1988-12-26', 96,80,88,85)"; String s3="insert into 学生成绩 values(" +"'4201025003','赵星','男','1989-5-3', 90,75,84,82)";

  26. String s4="insert into 学生成绩 values(" +"'4201025004','黄萍','女','1989-3-12',88,79,90,80)"; st.executeUpdate(s1); // 执行SQL语句的提交 st.executeUpdate(s2); st.executeUpdate(s3); st.executeUpdate(s4); rs=st.executeQuery("select * from 学生成绩"); // 查询建表并插入数据的结果 System.out.println(" [学生成绩]表中的数据如下:"); System.out.println(" 考号 姓名 性别 出生日期 数 语 英 综"); while(rs.next()) // 在输出数据间加竖线符进行分隔 System.out.println(rs.getString(1)+"|"// 输出考号 +rs.getString(2)+"|" // 输出姓名 +rs.getString(3)+"|" // 输出性别

  27. +rs.getString(4).substring(0,10)+"|" // 输出出生日期 +rs.getString(5)+"|" // 输出数学成绩 +rs.getString(6)+"|" // 输出语文成绩 +rs.getString(7)+"|" // 输出英语成绩 +rs.getString(8)); // 输出综合成绩 rs.close();st.close();con.close(); }catch(java.sql.SQLException e){ System.out.println("SQL错误!" + e); } } }

  28. 例12.1程序的运行结果如下: 数据库的URL:jdbc:sqlserver://localhost:1433;xopenStates=false;sendTimeAsDatetime=true;trustServerCertificate=false;sendStringParametersAsUnicode=true;selectMethod=direct;responseBuffering=adaptive;packetSize=8000;loginTimeout=15;lockTimeout=-1;lastUpdateCount=true;encrypt=false;disableStatementPooling=true;databaseName=学生;applicationName=Microsoft SQL Server JDBC Driver; 数据库用户名:sa 数据库驱动程序名:Microsoft SQL Server JDBC Driver 3.0 数据库驱动程序版本号:3.0.1301.101 数据库产品名:Microsoft SQL Server 数据库产品版本号:8.00.2039 [学生成绩]表中的数据如下: 考号 姓名 性别 出生日期 数 语 英 综 4201025001|王丹 |女|1989-10-15|95|87|88|78 4201025002|李屹 |男|1988-12-26|96|80|88|85 4201025003|赵星 |男|1989-05-03|90|75|84|82 4201025004|黄萍 |女|1989-03-12|88|79|90|80

  29. 【例12.2】设计一个Java数据库应用程序,它能按照菜单(用输出对话框显示)的选项,对例12.1创建的学生成绩表进行任意的记录显示、人机对话方式添加记录(用输入对话框来输入添加的学生记录数据),根据输入的学生考号来删除学生数据记录。【例12.2】设计一个Java数据库应用程序,它能按照菜单(用输出对话框显示)的选项,对例12.1创建的学生成绩表进行任意的记录显示、人机对话方式添加记录(用输入对话框来输入添加的学生记录数据),根据输入的学生考号来删除学生数据记录。 import javax.swing.JOptionPane; import java.sql.*; class JdbcDemo1{ public static void main(String args[]){ Connection con; Statement st; ResultSet rs; String user="sa",pass="123456",s,s1,s2,ss;

  30. try { //Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");// * 驱动程序名 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); }catch(ClassNotFoundException e) { System.out.println("类未找到错误!" + e); } try { //con=DriverManager.getConnection("jdbc:odbc:student",user,pass); con = DriverManager.getConnection ("jdbc:sqlserver://localhost:1433; DatabaseName = stu",user,pass);

  31. while(true){ s=JOptionPane.showInputDialog( "请选择:\n 1.显示记录\n 2.添加记录 \n 3.删除记录\n 4.退出"); st=con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); // 设置数据库指针可任意移动 rs=st.executeQuery("select * from 学生成绩"); if(s.equals("1")){ s1 = JOptionPane.showInputDialog( "请输入[开始记录号(>=1),记录数]"); String sa[]=s1.split(","); listRecord(rs,Integer.parseInt(sa[0]), Integer.parseInt(sa[1]));

  32. // 调用listRecord显示记录,参数为结果集,开始记录号,显示记录数 }else if(s.equals("2")){ s1 =JOptionPane.showInputDialog( "请输入[ 考号,姓名,性别,出生日期,数学,语文,英语,综合]"); String a[]=s1.split(","); ss="insert into 学生成绩 values('"+a[0]+"','"+a[1]+"','"+a[2]; ss+="','"+a[3]+"',"+a[4]+","+a[5]+","+ a[6]+","+a[7]+")";

  33. JOptionPane.showMessageDialog(null, "添加记录的SQL语句是:\n"+ss); st.executeUpdate(ss); }else if(s.equals("3")){ s1 =JOptionPane.showInputDialog( "请输入要删除记录的学生考号:"); PreparedStatement ps = con.prepareStatement( "delete from 学生成绩 where 考号=?"); // 带参数的SQL语句 ps.setString(1,s1);// 设置参数实际值,1为参数序号 ps.executeUpdate(); }else {

  34. rs.close(); st.close(); con.close(); System.exit(0); } } }catch(java.sql.SQLException e){ System.out.println("SQL错误!" + e); } } // 下面为显示记录的listRecord方法,忽略异常的处理 static void listRecord(ResultSet rs,int start,int n)throws SQLException{ int i=1; String ss=""; rs.absolute(start);

  35. while(i<=n){ ss+=rs.getString(1)+"|"; // 输出考号 ss+=rs.getString(2)+"|"; // 输出姓名 ss+=rs.getString(3)+"|"; // 输出性别 ss+=rs.getString(4).substring(0,10)+"|"; // 输出出生日期 ss+=rs.getString(5)+"|"; // 输出数学成绩 ss+=rs.getString(6)+"|"; // 输出语文成绩 ss+=rs.getString(7)+"|"; // 输出英语成绩 ss+=rs.getString(8); // 输出综合成绩 ss+="\n"; i++; if(!rs.next())break; } JOptionPane.showMessageDialog(null, "显示记录如下:\n"+ss); } }

  36. 【例12.3】设计一个Java数据库GUI应用程序,它能根据提示在一个文本区中输入查询数据库的SQL语句,按“显示” 按钮后在下面的一个表格中显示查询结果。 import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.*; import javax.swing.table.*; class RSTable extends AbstractTableModel { private Connection con; private Statement st; private ResultSet rs; private ResultSetMetaData rsmd; private int numberOfRows;

  37. private String user="sa",pass="123456", qs = "SELECT * FROM 学生成绩"; public RSTable(String query) throws SQLException, ClassNotFoundException{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection( "jdbc:odbc:student",user,pass); st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); // 设置结果集为可滚动并且是只读的 setQuery(query); } public Class getColumnClass(int column){ try { // 获得结果集列的类名

  38. String className =rsmd.getColumnClassName(column+1); return Class.forName( className ); }catch ( Exception e ) { System.out.println(e); } return Object.class; } public int getColumnCount(){ try { return rsmd.getColumnCount();// 获得结果集的列数 }catch ( SQLException se ){ System.out.println(se); } return 0; // 出错时返回0列 }

  39. public String getColumnName( int column ){ try { return rsmd.getColumnName( column + 1 ); // 获得结果集的列名 }catch ( SQLException se ) { System.out.println(se); } return ""; // 出错时返回空字符串 } public int getRowCount(){ return numberOfRows; // 获得结果集的行数 } // 获得结果集指定行列处的数据

  40. public Object getValueAt( int row, int column ){ try { rs.absolute( row + 1 ); return rs.getObject( column + 1 ); }catch (SQLException se) { System.out.println(se); } return ""; } protected void finalize(){ // 在对象撤销时自动调用来关闭数据库连接等 try { rs.close(); st.close(); con.close(); }catch ( SQLException se ){ System.out.println(se); } } public void setQuery( String query ) throws SQLException{

  41. rs=st.executeQuery(query);//执行查询,返回结果集 rsmd = rs.getMetaData(); // 获得结果集的元数据 rs.last(); // 移动数据表指针到最后一行 numberOfRows = rs.getRow();// 获得最后一行的行号 fireTableStructureChanged();// 更新查询显示 } }

  42. public class JdbcDemo2 extends JFrame implements ActionListener{ private RSTable table; private JTextArea jta; public JdbcDemo2(){ super( "JdbcGUI应用程序:显示数据库查询结果" ); // 设置窗口标题 String qs = "select * from 学生成绩"; // 设置初始显示的SQL语句 try { table = new RSTable(qs ); // 创建RSTable对象 jta = new JTextArea( qs, 2, 120 );//设置文本区 jta.setWrapStyleWord( true ); // 设置换行属性

  43. jta.setLineWrap( true ); // 设置文本区换行属性 jta.setFont(new Font("宋体",Font.PLAIN,13));//设置字体 JScrollPane scrollPane = new JScrollPane(jta, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ); // 设置滚动面板 JLabel jl= new JLabel( "<Html><Font color=red>输入SQL语句:"); JButton jb = new JButton( "<Html><Font color=blue>查询"); JPanel jp=new JPanel(); // 创建面板对象 jp.setLayout(new BorderLayout()); // 设置面板的布局为BorderLayout jp.add(jl,BorderLayout.WEST); // 添加到面板

  44. jp.add(scrollPane,BorderLayout.CENTER); // 添加到面板 jp.add(jb,BorderLayout.EAST); // 添加到面板 JTable resultTable = new JTable(table); resultTable.getTableHeader().setBackground(Color.blue); //设置表格标题背景色为蓝色 resultTable.getTableHeader().setForeground(Color.orange); //设置表格标题前景色为橙色 add( jp, BorderLayout.NORTH ); // 添加面板到窗体 add( new JScrollPane(resultTable), BorderLayout.CENTER ); // 添加表格到窗体

  45. jb.addActionListener(this); // 注册动作监听器 }catch ( ClassNotFoundException e) { JOptionPane.showMessageDialog( null, "数据库驱动程序未找到!","驱动程序未找到", JOptionPane.ERROR_MESSAGE ); System.exit(1); // 终止应用程序 }catch (SQLException e) { JOptionPane.showMessageDialog( null, "数据库错误!", "数据库错误",JOptionPane.ERROR_MESSAGE ); System.exit(1); // 终止应用程序 } } public void actionPerformed( ActionEvent e ){ try { table.setQuery(jta.getText()); // 将输入在文本区中SQL语句作查询

  46. }catch (SQLException se) {//显示出错信息 JOptionPane.showMessageDialog( null, se.toString(), "数据库错误",JOptionPane.ERROR_MESSAGE ); } } public static void main(String args[]){ JdbcDemo2 app = new JdbcDemo2(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); app.setSize( 680, 250 ); // 设置初始窗口大小 app.setVisible( true ); } }

  47. 例12.3的运行界面如下:

  48. 12.3 使用JDK内置的Java DB • 在JDK 6中,内置了数据库系统Java DB,在安装JDK时,默认将Java DB安装到安装目标盘的Program Files文件夹的Sun文件夹中。这是一个纯 Java 实现、开源的数据库管理系统,源于 Apache 软件基金会(ASF)名下的项目 Derby。它只有几兆大小,但功能齐备,支持几乎大部分的数据库应用所需要的特性,这就为 JDK 注入了一股全新的活力:Java 程序员不再需要耗费大量精力安装和配置数据库,就能进行安全、易用、标准、并且免费的数据库编程。

  49. JavaDB有两种运行模式:内嵌模式和网络服务器模式,内嵌模式中JavaDB和应用程序一起在同一个 Java 虚拟机(JVM)里运行。网络服务器模式中JavaDB和应用程序可以在不同的JVM中运行。 • 在运行实例前,需要将JavaDB的驱动jar包设置到类搜索路径中。 • 1. JavaDB内嵌模式用法 • 【例12.4】本例是JavaDB内嵌模式的简单应用,在程序中建立数据库stuDB和建“成绩”表,插入两条记录并显示,最后删除创建的表。本程序需要重点关注的是连接JavaDB和创建数据库的语句,它们的格式与前面不同。

  50. import java.sql.*; public class JavaDBEmbedded {      public static void main(String[] args) {          try { // 注册并装载驱动程序,在JDK 6中下一语句可省,不影响程序运行 Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();              System.out.println("装载内嵌驱动程序!");              Connection conn = null;              conn=DriverManager.getConnection("jdbc:derby:stuDB;create=true");              System.out.println("创建并连接到数据库stuDB!");              conn.setAutoCommit(false); //不自动提交 // 创建成绩表并向该表插入两条记录

More Related