APP下载

数据库介绍 Java语言JDBC基础 新手也可以看懂

消息来源:baojiabao.com 作者: 发布时间:2024-05-15

报价宝综合消息数据库介绍 Java语言JDBC基础 新手也可以看懂

数据库介绍

数据库系统是由数据库、数据库管理系统和应用系统、数据库管理员构成的。数据库管理系统简称DBMS,是数据库系统的关键组成部分,包括数据库定义、资料查询、资料维护等。JDBC技术是连线数据库与应用程序的纽带。学习Java语言,必须学习JDBC技术,因为JDBC技术是在Java语言中被广泛使用的一种操作数据库的技术。每个应用程序的开发都是使用数据库储存资料,而使用JDBC技术访问数据库可达到查询满足条件的记录,或者向数据库新增、修改、删除资料。本章将向读者介绍Java语言的数据库操作部分。

数据库基础知识

数据库在应用程序中占据着非常重要的地位。从原来的Sybase数据库,发展到今天的SQLServer、MySQL、Oracle等高阶数据库,数据库已经相当成熟了。

什么是数据库

数据库是一种储存结构,它允许使用各种格式输入、处理和检索资料,不必在每次需要资料时重新输入。例如,当需要某人的电话号码时,需要检视电话簿,按照姓名来查阅,这个电话簿就是一个数据库。数据库具有以下主要特点。

-实现资料共享。资料共享包含所有使用者可同时存取数据库中的资料,也包括使用者可以用各种方式通过界面使用数据库,并提供资料共享。

-减少资料的冗余度。同文件系统相比,数据库实现了资料共享,从而避免了使用者各自建立应用档案,减少了大量重复资料,减少了资料冗余,维护了资料的一致性。

-资料的独立性。资料的独立性包括数据库中数据库的逻辑结构和应用程序相互独立,也包括资料物理结构的变化不影响资料的逻辑结构。

-资料实现集中控制。档案管理方式中,资料处于一种分散的状态,不同的使用者或同一使用者在不同处理中其档案之间毫无关系。利用数据库可对资料进行集中控制和管理,并通过资料模型表示各种资料的组织以及资料间的联络。

-资料的一致性和可维护性,以确保资料的安全性和可靠性。主要包括:

.安全性控制,以防止资料丢失、错误更新和越权使用。

.完整性控制,保证资料的正确性、有效性和相容性。

.并发控制,使在同一时间周期内,允许对资料实现多路存取,又能防止使用者之间的不正常互动作用。

.故障的发现和恢复。

从发展的历史来看,数据库是资料管理的高阶阶段,是由档案管理系统发展起来的。数据库的基本结构分为3个层次。

-物理资料层:它是数据库的最内层,是物理储存装置上实际储存的资料集合。这些资料是原始资料,是使用者加工的物件,由内部模式描述的指令操作处理的字元和字组成。

-概念资料层:它是数据库的中间一层,是数据库的整体逻辑表示,指出了每个资料的逻辑定义及资料间的逻辑联络,是储存记录的集合。它所涉及的是数据库所有物件的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。

-逻辑资料层:它是使用者所看到和使用的数据库,是一个或一些特定使用者使用的资料集合,即逻辑记录的集合。

数据库的种类及功能

数据库系统一般基于某种资料模型,可以分为层次型、网状型、关系型及面向物件型等。

-层次型数据库:层次型数据库类似于树结构,是一组通过连结而相互联络在一起的记录。层次模型的特点是记录之间的联络通过指标实现。由于层次模型层次顺序严格而 且复杂,因此对资料进行各项操作都很困难。层次型数据库如图所示。

层次型数据库

-网状型数据库:网络模型是使用网络结构表示实体型别、实体间联络的资料模型。网络模型容易实现多对多的联络。但在编写应用程序时,程序员必须熟悉数据库的逻辑结构,如图所示。

网状型数据库

-面向物件型数据库:建立在面向物件模型基础上。

-关系型数据库:关系型数据库是目前最流行的数据库,是基于关系模型建立的数据库,关系模型是由一系列表格组成的。后面会详细地讲解它。

