• 1. 第10章 Java数据库连接
  • 2. 本章主要内容:10.1 JDBC概述 10.2  SQL语句简介 10.3 JDBC API 10.3.1 JDBC API简介 10.3.2 JDBC驱动程序及URL一般方法 10.4 JDBC编程实例 10.4.1 数据库编程的一般步骤 10.4.2 数据表操作 10.4.3 数据库应用
  • 3. 10.1 JDBC概述 JDBC即Java数据库连接(Java Database Connectivity)。它由一组用Java语言编写的类和接口组成。JDBC为数据库提供了一个标准的API,(API,即应用程序接口,Application Program Interface)。使我们能够用纯Java来编写数据库应用程序。
  • 4. 10.1 JDBC概述 JDBC的基本结构由Java应用程序、JDBC管理器、驱动程序或JDBC-ODBC桥和数据库四部分组成。
  • 5. 10.2  SQL语句简介SQL 是英文Structured query language的缩写,意思为结构化查询语言。 1、关系型数据库 一个典型的关系型数据库通常由一个或多个数据表组成。数据库中的所有数据或信息都被保存在这些数据表中。数据库中的每一个表都有惟一的表名,数据表由行和列组成,其中列称为字段,包括了字段名称、数据类型以及字段属性等信息,而行称为记录,包含每一字段的具体数据值。
  • 6. 学生数据库的组成及相关名词
  • 7. 10.2  SQL语句简介2、数据查询 select语句的语法格式如下: select 字段1[, 字段2, …] from 表名 [where 限制条件]; 还可以使用通配符“%”来代替任何字符串,常用于模糊查询。例如:  select 学号,姓名, 年龄, 家庭住址 from学生情况表 where 姓名 LIKE ‘李%’; 上述SQL语句将会查询所有姓李的学生记录。
  • 8. 10.2  SQL语句简介3、创建数据表 create table 为建立新的数据表语句。 也可以使用可选的条件选项: 例如:create table 表名(字段1 数据类型,字段2 数据类型, …); create table 表名(字段1 数据类型[限制条件], 字段2 数据类型[限制条件],…);create table 学生情况表(学号varchar(6), 姓名varchar(15), 年龄 number(3), 家庭住址 varchar(20),联系电话 varchar(20));
  • 9. 10.2  SQL语句简介4、向数据表中插入数据 用insert语句向数据表中插入或添加新的数据行(或称为记录)。 例如: insert into 表名(字段1, …, 字段n) values(字段值1, …,字段值n); insert into 学生情况表(姓名, 年龄, 家庭住址, 联系电话) values('李明',22,'北京市西祠胡同','87654321');
  • 10. 10.2  SQL语句简介5、更新记录 例如: update 表名 set 字段1 = 新值1[, 字段2 = 新值2, …] where 限制条件;update 学生情况表 set 年龄 = 年龄 + 1 where 姓名 = ’李明’;
  • 11. 10.2  SQL语句简介6、删除记录 例如: delete from 表名 where 限制条件;delete from学生情况表 where 姓名 = ’李明’;
  • 12. 10.2  SQL语句简介7、删除数据表 使用drop table命令删除某个数据表以及该表中的所有记录。 例如:drop table 表名; drop table学生情况表 ;
  • 13. JDBC基础 在Java程序中,对数据库的操作都通过JDBC组件完成。JDBC在Java程序和数据库之间充当一个桥梁的作用。 Java程序可以通过JDBC向数据库发出命令,数据库管理系统获得命令后,执行请求,并将请求结果通过JDBC返回给Java程序。 JDBC分为JDBC驱动程序和JDBC API。
  • 14. JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。。 用JDBC写的程序能够自动地将SQL语句传送给相应的数据库管理系统。
  • 15. JDBC概述 有了JDBC,向各种关系数据库发送SQL语句就是一件很容易的事。只要数据库厂商支持JDBC,并为数据库预留JDBC接口驱动程序。 那么就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,为访问Informix数据库又写另一个程序等。
  • 16. JDBC概述图 应用程序、JDBC和驱动程序之间的关系
  • 17. 连接前准备: 1.安装My Sql 5.1.50 2.加载JDBC mysql-connector-java-5.1.6-bin.jar 驱动到 Java: C:\Java\jdk1.7.0_05\jre\lib\ext 3.安装 SQLyog_Enterprise (My Sql 辅助软件)
  • 18. sql5.1安装时出现Error0导致mysql不能启动,如何解决该问题 具体情况如图所示 安全模式下 注册表中删除所有MySQL 删除C://Programe files/MySQL 删除C:\Documents and Settings\All Users\Application Data\MySQL
  • 19. JDBC API介绍 JDBC API包含在两个包里。第一个包是java.sql,它包含了JDBC API的核心Java数据对象,这包括为DBMS(数据库管理系统)连接和存储在DBMS里的数据进行交互而提供的Java数据对象。另外一个包含JDBC API的包是javax.sql,它扩展了java.sql,是J2EE/Java EE的一部分。
  • 20. 10.3.1 JDBC API简介类或接口作用DriverManager类数据库驱动程序的加载,及与数据库建立连接。Connection接口建立与指定数据库的连接。Statement接口向已经建立了连接的数据库发送及处理SQL命令。ResultSet接口返回数据库中执行SQL命令的结果。JDBC中主要的类和接口
  • 21. 10.3.1 JDBC API简介1、DriverManager类 DriverManager类是JDBC的管理器,负责管理JDBC驱动程序,跟踪可用的驱动程序并在数据库和相应驱动程序之间建立连接,它提供了用于管理一个或多个数据库驱动程序所必需的功能。 成员方法功能getConnection(String url)使用指定的数据库URL创建一个连接。getConnection(String url, String user, String password)使用指定的数据库URL、用户名和用户密码创建一个连接。
  • 22. 10.3.1 JDBC API简介2、Connection接口 Connection这个接口抽象了大部分与数据库的交互活动。通过建立的连接,可以向数据库发送SQL语句并返回执行的结果。 下面说明如何打开一个与位于URL "jdbc:odbc:testDB" 的数据库的连接。所用的用户标识符为 "myName" ,口令为 "Java":String url = "jdbc:odbc:testDB"; Connection con = DriverManager.getConnection(url, "myName", "Java");
  • 23. 10.3.1 JDBC API简介3、Statement接口 当建立连接后,可以向数据库发送SQL语句访问数据库和读取访问的结果。Statement这个接口可在这个连接中执行和处理SQL语句。 成员方法功能execute(String sql) 执行给定的 SQL 语句,该语句可能返回多个结果。executeQuery(String sql) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。executeUpdate(String sql) 执行给定 SQL 语句,其SQL语句为 INSERT、UPDATE 或 DELETE 语句。close( ) 立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。
  • 24. 10.3.1 JDBC API简介4、ResultSet接口 ResultSet 对象表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。ResultSet 对象具有指向其当前数据行的指针。最初,指针被置于第一条记录之前。可以通过next( )方法将指针移动到下一记录。
  • 25. 数据库的驱动程序及 JDBC URL: MySQL 数据库    驱动程序包名: mysql-connector-java-5.1.6-bin.jar    驱动类的名字: com.mysql.jdbc.Driver //从上述包中解压得到    JDBC URL : jdbc:mysql:// dbip:port/databasename    说明:驱动程序包名有可能会变    JDBC URL 中黑色字体部分必须原封不动的保留,为该驱动识别的URL 格式。红色字体部需要根据数据库的安装情况填写。 其中各个部分含义如下: jdbc表示采用什么方式连接数据库 ,:表示分隔符 mysql 表示连接到mysql数据库 dbip – 为数据库服务器的 IP 地址,如果是本地可写:localhost 或 127.0.0.1 port – 为数据库的监听端口,需要看安装时的配置,缺省为 3306 。 databasename – 数据库的名字 。 举例如果要访问本地的数据库 allandb ,端口 1433 ,那么 URL 写法如下: jdbc:mysql://localhost:1433/allandb
  • 26. 数据库的驱动程序及 JDBC URL:Oracle 数据库 : 驱动程序包名: ojdbc14.jar 驱动类的名字: oracle.jdbc.driver.OracleDriver JDBC URL : jdbc:oracle:thin:@ dbip:port:databasename 说明:驱动程序包名有可能会变        JDBC URL 中黑色字体部分必须原封不动的保留,为该驱动识别的 URL 格式。红色字体部分需要根据数据库的安装情况填写。其中各个部分含义如下: dbip – 为数据库服务器的 IP 地址,如果是本地可写:localhost 或 127.0.0.1 port – 为数据库的监听端口,需要看安装时的配置,缺省为 1521 。 databasename – 为数据库的 SID ,通常为全局数据库的名字。 举例如果要访问本地的数据库 allandb ,端口 1521 ,那么 URL 写法如下: jdbc:oracle:thin:@localhost:1521:allandb
  • 27. 数据库的驱动程序及 JDBC URL:SQL Server 数据库    驱动程序包名: msbase.jar mssqlserver.jar msutil.jar    驱动类的名字: com.microsoft.jdbc.sqlserver.SQLServerDriver    JDBC URL : jdbc:microsoft:sqlserver:// dbip:port;DatabaseName=databasename 说明:驱动程序包名有可能会变 JDBC URL 中黑色字体部分必须原封不动的保留,为该驱动识别的 URL 格式。红色字体部需要根据数据库的安装情况填写。其中各个部分含义如下: dbip – 为数据库服务器的 IP 地址,如果是本地可写: localhost 或 127.0.0.1 。 port – 为数据库的监听端口,需要看安装时的配置,缺省为 1433 。 databasename – 数据库的名字 。 举例如果要访问本地的数据库 allandb ,端口 1433 ,那么 URL 写法如下: jdbc: microsoft: sqlserver:@localhost:1433; DatabaseName =allandb
  • 28. 数据库的驱动程序及 JDBC URL:Access 数据库    驱动程序包名:该驱动程序包含在 JavaSE 中,不需要额外安装。    驱动类的名字: sun.jdbc.odbc.JdbcOdbcDriver JDBC URL : jdbc:odbc: datasourcename    说明:该驱动只能工作在 Windows 系统中,首先需要在操作系统中建立一个可以访问 Access 数据库的本地数据源 (ODBC) ,如果名字为 allandb ,那么 URL 写法如下: jdbc:odbc:allandb
  • 29. 10.3.2 JDBC驱动程序及URL一般方法2、JDBC URL的一般方法 例如:设驱动程序类型为“ODBC数据源”,数据源名称为“testbook”。则 String url="jdbc:odbc:testbook"; 建立数据库连接: Connection con=DriverManager.getConnection(url);
  • 30. 连接数据库连接前准备 连接数据库 Java程序通过JDBC组件连接一个数据库 1)加载和注册驱动程序 Class.forName("JDBC驱动程序名称"); 2)连接数据库 Connection 连接变量 ; 连接变量= DriverManager.getConnection( "jdbc:odbc:数据源名称","用户名","密码"); 3)获取Connection对象3个步骤。URL
  • 31. 10.4 JDBC编程实例10.4.1 数据库编程的一般步骤连接实例 在了解了Java程序中连接数据库的基本步骤后,就可以动手编写一个Java程序,实现对MySQL数据库的连接。
  • 32. CREATE DATABASE company; USE company; CREATE TABLE yuang ( id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, NAME VARCHAR(30) NOT NULL, sex VARCHAR(10) NOT NULL, zhiw VARCHAR(30) NOT NULL, phone VARCHAR(20) NOT NULL, PRIMARY KEY(id)); INSERT INTO yuang(NAME,sex,zhiw,phone) VALUES('刘海松','男','项目组长','13633826164');创建数据库和表
  • 33. 连接实例import java.sql.*; public class MySQLConnExample { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver");//mysql-connector-java-5.1.6-bin.jar解压后包里 System.out.println("成功加载MySQL驱动程序"); } catch (ClassNotFoundException e1) { System.out.println("找不到MySQL驱动程序"); System.exit(0); } try { String url="jdbc:mysql://localhost:3306/company?"+"user=root&password=123"; Connection conn=DriverManager.getConnection(url); } catch (SQLException e) { System.out.print("数据库没有连接成功!!!"); System.exit(0); } System.out.print("数据库连接成功"); System.exit(0); } }
  • 34. 10.4 JDBC编程实例10.4.1 数据库编程的一般步骤3、向数据库发送SQL语句,处理结果 (1)建立SQL语句对象 Statement SQL语句对象名; SQL语句对象名=连接变量.createStatement(); (2)处理执行SQL语句的执行结果 处理查询记录或添加记录的SQL语句为: ResultSet 结果集对象名=SQL语句对象名. executeQuery("SQL语句");
  • 35. 10.4 JDBC编程实例10.4.1 数据库编程的一般步骤处理修改记录或删除记录的SQL语句为: 结果集对象名=SQL语句对象名.executeUpdate ("SQL语句"); 4、关闭数据库的连接 对数据库操作完毕后,应该将与数据库的连接关闭: 连接变量.close(); 同时还应该将SQL语句对象释放。
  • 36. 显示数据库数据 在上一个小节中,我们利用DriverManager和Connection接口,可以成功的连接到后台数据库。当数据库连接成功后,就可以显示数据库中的数据。
  • 37. 显示数据库数据import java.sql.*;import java.nio.charset.*;import java.util.*; public class MySQLResExample{ public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/company?"+"user=root&password=123"; Connection conn=DriverManager.getConnection(url); Statement st=conn.createStatement(); ResultSet rs=st.executeQuery("select * from yuang"); System.out.println("员工序号 员工名称 员工性别 员工职务 员工电话"); while(rs.next()){ System.out.print(" "+rs.getInt(1)+" "); System.out.print(" "+rs.getString(2)+" "); System.out.print(" "+rs.getString(3)+" "); System.out.print(rs.getString(4)+" "); System.out.println(rs.getString(5)+" "); } conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
  • 38. 更新数据库数据 在Java程序中,由于外部环境的变化,后台连接数据库中的数据每隔一段时间,就需要更新。我们不可能直接打开MySQL数据库进行更新,一般情况下都是借助Java程序进行更新。更新数据库中的数据,可以使用SQL语句的UPDATE、INSERT和DELETE操作,然后将包含UPDATE、INSERT、DELETE的SQL语句交给Statement对象的executeUpdate()方法执行。Statement对象用于执行不带参数的简单SQL语句。
  • 39. 更新数据库数据import java.sql.*;import java.nio.charset.*;import java.util.*; public class MySQLStateExample { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/company?"+"user=root&password=123"; Connection conn=DriverManager.getConnection(url); Statement st=conn.createStatement(); String sql="insert into yuang (name,sex,zhiw,phone) values ('张耀文','男','项目成员','13356975623')"; st.executeUpdate(sql); System.out.print("数据添加成功"); st.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } }
  • 40. 查询数据库数据 条件的显示数据库数据,是程序员必须要掌握的技能之一。在Java程序中,显示符合条件的数据记录非常简单,只需要修改其执行的sql语句就可以。
  • 41. 查询数据库数据import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.sql.*; public class MySQLCha extends JFrame{ JTextArea jta; JButton jb; static Statement st; static{ try{ Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/company?"+"user=root&password=123"; Connection conn=DriverManager.getConnection(url); st=conn.createStatement(); } catch(Exception e){} } public MySQLCha(){ jta=new JTextArea(5,10); jb=new JButton("显示信息"); jb.addActionListener(new Mysql()); Container container=getContentPane(); JPanel jp=new JPanel(); jp.setLayout(new FlowLayout()); jp.add(jb); container.add(jp,BorderLayout.SOUTH); container.add(new JScrollPane(jta),BorderLayout.CENTER); setTitle("显示数据"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(350,200); setVisible(true); } 把这个接在左面的最后 class Mysql implements ActionListener{ public void actionPerformed(ActionEvent e){ try{ String sq="select * from yuang"; ResultSet rs=st.executeQuery(sq); jta.setText(""); jta.append("员工序号 姓名 性别 职务 电话"+"\n"); while(rs.next()){ jta.append(rs.getInt(1)+" "); jta.append(rs.getString(2)+" "); jta.append(rs.getString(3)+" "); jta.append(rs.getString(4)+" "); jta.append(rs.getString(5)+"\n"); } } catch(Exception ee){} } } public static void main(String args[]){ new MySQLCha(); } }
  • 42. JDBC高级操作 除了上面介绍的基本操作外,如数据显示、添加、删除和修改外,还可以使用JDBC对数据库执行高级操作,如成批添加数据和调用存储过程等。
  • 43. 使用PreparedStatement接口执行SQL语句 PreparedStatement接口创建表示预编译的SQL语句对象。SQL语句经过预编译,并存储在PreparedStatement对象中。然后,此对象可用来有效地多次执行此语句。PreparedStatement接口继承Statement类,并与之在两方面有所不同: PreparedStatement实例包含已编译的SQL语句。由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。因此,多次执行的SQL语句经常创建为PreparedStatement对象,以提高效率。 包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参参。IN参数的值在SQL语句创建时未被指定。相反的,该语句为每个IN参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的SetXXX方法来提供。
  • 44. 使用PreparedStatement接口执行SQL语句 作为Statement的子类,PreparedStatement继承了Statement的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代IN参数占位符的值。同时,三种方法execute、executeQuery和executeUpdate已被更改又以使其不再需要参数。 这些方法的Statement形式(接受SQL语句参数的形式)不应该用于PreparedStatement对象。
  • 45. import java.sql.*; import java.nio.charset.*; import java.util.*; public class MySQLPrExample{ public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/company?"+"user=root&password=123"; Connection conn=DriverManager.getConnection(url); String sql="insert into yuang (name,sex,zhiw,phone) values (?,?,?,?)"; PreparedStatement ps=conn.prepareStatement(sql); ps.setString(1,"孙静"); ps.setString(2,"女"); ps.setString(3,"项目成员"); ps.setString(4,"13089075674"); ps.executeUpdate(); System.out.print("数据添加成功"); ps.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } PreparedStatement对象的使用
  • 46. 使用CallableStatement接口执行SQL语句 存储过程可以使得对数据库的管理、显示关于数据库及其用户信息的工作容易得多。存储过程是SQL语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其他强大的编程功能。 存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。存储过程的功能取决于数据库所提供的功能。
  • 47. 使用CallableStatement接口执行SQL语句 在JDBC组件中,CallableStatement接口对象为所有的DBMS提供了一种以标准形式调用存储过程的方法。存储过程存在数据库中。对存储过程的调用是CallableStatement对象所含的内容。这种调用操作有两种形式: 带结果参数的形式 不带结果参数的形式 在JDBC中调用存储过程的语法如下所示: {call 过程名[(?,?,?,…)]} 返回结果参数的过程的语法为: {?=call 过程名[(?,?,?,…)]} 不带参数的已存储的过程语法为: {call 过程名}
  • 48. 使用CallableStatement接口执行SQL语句 这里需要注意的是,上述语句法中,方括号表示其间的内容是可选项;方括号本身并不是语法的组成部分。 CallableStatement继承Statement的方法(它们用于处理一般的SQL语句),还继承PreparedStatement的方法(它们用于处理IN参数)。CallableStatement中定义的所有方法都用于处理OUT参数或INOUT参数的输出部分,注册OUT参数的JDBC类型(一般SQL类型),从这些参数中检索结果,或者检查所返回的值是否为JDBC NULL。
  • 49. mysql> select * from test_table; 然后回车,那么MySQL将立即执行该语句。 但有时候,不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。 如试图在命令行客户端中输入如下语句 mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT) mysql> RETURNS varchar(255) mysql> BEGIN mysql> IF ISNULL(S) THEN mysql> RETURN ''; mysql> ELSEIF N<15 THEN mysql> RETURN LEFT(S, N); mysql> ELSE mysql> IF CHAR_LENGTH(S) <=N THEN mysql> RETURN S; mysql> ELSE mysql> RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5)); mysql> END IF; mysql> END IF; mysql> END; 默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。 因为mysql一遇到分号,它就要自动执行。 即,在语句RETURN '';时,mysql解释器就要执行了。 这种情况下,就需要事先把delimiter换成其它符号,如//或$$。
  • 50. 使用CallableStatement接口执行SQL语句DELIMITER // CREATE PROCEDURE `Procedure1`(IN NAME VARCHAR(30) ,IN sex VARCHAR(10) ,IN zhiw VARCHAR(30) ,IN phone VARCHAR(20)) BEGIN INSERT INTO yuang(NAME,sex,zhiw,phone) VALUES (NAME,sex,zhiw,phone); END// DELIMITER ;
  • 51. 使用CallableStatement接口执行SQL语句 import java.sql.*; import java.nio.charset.*; import java.util.*; public class ProceduerMysql{ public static void main(String[] args) { try { String driverName="com.mysql.jdbc.Driver";//驱动程序名 String userName="root";//数据库用户名 String userPasswd="123";//密码 String dbName="company";//数据库名 String url="jdbc:mysql://localhost:3306/"+dbName+"?user="+userName+"&password="+userPasswd;//连接字符串 Class.forName(driverName).newInstance();//与Class.forName("com.mysql.jdbc.Driver")作用一样 Connection conn=DriverManager.getConnection(url); CallableStatement cstmt=conn.prepareCall("{call Procedure1(?,?,?,?)}");// 创建CallableStatement对象以用来调用数据库存储过程 cstmt.setString(1,"李丽"); cstmt.setString(2,"女"); cstmt.setString(3,"项目成员"); cstmt.setString(4,"037165738542"); cstmt.executeUpdate(); System.out.println("MySQL数据库存储过程被Java程序成功调用!"); cstmt.close(); } catch (Exception e) { e.printStackTrace(); } } }Class.forName(“com.mysql.jdbc.Driver”).newInstance();与Class.forName(“com.mysql.jdbc.Driver”)作用一样,后者在加载时有一段静态代码创建一个类的实例
  • 52. JDBC元数据 元数据是对数据资源的描述,英文名称是“Metadata”,通常被解释为data about data,即关于数据的数据。元数据是信息共享和交换的基础和前提,用于描述数据集的内容、质量、表示方式、空间参考、管理方式以及数据集的其他特征。 JDBC提供了三个元数据接口:DatabaseMetaData、ResultSetMetaData和ParameterMetaData。其中DatabaseMetaData提供了数据库以及DBMS的相关信息,ResultSetMetaData提供了结果集对象中的列相关信息,ParameterMetaData提供了PreparedStatement或CallableStatement对象中的参数相关信息。
  • 53. 使用DatabaseMetaData DatabaseMetaData接口由JDBC驱动程序开发者实现,它提供了对有关数据库的名称、版本、JDBC驱动程序名称等信息的访问功能。DatabaseMetaData对象实例通过Connection对象的getMetaData()方法得到。用户根据该接口提供的方法可以很容易地取得某一数据库的信息。
  • 54. ResultSetMetaData只是获得表的信息,使用DatabaseMetaData则是用来获得数据库的信息,下面介绍这个类的使用方法 DatabaseMetaData对象提供的是关于数据库的各种信息,这些信息包括: 1、    数据库与用户,数据库标识符以及函数与存储过程。2、    数据库限制。 3、    数据库支持不支持的功能。4、    架构、编目、表、列和视图等。 通过调用DatabaseMetaData的各种方法,程序可以动态的了解一个数据库。由于这个类中的方法非常的多那么就介绍几个常用的方法来给大家参考。 DatabaseMetaData实例的获取方法是,通过连接来获得的 Connection conn = //创建的连接。 DatabaseMetaData dbmd = Conn.getMetaData(); 创建了这个实例,就可以使用他的方法来获取数据库得信息。首先是数据库中用户标识符的信息的获得,主要使用如下的方法: getDatabaseProductName()用以获得当前数据库是什么数据库。比如oracle,access等。返回的是字符串 getDatabaseProductVersion()获得数据库的版本。返回的字符串。 getDriverVersion()获得驱动程序的版本。返回字符串。 supportsResultSetType(ResultSet.resultype)是判定是否支持这种结果集的类型。比如参数如果是 Result.TYPE_FORWARD_ONLY,那就是判定是否支持,只能先前移动结果集的指针。返回值为boolean,true表示支持。 上面介绍的只是几个常用的方法,这个类中还有很多方法,可以到jdk的帮助文档中去查看类java.sql.DatabaseMetaData
  • 55. import java.sql.*;import java.nio.charset.*;import java.util.*; public class DateBaseMysql{ public static void main(String[] args) { try { String driverName="com.mysql.jdbc.Driver";//驱动程序名 String userName="root";//数据库用户名 String userPasswd="123";//密码 String dbName="company";//数据库名 String url="jdbc:mysql://localhost:3306/"+dbName+"?user="+userName+"&password="+userPasswd;//连接字符串 Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn=DriverManager.getConnection(url); DatabaseMetaData dbmd=conn.getMetaData(); System.out.println("数据库元信息"); System.out.println("-------------------------------"); System.out.println("登录URL:"+dbmd.getURL()); System.out.println("登录用户名:"+dbmd.getUserName()); System.out.println("数据库版本:"+dbmd.getDatabaseProductVersion()); System.out.println("驱动器名:"+dbmd.getDriverName()); System.out.println("数据库名称:"+dbmd.getDatabaseProductName()); System.out.println("支持存储过程:"+dbmd.supportsStoredProcedures()); System.out.println("支持批量更新:"+dbmd.supportsBatchUpdates()); System.out.println("-------------------------------"); conn.close();//关闭连接、释放资源 } catch (Exception e) { e.printStackTrace(); } }}MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司
  • 56. 使用ResultSetMetaData 当在JDBC应用程序中发送select语句时,该操作会返回一个ResultSet对象,这个ResultSet对象包含满足条件的数据。通过创建ResultMetaData对象和调用该对象的方法,可以获取与这个ResultSet对象中的列有关的信息。
  • 57. 使用ResultSetMetaDataimport java.sql.*; public class ResultMetaExample { public static void main(String[] args) { try { String driverName="com.mysql.jdbc.Driver";//驱动程序名 String userName="root";//数据库用户名 String userPasswd="123";//密码 String dbName="company";//数据库名 String tableName="yuang";//表名 String url="jdbc:mysql://localhost:3306/"+dbName+"?user="+userName+"&password="+userPasswd;//连接字符串 Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn=DriverManager.getConnection(url); Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery("select * from yuang"); ResultSetMetaData rsmd=rs.getMetaData(); // DatabaseMetaData dbmd=conn.getMetaData();数据库元数据 int cols=rsmd.getColumnCount(); System.out.println("使用元数据显示记录集数据"); for(int i=1;i<=cols;i++) { System.out.print(rsmd.getColumnLabel(i)+" "); } System.out.println(""); while(rs.next()){ for(int i=1;i<=cols;i++){ Object obj=rs.getObject(i); if(obj!=null) System.out.print(obj.toString()+" "); System.out.print(" "); } System.out.println(""); } rs.close(); stmt.close(); conn.close();//关闭连接、释放资源 } catch (Exception e) { System.out.println(e.toString()); } }}
  • 58. GUI中显示MySQL数据 前面章节的数据库操作,如添加数据等,其数据都是在Java程序中进行设定。这样并不能满足程序的动态需求。我们可以在GUI图形界面中,完成对数据的添加和显示。
  • 59. 添加数据 在图形用户界面,对MySQL数据库中的数据进行添加操作是常见的操作之一。
  • 60. import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.sql.*; public class MySQLInsert extends JFrame{ JTextField jtf1,jtf2,jtf3,jtf0; JLabel jl1,jl2,jl3,jl0; JButton jb1; static Statement st; static{ try{ Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/company?"+"user=root&password=123"; Connection conn=DriverManager.getConnection(url); st=conn.createStatement(); } catch(Exception e){} } public MySQLInsert(){ jtf0=new JTextField(15); jtf1=new JTextField(15); jtf2=new JTextField(15); jtf3=new JTextField(15); jl0=new JLabel("姓名"); jl1=new JLabel("性别"); jl2=new JLabel("职务"); jl3=new JLabel("电话"); jb1=new JButton("添加"); Container container=getContentPane(); JPanel jp1=new JPanel(); jp1.setLayout(new GridLayout(4,2)); jp1.add(jl0);jp1.add(jtf0); jp1.add(jl1);jp1.add(jtf1); jp1.add(jl2);jp1.add(jtf2); jp1.add(jl3);jp1.add(jtf3); jb1.addActionListener(new mysql()); container.add(jp1,BorderLayout.CENTER); container.add(jb1,BorderLayout.SOUTH); setTitle("添加数据窗口"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300,150); setVisible(true); } class mysql implements ActionListener{ public void actionPerformed(ActionEvent e){ try{ String str1=jtf1.getText().trim(); String str2=jtf2.getText().trim(); String str3=jtf3.getText().trim(); String str0=jtf0.getText().trim(); if(str1.equals("") | str2.equals("") | str3.equals("")|str0.equals("")){ JOptionPane.showMessageDialog(MySQLInsert.this,"请重新输入职工信息","提示对话框",1); } else{ String sql="insert into yuang(name,sex,zhiw,phone) values('"+str0+"','"+str1+"','"+str2+"','"+str3+"');"; st.executeUpdate(sql); JOptionPane.showMessageDialog(MySQLInsert.this,"数据添加成功","提示对话框",1); jtf0.setText("");jtf1.setText("");jtf2.setText("");jtf3.setText(""); } } catch(Exception ee){} } } public static void main(String args[]){ new MySQLInsert(); } } String sql="select uname,upass from tbl_user where uname='"+ 变量 +"'"; ‘“+变量+”’(对应变量在数据库的类型是varchar这一类字符串类型) “+变量+”(对应变量在数据库的类型是数字类型)
  • 61. 显示数据 在图形用户界面显示数据库信息,是图形界面中常见的操作之一。
  • 62. import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class MySQLCha extends JFrame{ JTextArea jta; JButton jb; static Statement st; static{ try{ Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/company?"+"user=root&password=123"; Connection conn=DriverManager.getConnection(url); st=conn.createStatement(); } catch(Exception e){} } public MySQLCha(){ jta=new JTextArea(5,10); jb=new JButton("显示信息"); jb.addActionListener(new Mysql()); Container container=getContentPane(); JPanel jp=new JPanel(); jp.setLayout(new FlowLayout()); jp.add(jb); container.add(jp,BorderLayout.SOUTH); container.add(new JScrollPane(jta),BorderLayout.CENTER); setTitle("显示数据"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(350,200); setVisible(true); } class Mysql implements ActionListener{ public void actionPerformed(ActionEvent e){ try{ String sq="select * from yuang"; ResultSet rs=st.executeQuery(sq); jta.setText(""); jta.append("员工序号 姓名 性别 职务 电话"+"\n"); while(rs.next()){ jta.append(rs.getInt(1)+" "); jta.append(rs.getString(2)+" "); jta.append(rs.getString(3)+" "); jta.append(rs.getString(4)+" "); jta.append(rs.getString(5)+"\n"); } } catch(Exception ee){} } } public static void main(String args[]){ new MySQLCha(); } }
  • 63. 本章结束!