java连接数据库及数据库的查询.docx
《java连接数据库及数据库的查询.docx》由会员分享,可在线阅读,更多相关《java连接数据库及数据库的查询.docx(29页珍藏版)》请在冰豆网上搜索。
java连接数据库及数据库的查询
第7章java连接数据库及数据库的查询
Øjdbc与数据库概述
Ø访问数据库
Ø一个查询数据库的WEB示例
7.1jdbc与数据库概述
数据库是一个有组织的数据集合,它由一个或多个表组成。
每一个表中都存储了对一类对象的数据描述。
数据库管理系统(databasemanagementsystem,DBMS)以一种与数据库格式一致的方式,提供了存储和组织数据的机制。
7.11数据库编程
1)当前主流数据库
当前最流行的数据库是关系型数据库,它是将数据表示为表的集合,通过建立简单表之间的关系来定义结构的一种数据库。
数据库中的表按照行和列的形式来存储信息。
行表示关系型数据库中的记录,列表示数据属性。
比较著名的关系数据库管理系统有Oracle、Sybase、DB2、MySQL、MicrosoftSQLServer、MicrosoftAccess等。
2)sql语言
SQL是一个国际化标准语言,几乎所有关系型数据库都用SQL语言执行数据查询和操纵。
理解SQL语句时要注意几点:
(1)SQL语言中的语句都是独立执行的,无上下文联系;
(2)每条语句都有自己的主关键字,语句中可包含若干子句;
(3)SQL语句本身不区分大小写。
为突出语句格式,下面例子中保留字采用大写。
1.建表语句
格式:
CREATETABLEtable_name(column1type[not]null,…)
功能:
在当前数据库中创建一张名为的table_name表格结构。
2.删除表
格式:
DROPtable_name
功能:
在当前数据库中删除名为table_name的表。
3.查询语句
格式:
SELECTcol1,col2,...,colnFROMtable_name[WHEREcondition_expression]
功能:
从数据库表中检索满足条件的记录。
WHERE子句是可选项,它可以包含<、>、<=、>=、=、<>和LIKE运算符。
LIKE运算符用于带有通配符百分号(%)和下划线(_)的模式匹配。
4.插入语句
格式:
INSERTINTOtable_name[(col1,col2,...,coln)]VALUES(v1,v2,...,vn)
功能:
在表table_name中插入一条记录,各列的值依次分别为v1、v2、…、vn等,若某列的列名未给,则值为NULL。
注意:
(1)如果所有的列名都未给,则在Values中必须依次给出所有列的值。
(2)给出的值的类型必须与对应的列的类型相一致。
5.更新语句
格式:
UPDATEtable_nameSETcol1=v1[,col2=v2,...,coln=vn][WHEREcondition_expression]
功能:
更新表table_name中满足条件的记录,使列col1的值为v1、列col2的值为v2、…、列coln的值为vn等。
注意:
如不给出条件,则更新表中所有记录。
例如,假如银行账户系统中有一张account(账户)表中,账号为“1280316401“的账户取款200元后应更新余额,使用语句如下:
UPDATEaccountSETaccountAmount=accountAmount-200
WHEREaccountNumber=’1280316401’
6.删除语句
格式:
DELETEFROMtable_name[WHEREcondition_expression]
功能:
删除表table_name中满足条件的记录。
特别注意:
如果不给出条件,则删除表中所有记录。
例如,对account表中,账号为“1280316401“的账户进行销户处理,语句如下:
DELETEFORMaccountWHEREaccountNumber=’1280316401’
7.12JDBC框架结构
1)ODBC数据源
ODBC是OpenDatabaseConnectivity的英文简写。
它是由Microsoft提出的为连接不同数据库而制定的一种接口标准,是用C语言实现的,标准应用程序数据接口。
通过ODBCAPI,应用程序可以存取保存在多种不同数据库管理系统(DBMS)中的数据,而不论每个DBMS使用了何种数据存储格式和编程接口。
几乎所有的数据库都支持这一标准。
⏹ODBC有其不足之处,比如它并不容易使用,没有面向对象的特性等等。
⏹ODBC的结构包括四个主要部分:
应用程序接口、驱动器管理器、数据库驱动器和数据源。
进行ODBC数据源设置,在WindowsXP环境下,可按路径开始菜单-设置-控制面板-管理工具-数据源(ODBC),双击可打开如图11.3所示的对话框。
单击系统DSN->单击添加按钮,可以添加不同的odbc数据源。
2)通过JDBC访问数据库
JDBC与ODBC的工作原理非常类似。
JDBC与ODBC都是基于X/Open的SQL调用级接口,JDBC的设计在思想上沿袭了ODBC,同时在其主要抽象和SQLCLI实现上也沿袭了ODBC,这使得JDBC容易被接受。
JDBC的总体结构类似于ODBC,也有四个组件:
应用程序、驱动程序管理器、驱动程序和数据源。
JDBC保持了ODBC的基本特性,也独立于特定数据库。
使用相同源代码的应用程序通过动态加载不同的JDBC驱动程序,可以访问不同的DBMS。
连接不同的DBMS时,各个DBMS之间仅通过不同的URL进行标识。
JDBC的DatabaseMetaData接口提供了一系列方法,可以检查DBMS对特定特性的支持,并相应确定有什么特性,从而能对特定数据库的特性予以支持。
与ODBC一样,JDBC也支持在应用程序中同时建立多个数据库连接,采用JDBC可以很容易地用SQL语句同时访问多个异构的数据库,为异构的数据库之间的互操作奠定基础。
但是,JDBC除了具有ODBC的上述特点外,更具有对硬件平台、操作系统异构性的支持。
这主要是因为ODBC使用的是C语言,而JDBC使用的是Java语言。
Java语言具有与平台无关、移植性强、安全性高、稳定性好、分布式、面向对象等众多优点,而JDBC确保了“100%纯Java”的解决方案,利用Java的平台无关性,JDBC应用程序可以自然地实现跨平台特性,因而更适合于Internet上异构环境的数据库应用。
此外,JDBC驱动程序管理器是内置的,驱动程序本身也可通过Web浏览器自动下载,无须安装、配置;而ODBC驱动程序管理器和ODBC驱动程序必须在每台客户机上分别安装、配置。
1.JDBC数据库驱动程序
⏹JDBC数据库驱动程序的功能是:
一面用底层协议与数据库服务器进行对话;一面用JDBCAPI与用户程序进行对话。
⏹为实现“与平台无关”的特点,JDBC为我们提供了一个“驱动程序管理器”,它能动态维护数据库查询所需的所有驱动程序对象。
⏹用户可以从数据库供应商那里获得JDBC数据库驱动程序。
2.JDBC驱动程序类型
(1)JDBC-ODBCBridge
将对JDBC的调用转化为ODBC的调用,要求本地机必须安装ODBC驱动程序,然后注册一个ODBC数据源名。
(2)JDBC-NativeAPIBridge
直接将用户的调用转化为对数据库客户端API的调用,要求本地机必须安装好特定的驱动程序,显然限制了应用程序对其它数据库的使用。
(3)JDBC-MiddleWare
它是独立于数据库服务器的,它和一个中间件服务器通讯,由中间件负责与数据库通讯。
(4)PureJDBCDriver
使用该类型的应用程序无需安装附加的软件,所有对数据库的操作都直接由JDBC驱动程序完成。
如上图所示:
我们一般通过
(1)JDBC-ODBCBridge和(4)PureJDBCDriver
的方式访问数据库
7.13JDBC典型应用模型
1)两层模型
2)三层模型
7.14JDBC中的主要类和接口
简单地说,JDBC主要完成下列三项任务:
1同一个数据库建立连接;
2向数据库发送SQL语句;
3处理数据库返回的结果。
这些任务由JDBCAPI来完成。
JDBC API 被描述成为一组抽象的Java接口。
这些接口都可能产生异常,如:
ClassNotFoundException、SQLException异常,因而编写程序时必须对抛出的异常进行捕获。
主要的JDBCAPI如下:
(1)驱动程序管理器DrvierManager
用来加载驱动程序,管理应用程序和已注册的驱动程序的连接。
(2)连接Connection
封装了应用程序与数据库之间的连接信息。
(3)驱动程序Driver
负责定位并访问数据库,建立数据库连接和处理所有与数据库的通讯。
(4)语句Statement
用来在数据库中执行一条SQL语句。
(5)结果集ResultSet
负责保存执行查询后返回的数据。
7.2访问数据库
7.21访问数据库的步骤
1)载入jdbc数据库驱动程序
2)建立与数据库的连接
3)在建立数据库连接的前提下执行sql语句
4)取结果集和结果信息
5)关闭数据库连接
7.22连接数据库
1)JDBCURL:
jdbc:
<子协议>:
<数据库子名称>
例如连接到oracle10g的orcl数据库实例的URL是
jdbc:
oracle:
thin:
@10.0.0.13:
1521:
orcl
再例如连接到sqlserver2008的master数据库的URL是
jdbc:
sqlserver:
//10.0.0.13:
1433;databaseName=master
2)建立连接
//加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//定义URL
Stringurl="jdbc:
oracle:
thin:
@10.0.0.13:
1521:
orcl";
//建立连接
Connectionconn=DriverManager.getConnection(url,"username","password");
7.23执行sql语句
取得各列信息
getColumns
取得索引信息
getIndexInfo
7.24Statement语句
7.25取结果集中的数据
7.26一个简单例子
该例把sqlserver2008的master数据库中的spt_monitor表中的数据查询出来,并打印到控制台上
importjava.sql.*;
publicclassDataOperate{
/*
*函数功能:
获取连接数据库的对象
*/
publicConnectiongetConn()throwsException{
Connectionconn=null;
//加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//定义URL
Stringurl="jdbc:
sqlserver:
//localhost:
1433;databaseName=master";
//建立连接
conn=DriverManager.getConnection(url,"sa","123456");
returnconn;
}
/*
*函数功能:
获取执行sql语句的对象
*/
publicStatementgetStmt(Connectionconn)throwsSQLException{
Statementstmt=null;
stmt=conn.createStatement();
returnstmt;
}
/*
*函数功能:
执行sql语句,获取结果集
*/
publicResultSetexecQuery(Stringsql,Statementstmt)throwsSQLException{
ResultSetrs=null;
rs=stmt.executeQuery(sql);
returnrs;
}
/*
*main方法,程序入口
*/
publicstaticvoidmain(Stringargs[]){
//定义查询的sql语句
Stringsql="select*fromspt_monitor";
//实例化当前类的对象
DataOperatedopt=newDataOperate();
Connectionconn=null;
Statementstmt=null;
ResultSetrs=null;
try{
//调用函数获取连接类的对象
conn=dopt.getConn();
//调用函数获取执行sql语句的对象
stmt=dopt.getStmt(conn);
//调用函数取得结果集
rs=dopt.execQuery(sql,stmt);
//循环打印出数据库中每一行数据
while(rs.next()){
System.out.print(rs.getString("cpu_busy")+""+rs.getString("io_busy"));
}
}catch(Exceptione){
e.printStackTrace();
}
try{
if(conn!
=null){
//关闭连接对象
conn.close();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
7.3一个查询数据库的WEB示例
本小节以一个实际例子引导大家开发一个简单的查询数据库的web示例。
开发工具:
MyEclipse6.5
数据库:
SqlSever2008
Web服务器:
Tomcat6.0
JDBC数据库驱动包:
sqljdbc4.jar
以上软件包请同学们自行下载安装。
第一步:
打开sqlserver2008、建库、建表,插入数据。
建立student数据库,建立student表,字段如下图所示:
插入如下图所示数据:
以上步骤请同学自己完成。
也可以完全用sql代码的方式完成,参考代码如下:
--一.建库(注意:
C:
\data是需要手工建立的目录)
createdatabaseSTUDENTon
(
name=STUDENT_data,
filename='C:
\data\STUDENT_data.mdf',
maxsize=50MB,
size=3MB,
filegrowth=1MB
)
logon
(name=STUDENT_log,
filename='C:
\data\STUDENT_log.ldf',
maxsize=50MB,
size=2MB,
filegrowth=1MB
)
;
USESTUDENT;
--二、建表
createtableStudent.dbo.Student
(snochar(4)primarykey,
namevarchar(20)notnull,
sexvarchar
(2),
agesmallint,
nativevarchar(20),
departmentvarchar(50),
addressvarchar(200)
);
---三、插入数据
insertintodbo.Studentvalues('1101','王燕','女',20,'北京','工程系',null);
insertintodbo.Studentvalues('1102','张军','男',21,'上海','工程系',null);
insertintodbo.Studentvalues('1104','张栋','男',21,'南京','工程系',null);
insertintodbo.Studentvalues('1201','吴华','女',20,'成都','计算机系',null);
insertintodbo.Studentvalues('1202','李波','男',21,'上海','计算机系',null);
insertintodbo.Studentvalues('1203','陈建','男',19,'长沙','计算机系',null);
insertintodbo.Studentvalues('1204','王江洪','男',19,'邵阳','基建系',null);
insertintodbo.Studentvalues('1205','潘将','男',19,'常德','艺术系',null);
insertintodbo.Studentvalues('1303','张斌','男',22,'上海','经管系',null);
insertintodbo.Studentvalues('1305','张斌','女',20,'武汉','经管系',null);
第二步:
打开MyEclipse,建立一个web工程webquery,并载入驱动包sqljdbc4.jar。
如下图所示:
新建web工程
添加驱动包
添加驱动包
步骤三建立源代码文件。
分别新建三个包和三个java类文件还有一个jsp文件,如图所示:
源代码及注解如下:
StudentBean.java
packagebeans;
/*
*javabean文件,定义一些变量,跟数据库中相关表的字段一致,并设置get/set方法,
*用来封装数据库表中的数据
*/
publicclassStudentBean{
privateStringsno;
privateStringname;
privateStringsex;
privateStringage;
privateStringnativeplace;
privateStringdepartment;
privateStringaddress;
publicStringgetSno(){
returnsno;
}
publicvoidsetSno(Stringsno){
this.sno=sno;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetSex(){
returnsex;
}
publicvoidsetSex(Stringsex){
this.sex=sex;
}
publicStringgetAge(){
returnage;
}
publicvoidsetAge(Stringage){
this.age=age;
}
publicStringgetNativeplace(){
returnnativeplace;
}
publicvoidsetNativeplace(Stringnativeplace){
this.nativeplace=nativeplace;
}
publicStringgetDepartment(){
returndepartment;
}
publicvoidsetDepartment(Stringdepartment){
this.department=department;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
}
DataOperate.java
packagedboperate;
importjava.sql.*;
/*
*一些操作数据库方法的集合
*/
publicclassDataOperate{
/*
*函数功能:
获取连接数据库的对象
*/
publicConnectiongetConn()throwsException{
Connectionconn=null;
//加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//定义URL
Stringurl="jdbc:
sqlserver:
//localhost:
1433;databaseName=master";
//建立连接
conn=DriverManager.getConnection(url,"sa","123456");
returnconn;
}
/*
*函数功能:
获取执行sql语句的对象
*/
publicStatementgetStmt(Connectionconn)throwsSQLException{
Statementstmt=null;
stmt=conn.createStatement();
returnstmt;
}
/*
*函数功能:
执行sql语句,获取结果集
*/
publicResultSetexecQuery(Stringsql,Statementstmt)throwsSQLException{
ResultSetrs=null;
rs=stmt.executeQuery(sql);
returnrs;
}
}
ExecQuery.java
packageservlets;
importjava.io.*;
importjava.sql.*;
importjava.util.*;
importdboperate.DataOperate;
importbeans.StudentBean;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/*
*