在当前比较流行的数据库中,MySQL数据库是开发源代码的软件,具有功能强、使用简便、管理方便、执行速度快、安全可靠性强等优点,同时也是具有客户机/服务器体系结构的分散式数据库管理系统。MySQL是完全网络化的跨平台关系型数据库系统,它还支援多种平台,在UNIX/Linux系统上MySQL支援多执行绪执行方式,从而能获得相当好的效能。对于不使用UNIX系统的使用者,可以在WindowsNT系统上以系统服务方式执行,或者在Windows95/98系统上以普通程序方式执行。从JDK6开始,在JDK的安装目录中,除了传统的bin、jre等目录,还新增了一个名为db的目录,这便是JavaDB。这是一个纯Java实现的、开源的数据库管理系统(DBMS),源于Apache软件基金会(ASF)名下的专案Derby。它只有2MB大小,但这并不妨碍Derby功能齐备、支援几乎大部分的数据库应用所需要的特性。更难能可贵的是,作为内嵌的数据库,Derby得到了包括IBM和Sun等大公司以及全世界优秀程序员们的支援。这就好像为JDK注入了一股全新的活力,Java程序员不再需要耗费大量精力安装和配置数据库,就能进行安全、易用、标准且免费的数据库程式设计了。

SQL语言

SQL(StructureQueryLanguage,结构化查询语言)被广泛地应用于大多数数据库中,使用SQL语言可以方便地查询、操作、定义和控制数据库中的资料。SQL语言主要由以下几部分组成。

-资料定义语言(DataDefinitionLanguage,DDL),如create、alter、drop等。

-资料操纵语言(DataManipulationLanguage,DML),如select、insert、update、delete等。

-资料控制语言(DataControlLanguage,DCL),如grant、revoke等。

-事务控制语言(TransactionControlLanguage),如commit、rollback等。

在应用程序中使用最多的就是资料操纵语言,它也是最常用的核心SQL语言。下面对资料操纵语言进行简单的介绍。

1.select语句

select语句用于从资料表中检索资料。语法如下:

SELECT 所选字段列表 FROM 资料表名 WHERE 条件表示式 GROUPBY 字段名HAVING 条件表示式(指定分组的条件) ORDER BY 字段名 [ASC|DESC]

假设资料表名称是tb_emp,要检索出tb_emp表中所有女员工的姓名、年龄,并按年龄升序排序,程式码如例所示。将tb_emp表中所有女员工的姓名、年龄按年龄升序的形式检索出来。

select name,age form tb_emp where sex='女' order by age;

2.insert语句insert语句用于向表中插入新资料。语法如下:

insert into 表名[(字段名1,字段名2…)] values(属性值1,属性值2…)

假设要向资料表tb_emp(包含字段id、name、sex、department)中插入资料,程式码如例所示。向tb_emp表中插入资料。

insert into tb_emp values(2,'lili','女','销售部');

3.update语句update语句用于更新资料表中的某些记录。语法如下:

UPDATE 资料表名 SET 字段名 = 新的字段值 WHERE 条件表示式

假设要将资料表tb_emp中2号员工的年龄修改为24,程式码如例所示。修改tb_emp表中编号是2的员工年龄。

update tb_emp set age = 24 where id = 2;

4.delete语句delete语句用于删除资料。语法如下:

delete from 资料表名 where 条件表示式

假设要删除资料表tb_emp中编号为1024的员工,程式码如例20.4所示。【例20.4】将tb_emp表中编号为1024的员工删除。

delete from tb_emp where id = 1024;

JDBC概述

JDBC是一种可用于执行SQL语句的JavaAPI(ApplicationProgrammingInterface,应用程序设计界面),是连线数据库和Java应用程序的纽带。

JDBC-ODBC桥

