疯狂Java讲义(十三)----第一部分

        通过使用JDBC,Java程序可以非常方便地操作各种主流数据库,这是Java语言的巨大魅力所在。由于Java语言的跨平台特性,所以使用JDBC编写的程序不仅可以实现跨数据库,还可以跨平台,具有非常优秀的可移植性。
        程序使用JDBCAPI以统一的方式来连接不同的数据库,然后通过Statement对象来执行标准的SQL语句,并可以获得SQL语句访问数据库的结果,因此掌握标准的SQL 语句是学习JDBC编程的基础。本章将会简要介绍关系数据库理论基础,并以MySQL数据库为例来讲解标准的SQL语句的语法细节,包括基本查询语句、多表连接查询和子查询等。
        本章将重点介绍JDBC连接数据库的详细步骤,并讲解使用JDBC执行SQL语句的各种方式,包括使用CallableStatement调用存储过程等。本章还会介绍ResultSetMetaData、DatabaseMetaData两个接口的用法。事务也是数据库编程中的重要概念,本章不仅会介绍标准SQL语句中的事务控制语句,而且会讲解如何利用JDBC API进行事务控制。

1. JDBC基础

        JDBC的全称是Java Database Connectivity,即 Java数据库连接,它是一种可以执行SQL语句的Java API。程序可通过JDBC API连接到关系数据库,并使用结构化查询语言(SQL,数据库标准的查询语言)来完成对数据库的查询、更新。
        与其他数据库编程环境相比,JDBC为数据库开发提供了标准的API,所以使用JDBC开发的数据库应用可以跨平台运行,而且可以跨数据库(如果全部使用标准的SQL)。也就是说,如果使用JDBC开发一个数据库应用,则该应用既可以在Windows平台上运行,也可以在UNIX等其他平台上运行;既可以使用MySQL数据库,也可以使用Oracle等数据库,而程序无须进行任何修改。

  (1) JDBC简介

        通过使用JDBC,就可以使用同一种API访问不同的数据库系统。换言之,有了JDBC API,就不必为访问Oracle数据库学习一组 API,为访问DB2数据库又学习一组API……开发人员面向JDBCAPI编写应用程序,然后根据不同的数据库,使用不同的数据库驱动程序即可。

Java语言的各种跨平台特性,都采用相似的结构,因为它们都需要让相同的程序在不同的平台上运行,所以都需要中间的转换程序(为了实现Java程序的跨平台性,Java为不同的操作系统提供了不同的虚拟机)。同样,为了使JDBC程序可以跨平台,则需要不同的数据库厂商提供相应的驱动程序。图13.1显示了JDBC驱动示意图。


正是通过JDBC 驱动的转换,才使得使用相同JDBC API编写的程序,在不同的数据库系统上运行良好。Sun提供的JDBC可以完成以下三个基本工作。

  • 建立与数据库的连接。
  • 执行SQL语句。
  • 获得SQL语句的执行结果。

通过JDBC的这三个功能,应用程序即可访问、操作数据库系统。

扫描二维码关注公众号,回复: 13295320 查看本文章

  (2) JDBC驱动程序

        数据库驱动程序是JDBC 程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用。图13.2显示了JDBC示意图。

        大部分数据库系统,例如Oracle和Sybase等,都有相应的JDBC驱动程序,当需要连接某个特定的数据库时,必须有相应的数据库驱动程序。

JDBC 驱动通常有如下4种类型。

  • 第1种JDBC驱动:称为JDBC-ODBC桥,这种驱动是最早实现的JDBC驱动程序,主要目的是为了快速推广JDBC。这种驱动将JDBCAPI映射到ODBC API。这种方式在Java 8中已经被删除了。
  • 第2种JDBC驱动:直接将JDBC APl映射成数据库特定的客户端API。这种驱动包含特定数据库的本地代码,用于访问特定数据库的客户端。
  • 第3种JDBC驱动:支持三层结构的JDBC 访问方式,主要用于Applet阶段,通过 Applet访问数据库。
  • 第4种JDBC驱动:是纯Java的,直接与数据库实例交互。这种驱动是智能的,它知道数据库使用的底层协议。这种驱动是目前最流行的JDBC驱动。

 

        通常建议选择第4种JDBC驱动,这种驱动避开了本地代码,减少了应用开发的复杂性,也减少了产生冲突和出错的可能。如果对性能有严格的要求,则可以考虑使用第2种JDBC 驱动,但使用这种驱动,则势必增加编码和维护的困难。
        相对于ODBC而言,JDBC更加简单。总结起来,JDBC比 ODBC多了如下几个优势。

  • ODBC 更复杂,ODBC 中有几个命令需要配置很多复杂的选项,而JDBC则采用简单、直观的方式来管理数据库连接。
  • JDBC比 ODBC安全性更高,更易部署。