JDBC-ODBC桥是一个JDBC驱动程式,完成了从JDBC操作到ODBC操作之间的转换工作,允许JDBC驱动程式被用作ODBC的驱动程式。使用JDBCODBC桥连线数据库的步骤如下:(1)首先载入JDBCODBC桥的驱动程式。程式码如下:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Class类是java.lang包中的一个类,通过该类的静态方法forName()可载入sun.jdbc.odbc包中的JdbcOdbcDriver类来建立JDBC-ODBC桥联结器。

(2)使用java.sql包中的Connection界面,并通过DriverManager类的静态方法getConnection()建立连线物件。程式码如下:

Connection conn = DriverManager.getConnection("jdbc:odbc:资料来源名字","username","password");

资料来源必须给出一个简短的描述名。假设没有设定username和password,则要与资料来源tom交换资料。建立Connection物件的程式码如下:

Connection conn = DriverManager.getConnection("jdbc.odbc:tom","","");

(3)向数据库传送SQL语句。使用Statement界面宣告一个SQL语句物件,并通过刚才建立的连线数据库物件conn的createStatement()方法建立这个SQL物件。程式码如下:

Statement sql = conn.createStatement();

JDBC-ODBC桥作为连线数据库的过渡性技术,现在已经不被Java广泛应用了,现在被广泛应用的是JDBC技术。但这并不表示JDBC-ODBC桥技术已经被淘汰,由于ODBC技术被广泛地使用,使得Java可以利用JDBCODBC桥访问几乎所有的数据库。JDBC-ODBC

桥作为sun.jdbc.odbc包与JDK一起自动安装,不需要特殊配置。

 JDBC技术

JDBC的全称是JavaDataBaseConnectivity,是一套面向物件的应用程序界面,指定了统一的访问各种关系型数据库的标准界面。JDBC是一种底层的API,因此访问数据库时需要在业务逻辑层中嵌入SQL语句。SQL语句是面向关系的,依赖于关系模型,所以通过JDBC技术访问数据库也是面向关系的。JDBC技术主要完成以下几个任务:

-与数据库建立一个连线。

-向数据库传送SQL语句。

-处理从数据库返回的结果。

需要注意的是,JDBC并不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程式。下面详细介绍JDBC驱动程式的分类。

 JDBC驱动程式的型别

JDBC的总体结构由4个元件——应用程序、驱动程式管理器、驱动程式和资料来源组成。JDBC驱动基本上分为以下4种。

-JDBC-ODBC桥:依靠ODBC驱动器和数据库通讯。这种连线方式必须将ODBC二进位制程式码载入到使用该驱动程式的每台客户机上。这种型别的驱动程式最适合于企业网或者用Java编写的三层结构的应用程序服务器程式码。

-本地API一部分用Java编写的驱动程式:这类驱动程式把客户机的API上的JDBC呼叫转换为Oracle、DB2、Sybase或其他DBMS的呼叫。这种驱动程式也需要将某些二进位制程式码载入到每台客户机上。

-JDBC网络驱动:这种驱动程式将JDBC转换为与DBMS无关的网络协议,又被某个服务器转换为一种DBMS协议,是一种利用Java编写的JDBC驱动程式,也是最为灵活的JDBC驱动程式。这种方案的提供者提供了适合于企业内部互联网(Intranet)用的产品。为使这种产品支援Internet访问,需要处理Web提出的安全性、通过防火墙的访问等额外的要求。

-本地协议驱动:这是一种纯Java的驱动程式。这种驱动程式将JDBC呼叫直接转换为DBMS所使用的网络协议,允许从客户机上直接呼叫DBMS服务器,是一种很实用的访问Intranet的解决方法。

JDBC网络驱动和本地协议驱动是JDBC访问数据库的首选,这两类驱动程式提供了Java的所有优点。

JDBC中常用的类和界面

在Java语言中提供了丰富的类和界面用于数据库程式设计,利用这些类和界面可以方便地进行资料访问和处理。本节将介绍一些常用的JDBC界面和类,这些类或界面都在java.sql包中。

Connection界面

Connection界面代表与特定的数据库的连线,在连线上下文中执行SQL语句并返回结果。Connection界面的常用方法如表所示。 

Connection界面的常用方法

Connection界面的常用方法

Statement界面

Statement界面用于在已经建立连线的基础上向数据库传送SQL语句。在JDBC中有3种Statement物件,分别是Statement、PreparedStatement和CallableStatement。Statement物件用于执行不带引数的简单的SQL语句;PreparedStatement继承了Statement,用来执行动态的SQL语句;CallableStatement继承了PreparedStatement,用于执行对数据库的储存过程的呼叫。Statement界面的常用方法如表所示。 

Statement界面中常用的方法

Statement界面中常用的方法

PreparedStatement界面

PreparedStatement界面用来动态地执行SQL语句。通过PreparedStatement例项执行的动态SQL语句,将被预编译并储存到PreparedStatement例项中,从而可以反复地执行该SQL语句。PreparedStatement界面的常用方法如表所示。

PreparedStatement界面提供的常用方法

PreparedStatement界面提供的常用方法

DriverManager类

DriverManager类用来管理数据库中的所有驱动程式。它是JDBC的管理层,作用于使用者和驱动程式之间,跟踪可用的驱动程式,并在数据库的驱动程式之间建立连线。如果通过getConnection()方法可以建立连线,则经连线返回,否则丢掷SQLException异常。DriverManager类的常用方法如表所示。

DriverManager类的常用方法

DriverManager类的常用方法

ResultSet界面

ResultSet界面类似于一个临时表,用来暂时存放数据库查询操作所获得的结果集。ResultSet例项具有指向当前资料行的指标,指标开始的位置在第一条记录的前面,通过next()方法可将指标向下移。在JDBC2.0(JDK1.2)之后,该界面添加了一组更新方法updateXXX(),该方法有两个过载方法,可根据列的索引号和列的名称来更新指定列。但该方法并没有将对资料进行的操作同步到数据库中,需要执行updateRow()或insertRow()方法更新数据库。ResultSet界面的常用方法如表所示。

ResultSet界面提供的常用方法

ResultSet界面提供的常用方法

数据库操作

要对数据库表中的资料进行操作,应该首先建立与数据库的连线。通过JDBC的API中提供的各种类可实现对资料表中的资料进行查询、新增、修改、删除等操作。本节以操作MySQL数据库为例,介绍几种常见的数据库操作。

连线数据库

要访问数据库,首先要载入数据库的驱动程式(只需要在第一次访问数据库时载入一次),然后每次访问资料时建立一个Connection物件,接着执行操作数据库的SQL语句,最后在完成数据库操作后销毁前面建立的Connection物件,释放与数据库的连线。

在专案中建立类Conn,并建立getConnection()方法,获取与MySQL数据库的连线,在主方法中呼叫该方法。

获取与MySQL数据库的连线

执行结果如图所示。

程式码说明:

程式码块(1):通过java.lang包的静态方法forName()来载入JDBC驱动程式,如果载入失败会丢掷ClassNotFoundException异常。应该确定数据库驱动类是否成功载入到程式中。

程式码块(2):通过java.sql包中类DriverManager的静态方法getConnection(Stringurl,Stringuser,Stringpassword)建立数据库连线。该方法的3个引数依次指定预连线数据库的路径、使用者名称和密码。返回Connection物件。如果连线失败,则丢掷SQLException异常。

注意

向数据库传送SQL语句

例子中的getConnection()方法只是获取与数据库的连线,要执行SQL语句首先要获得Statement类物件。通过例子建立的连线数据库物件con的createStatement()方法可获得Statement物件。建立Statement类物件sql。程式码如下:

建立Statement类物件sql

处理查询结果集

有了Statement物件以后,可呼叫相应的方法实现对数据库的查询和修改,并将查询的结果集存放在ResultSet类的物件中。

获取查询结果集。程式码如下:

ResultSet res = sql.executeQuery("select*fromtb_emp");

执行结果为返回一个ResultSet物件,ResultSet物件一次只可以看到结果集中的一行资料,使用该类的next()方法可将游标从当前位置移向下一行。

顺序查询

ResultSet类的next()方法的返回值是boolean型别的资料,当游标移动到最后一行之后会返回false。下面的例项就是将资料表tb_emp中的全部资讯显示在控制台上。