2.SQL语法

        SQL语句是对所有关系数据库都通用的命令语句,而JDBC API 只是执行SQL语句的工具,JDBC允许对不同的平台、不同的数据库采用相同的编程接口来执行SQL语句。在开始JDBC编程之前必须掌握基本的SQL知识,本节将以MySQL 数据库为例详细介绍SQL语法知识。

  (1) 安装数据库

        对于基于JDBC的应用程序,如果使用标准的SQL 语句进行数据库操作,则应用程序可以在所有的数据库之间切换,只要为程序提供不同的数据库驱动程序即可。从这个角度来看,我们可以使用任何一种数据库来学习JDBC编程。本章将以MySQL为例来介绍JDBC编程,因为MySQL数据库非常小巧,而且使用相当简单。

        安装MySQL数据库与安装普通程序并没有太大的区别,关键是配置MySQL数据库时需要注意选择支持中文的编码集。下面简要介绍在Windows平台上下载和安装MySQL数据库系统的步骤。

  1. 登录http:/dev.mysql.com/downloads/mysql/站点,下载MySQL数据库的最新版本。本书成书之时,MySQL数据库的最新稳定版本是MySQL 5.7.19,建议下载该版本的MySQL安装文件。读者可根据自己所用的Windows平台选择下载相应的MSI Installer 安装文件。
  2. 下载完成后,得到一个mysql-installer-community-5.7.19.0.msi 文件,双击该文件,开始安装MySQL数据库系统,安装MySQL数据库系统与安装普通的Windows软件没有太大差别。
  3. 开始安装MySQL后,在出现的对话框中单击"Install MySQL Products”按钮,然后看到“LicenseAgreement”界面,该界面要求用户必须接受该协议才能安装 MySQL数据库系统。勾选该界面下方的“l accept the license terms”复选框,然后单击“Next”按钮。
  4. 显示如图13.3所示的安装选项对话框,勾选“Custom”单选钮,然后单击“Next”按钮。在该界面可以选择安装 MySQL所需的组件和选择MySQL 数据库及数据文件的安装路径,本书选择将MySQL数据库和数据文件都安装在D盘下。单击“Next”按钮,将显示选择安装组件对话框,选择安装MySQL服务器和文档,如图13.4所示。
  5. 单击“Next”按钮,MySQL Installer 会检查系统环境是否满足安装MySQL的要求。如果满足要求,则可以直接单击“Next”按钮开始安装;如果不符合条件,请根据MySQL提示先安装相应的系统组件,然后再重新安装MySQL。开始安装MySQL数据库系统。
  6. 成功安装MySQL数据库系统后,会看到如图13.5所示的成功安装对话框。
  7. MySQL数据库程序安装成功后,系统还要求配置MySQL 数据库。单击如图13.5所示对话框中下方的“Next”按钮,开始配置MySQL 数据库。在如图13.6所示的对话框中,勾选“Standalone MySQLServer/Classic MySQL Replication”复选框,这样即可进行更详细的配置。
  8. 单击“Next”按钮,将出现如图13.7所示的对话框,允许用户设置MySQL的 root账户密码,也允许添加更多的用户。
  9. 如果需要为MySQL数据库添加更多的用户,则可单击“Add User”按钮进行添加。设置完成后单击“Next"按钮,在配置中将依次出现一系列对话框,但这些对话框对配置影响不大,直接单击"Next"按钮直至MySQL配置成功。

        MySQL可通过命令行客户端来管理 MySQL数据库及数据库里的数据。经过上面10个步骤之后,应该在Windows的“开始”菜单中看到“MySQL”→“MySQL Server 5.7”一→“MySQL 5.7Command Line Client - Unicode”菜单项,单击该菜单项将启动MySQL的命令行客户端窗口,进入该窗口将会提示输入root账户密码。

        在命令行客户端工具中输入在如图13.7所示对话框中为 root账户设定的密码,系统进入MySQL数据库系统,通过执行SQL命令就可以管理MySQL数据库系统了。

  (2) 关系数据库基本概念和 MySQL基本命令

        严格来说,数据库(Database)仅仅是存放用户数据的地方。当用户访问、操作数据库中的数据时,就需要数据库管理系统的帮助。数据库管理系统的全称是Database Management System,简称DBMS.习惯上常常把数据库和数据库管理系统笼统地称为数据库,通常所说的数据库既包括存储用户数据的部分,也包括管理数据库的管理系统。
        DBMS是所有数据的知识库,它负责管理数据的存储、安全、一致性、并发、恢复和访问等操作。DBMS有一个数据字典(有时也被称为系统表),用于存储它拥有的每个事务的相关信息,例如名字、结构、位置和类型,这种关于数据的数据也被称为元数据(metadata)。
        在数据库发展历史中,按时间顺序主要出现了如下几种类型的数据库系统。

  • 网状型数据库
  • 层次型数据库
  • 关系数据库
  • 面向对象数据库

        在上面4种数据库系统中,关系数据库是理论最成熟、应用最广泛的数据库。从20世纪70年代末开始,关系数据库理论逐渐成熟,随之涌现出大量商用的关系数据库。关系数据库理论经过30多年的发展已经相当完善,在大量数据的查找、排序操作上非常成熟且快速,并对数据库系统的并发、隔离有非常完善的解决方案。
        面向对象数据库则是由面向对象编程语言催生的新型数据库,目前有些数据库系统如Oracle 11g等开始增加面向对象特性,但面向对象数据库还没有大规模地商业应用。
        对于关系数据库而言,最基本的数据存储单元就是数据表,因此可以简单地把数据库想象成大量数据表的集合(当然,数据库绝不仅由数据表组成)。
        数据表是存储数据的逻辑单元,可以把数据表想象成由行和列组成的表格,其中每一行也被称为一条记录,每一列也被称为一个字段。为数据库建表时,通常需要指定该表包含多少列,每列的数据类型信息,无须指定该数据表包含多少行——因为数据库表的行是动态改变的,每行用于保存一条用户数据。除此之外,还应该为每个数据表指定一个特殊列,该特殊列的值可以唯一地标识此行的记录,则该特殊列被称为主键列。
        MySQL数据库的一个实例(Server Instance)可以同时包含多个数据库,MySQL使用如下命令来查看当前实例下包含多少个数据库:

        图13.8显示了使用MySQL命令行客户端执行这些命令的效果。
        正如在图13.8中看到的,MySQL的命令行客户端依次执行了show databases;、drop database abc;等命令,如果将多条MySQL命令写在一份SQL脚本文件里,然后将这份SQL脚本的内容一次复制到该窗口里,将可以看到该命令行客户端一次性执行所有SQL命令的效果——这种一次性执行多条SQL命令的方式也被称为导入SQL脚本。

        MySQL 数据库安装成功后,在其安装目录下有一个bin路径(本书中该路径为 D:\ProgramFiles\MySQLMySQL Server 5.7bin),该路径下包含一个mysql命令,该命令用于启动MySQL命令行客户端。执行mysql命令的语法如下:

 

        执行上面命令可以连接远程主机的MySQL服务。为了保证有较好的安全性,执行上面命令时可以省略-p后面的密码,执行该命令后系统会提示输入密码。

        MySQL数据库通常支持如下两种存储机制。

  • MyISAM:这是MySQL早期默认的存储机制,对事务支持不够好。
  • InnoDB:InnoDB提供事务安全的存储机制。InnoDB通过建立行级锁来保证事务完整性,并以Oracle风格的共享锁来处理Select语句。系统默认启动InnoDB存储机制,如果不想使用InnoDB表,则可以使用skip-innodb选项。

        对比两种存储机制,不难发现 InnoDB比 MyISAM多了事务支持的功能,而事务支持是Java EE最重要的特性,因此通常推荐使用InnoDB存储机制。如果使用5.0 以上版本的 MySQL 数据库系统,通常无须指定数据表的存储机制,因为系统默认使用InnoDB存储机制。如果需要在建表时显式指定存储机制,则可在标准建表语法的后面添加下面任意一句。

  • ENGINE=MyISAM—强制使用MyISAM存储机制。
  • ENGINE=InnoDB—-强制使用InnoDB存储机制。

  (3) SQL语句基础

        SQL 的全称是Structured Query Language,也就是结构化查询语言。SQL是操作和检索关系数据库的标准语言,标准的SQL语句可用于操作任何关系数据库。