本例项在getConnection()方法中获取与数据库的连线,在主方法中将资料表tb_stu中的资料检索出来,储存在遍历查询结果集ResultSet中,并遍历该结果集。

Import java.sql.*; //汇入java.sql包

public class Gradation{ //建立类

static Connection con; //宣告Connection物件

static Statement sql; //宣告Statement物件

static ResultSet res; //宣告ResultSet物件

public Connection getConnection(){ //连线数据库方法

/*********省略了获取数据库连线的程式码******/

return con; //返回Connection物件

}

public static void main(String[]args){ //主方法

Gradation c = newGradation(); //建立本类物件

con = c.getConnection(); //与数据库建立连线

try{

  sql = con.createStatement();  //例项化Statement物件

//执行SQL语句,返回结果集

res = sql.executeQuery("select * fromt b_stu");

while(res.next()){

//如果当前语句不是最后一条,则进入循环

String id = res.getString("id");  //获取列名是id的字段值

//获取列名是name的字段值

String name = res.getString("name");

//获取列名是sex的字段值

String sex = res.getString("sex");

//获取列名是birthday的字段值

String birthday = res.getString("birthday");

System.out.print("编号:"+id); //将列值输出

System.out.print("姓名:"+name);

System.out.print("性别:"+sex);

System.out.println("生日:"+birthday);

}

} catch (Exceptione){

e.printStackTrace();

}

}

}

执行结果如图所示。

执行结果

注意

可以通过列的序号来获取结果集中指定的列值。例如,获取结果集中id列的列值,可以写成getString("id")。由于id列是资料表中的第一列,所以也可以写成getString(1)来获取。结果集res的结构如图所示。

结果集res的结构

模糊查询

SQL语句中提供了LIKE操作符用于模糊查询,可使用“%”来代替0个或多个字元,使用下划线“_”来代替一个字元。例如,在查询姓张的同学的资讯时,可使用以下SQL语句:

select * from tb_stu where name like '张%';

本例项在getConnection()方法中获取与数据库的连线,在主方法中将资料表tb_stu中姓张的同学的资讯检索出来,储存在ResultSet结果集中,并遍历该集合。

import java.sql.*; //汇入java.sql包

public class Train{ //建立类Train

static Connection con; //宣告Connection物件

static Statement sql;   //宣告Statement物件

static ResultSet res; //宣告ResultSet物件

public Connection getConnection(){ //与数据库连线方法

/*******省略了获取数据库连线的程式码********/

return con; //返回Connection物件

}

public static void main(String[]args){ //主方法

Trainc = newTrain(); //建立本类物件

con = c.getConnection(); //获取与数据库的连线 try{ //try语句捕捉异常 sql = con.createStatement(); //例项化Statement物件

//执行SQL语句

res = sql.executeQuery("select * fromt b_stuwhere" + "name like '张%'");

//如果当前记录不是结果集中的最后一条,进入循环体 while(res.next()){

String id = res.getString(1); //获取id字段值

String name = res.getString("name"); //获取name字段值 String sex = res.getString("sex"); //获取sex字段值

//获取birthday字段值

String birthday = res.getString("birthday");

System.out.print("编号:"+id); //输出资讯 System.out.print("姓名:"+name);

System.out.print("性别:"+sex);

System.out.println("生日:"+birthday);

}

} catch(Exceptione){ //处理异常 e.printStackTrace(); //输出异常资讯

}

}

}

执行结果如图所示。

执行结果

预处理语句

向数据库传送一个SQL语句,数据库中的SQL直译器负责把SQL语句生成底层的内部命令,然后执行该命令,完成相关的资料操作。如果不断地向数据库提交SQL语句,肯定会增加数据库中SQL直译器的负担,影响执行的速度。

对于JDBC,可以通过Connection物件的preparedStatement(Stringsql)方法对SQL语句进行预处理,生成数据库底层的内部命令,并将该命令封装在PreparedStatement物件中,通过呼叫该物件的相应方法执行底层数据库命令。这样应用程序能针对连线的数据库,实现将SQL语句解释为数据库底层的内部命令,然后让数据库执行这个命令,这样可以减轻数据库的负担,提高访问数据库的速度。对SQL进行预处理时可以使用万用字元“?”来代替任何的字段值。例如:

sql = con.prepareStatement("select * from tb_stu where id = ?");

在执行预处理语句前,必须用相应方法来设定万用字元所表示的值。例如:

sql.setInt(1,2);

上述语句中的“1”表示从左向右的第几个万用字元,“2”表示设定的万用字元的值。将万用字元的值设定为2后,功能等同于:

sql = con.prepareStatement("select * from tb_stu where id = 2");

尽管书写两条语句看似麻烦了一些,但使用预处理语句可使应用程序更容易动态地改变SQL语句中关于字段值条件的设定。

注意

通过setXXX()方法为SQL语句中的引数赋值时,建议利用与引数匹配的方法,也可以利用setObject()方法为各种型别的引数赋值。例如:

sql.setObject(2,'李丽');

本例项预处理语句动态地获取指定编号的同学的资讯,在此以查询编号为19的同学的资讯为例介绍预处理语句的用法。

importjava.sql.*; //汇入java.sql包

public class Prep{ //建立类Perp

static Connection con; //宣告Connection物件 static PreparedStatement sql; //宣告预处理物件

static ResultSet res; //宣告结果集物件

public Connection getConnection(){ //与数据库连线的方法 try{

Class.forName("com.mysql.jdbc.Driver");

con=DriverManager.getConnection("jdbc:mysql:"+"//127.0.0.1:3306/test","root","123456");

}catch(Exceptione){

e.printStackTrace();

}

returncon; //返回Connection物件

}

public static void main(String[]args){ //主方法

Prep c = newPrep(); //建立本类物件

con = c.getConnection(); //获取与数据库的连线 try{ //例项化预处理物件 sql = con.prepareStatement("select * from tb_stu" +"where id = ?");

sql.setInt(1,19); //设定引数 res=sql.executeQuery(); //执行预处理语句//如果当前记录不是结果集中的最后一行,则进入循环体

while(res.next()){

  Stringid = res.getString(1); //获取结果集中第一列的值 Stringname = res.getString("name");  //获取name列的列值 Stringsex = res.getString("sex"); //获取sex列的列值

//获取birthday列的列值

Stringbirthday = res.getString("birthday");

System.out.print("编号:"+id); //输出资讯 System.out.print("姓名:"+name);

System.out.print("性别:"+sex);

System.out.println("生日:"+birthday);

}

}catch(Exceptione){

e.printStackTrace();

}

}

}

执行结果如图所示。

执行结果

新增、修改、删除记录

通过SQL语句可以对资料执行新增、修改和删除操作。可通过PreparedStatement类的指定引数动态地对资料表中原有资料进行修改操作,并通过executeUpdate()方法执行更新语句操作。

本例项通过预处理语句动态地对资料表tb_stu中的资料执行新增、修改、删除操作,并遍历对资料进行操作之前与对资料进行操作之后的tb_stu表中的资料。

例项

例项-接上图

执行结果如图所示。

执行结果

说明executeQuery()方法是在PreparedStatement物件中执行SQL查询,并返回该查询生成的ResultSet物件,而executeUpdate()方法是在PreparedStatement物件中执行SQL语句,该语句必须是一个SQL资料操作语言(DataManipulationLanguage,DML)语句,如INSERT、UPDATE或DELETE语句,或者是无返回内容的SQL语句,如DDL语句。

小结

主要介绍了Java程式中的数据库操作部分。通过学习,读者应该了解什么是数据库,数据库的种类、功能以及常用的SQL语言的基本语法,重点要掌握使用JDBC技术操作数据库,以及对资料执行增加、删除、修改、查询操作的方法。

PS--------------------本文摘自 明日科技. Java从入门到精通(第4版) 。欢迎感兴趣的小伙伴购买正版图书学习!

2019-10-20 15:54:00

相关文章