使用SQL语句,程序员和数据库管理员(DBA)可以完成如下任务。

  • 在数据库中检索信息。
  • 对数据库的信息进行更新。
  • 改变数据库的结构。
  • 更改系统的安全设置。
  • 增加或回收用户对数据库、表的许可权限。

        在上面5个任务中,一般程序员可以管理前3个任务,后面2个任务通常由DBA来完成。标准的SQL语句通常可分为如下几种类型。

  • 查询语句:主要由select关键字完成,查询语句是SQL语句中最复杂、功能最丰富的语句
  • DML(Data Manipulation Language,数据操作语言)语句:主要由 insert、update和 delete三个关键字完成。
  • DDL (Data Definition Language,数据定义语言)语句;主要由create、alter、drop和 truncate四个关键字完成。
  • DCL (Data Control Language,数据控制语言)语句:主要由grant和 revoke两个关键字完成。事务控制语句:主要由commit、rollback 和 savepoint三个关键字完成。

        SQL语句的关键字不区分大小写,也就是说,creatc和CREATE 的作用完全一样。在上面5种 SQL语句中,DCL语句用于为数据库用户授权,或者回收指定用户的权限,通常无须程序员操作,所以本节不打算介绍任何关于DCL的知识。
        在SQL命令中也可能需要使用标识符,标识符可用于定义表名、列名,也可用于定义变量等。这些标识符的命名规则如下。

  • 标识符通常必须以字母开头。
  • 标识符包括字母、数字和三个特殊字符(#_$)。
  • 不要使用当前数据库系统的关键字、保留字,通常建议使用多个单词连缀而成,单词之间以_分隔。
  • 同一个模式下的对象不应该同名,这里的模式指的是外模式。

掌握了SQL的这些基础知识后,下面将分类介绍各种SQL语句。

  (4) DDL语句

        DDL语句是操作数据库对象的语句,包括创建(create)、删除(drop)和修改(alter)数据库对象。        

        前面已经介绍过,最基本的数据库对象是数据表,数据表是存储数据的逻辑单元。但数据库里绝不仅包括数据表,数据库里可包含如表13.1所示的几种常见的数据库对象。

        因为存在上面几种数据库对象,所以create后可以紧跟不同的关键字。例如,建表应使用create table,建索引应使用create index,建视图应使用create view……drop和 alter后也需要添加类似的关键字来表示删除、修改哪种数据库对象。

 1.创建表的语法
        标准的建表语句的语法如下:

        上面语法中圆括号里可以包含多个列定义,每个列定义之间以英文逗号(,)隔开,最后一个列定义不需要使用英文逗号,而是直接以括号结束。
        前面已经讲过,建立数据表只是建立表结构,就是指定该数据表有多少列,每列的数据类型,所以建表语句的重点就是圆括号里的列定义,列定义由列名、列类型和可选的默认值组成。
        列定义有点类似于Java 里的变量定义,与变量定义不同的是,列定义时将列名放在前面,列类型放在后面。如果要指定列的默认值,则使用default关键字,而不是使用等号(=)。
        例如下面的建表语句:

        建表时需要指定每列的数据类型,不同数据库所支持的列类型不同,这需要查阅不同数据库的相关文档。MySQL支持如表13.2所示的几种列类型。

        上面是比较常见的建表语句,这种建表语句只是创建一个空表,该表里没有任何数据。如果使用子查询建表语句,则可以在建表的同时插入数据。子查询建表语句的语法如下:

        上面语法中新表的字段列表必须与子查询中的字段列表数量匹配,创建新表时的字段列表可以省略,如果省略了该字段列表,则新表的列名与选择结果完全相同。下面语句使用子查询来建表。

        因为上面语句是利用子查询来建立数据表,所以执行该SQL语句要求数据库中已存在user_inf数据表(读者可向test数据库中导入codes\13\13.2目录下的user_inf.sql脚本后执行上面命令),否则程序将出现错误。

2.修改表结构的语法
        修改表结构使用alter table,修改表结构包括增加列定义、修改列定义、删除列、重命名列等操作。增加列定义的语法如下:

        上面的语法格式中圆括号部分与建表语法的圆括号部分完全相同,只是此时圆括号里的列定义是追加到已有表的列定义后面。还有一点需要指出,如果只是新增一列,则可以省略圆括号,仅在add后紧跟一个列定义即可。为数据表增加字段的SOL语句如下:

        上面第二条SQL语句增加aaa字段时,为该字段指定默认值为'xxx'。值得指出的是,SQL语句中的字符串值不是用双引号引起,而是用单引号引起的。
        增加字段时需要注意:如果数据表中已有数据记录,除非给新增的列指定了默认值,否则新增的数据列不可指定非空约束,因为那些已有的记录在新增列上肯定是空(实际上,修改表结构很容易失败,只要新增的约束与已有数据冲突,修改就会失败)。
        修改列定义的语法如下:

        上面语法中 first或者after col_name指定需要将目标修改到指定位置。
        从上面修改语法中可以看出,该修改语句每次只能修改一个列定义,如下代码所示:

        从上面代码中不难看出,使用SQL修改数据表里列定义的语法和为数据表只增加一个列定义的语法几乎完全一样,关键是增加列定义使用add关键字,而修改列定义使用modify 关键字。还有一点需要指出,add新增的列名必须是原表中不存在的,而modify修改的列名必须是原表中已存在的。

        如果数据表里已有数据记录,则修改列定义非常容易失败,因为有可能修改的列定义规则与原有的数据记录不符合。如果修改数据列的默认值,则只会对以后的插入操作有作用,对以前已经存在的数据不会有任何影响。
        从数据表中删除列的语法比较简单:

        删除列只要在 drop后紧跟需要删除的列名即可。例如:

        从数据表中删除列定义通常总是可以成功,删除列定义时将从每行中删除该列的数据,并释放该列在数据块中占用的空间。所以删除大表中的字段时需要比较长的时间,因为还需要回收空间。
        上面介绍的这些增加列、修改列和删除列的语法是标准的SQL 语法,对所有的数据库都通用。除此之外,MySQL还提供了两种特殊的语法:重命名数据表和完全改变列定义。
        重命名数据表的语法格式如下:
 

        对比 change和 modify两个选项,不难发现: change选项比 modify选项多了一个列名,因为change选项可以改变列名,所以它需要两个列名。一般而言,如果不需要改变列名,使用alter table的modify选项即可,只有当需要修改列名时才会使用change选项。如下语句所示:

3.删除表的语法
        删除表的语法格式如下:

        删除数据表的效果如下。

  • 表结构被删除,表对象不再存在。
  • 表里的所有数据也被删除。
  • 该表所有相关的索引、约束也被删除。

 4. truncate表
        对于大部分数据库而言,truncate都被当成DDL处理,truncate被称为“截断”某个表—它的作用是删除该表里的全部数据,但保留表结构。相对于DML里的 delete命令而言,truncate 的速度要快得多,而且 truncate不像delete可以删除指定的记录,truncate只能一次性删除整个表的全部记录。truncate命令的语法如下:

        MySQL对truncate 的处理比较特殊—一如果使用非InnoDB存储机制, truncate 比 delete速度要快;如果使用InnoDB存储机制,在MySQL5.0.3之前,truncate和delete完全一样,在5.0.3之后,truncatetable 比 delete效率高,但如果该表被外键约束所参照,truncate又变为delete操作。在5.0.13之后,快速truncate总是可用,即比 delete 性能要好。

猜你喜欢

转载自blog.csdn.net/indeedes/article/details/121123591
今日推荐