




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章JDBC连接数据库11.1关系数据库与SQL语言11.2使用JDBC连接数据库11.3JDBC编程实例11.1关系数据库与SQL语言SQL是StructuredQueryLanguage的缩写,意思是结构化查询语言。SQL语言作为关系型数据库管理系统的标准语言,其主要功能是同各种数据库建立联系并进行操作。SQL最初是由IBM公司提出的,其主要功能是对IBM自行开发的关系型数据库进行操作。11.1.1关系数据库的基本概念顾名思义,数据库(DataBase)是存储数据的仓库,用专业术语来说它是指长期存储在计算机内的、有组织的、可共享的数据集合。在关系型数据库中,数据以记录(Record)和字段(Field)的形式存储在数据表(Table)中,由若干个数据表构成一个数据库。数据表是关系数据库的一种基本数据结构。如图1所示,数据表在概念上很像我们日常所使用的二维表格(关系代数中称为关系)。数据表中的一行称为一条记录,任意一列称为一个字段,字段有字段名与字段值之分。字段名是表的结构部分,由它确定该列的名称、数据类型和限制条件。图1学生数据库的组成及相关名词SQL语言的操作对象主要是数据表。依照SQL命令操作关系型数据库的不同功能,可将SQL命令分成数据定义语言DDL(DataDefinitionLanguage)、数据操纵语言DML(DataManipulationLanguage)、数据查询语言DQL(DataQueryLanguage)和数据控制语言DCL(DataControlLanguage)四大类。11.1.2数据定义语言数据定义语言提供对数据库及其数据表的创建、修改、删除等操作,属于数据定义语言的命令有Create、Alter和Drop。
1.创建数据表在SQL语言中,使用CREATETABLE语句创建新的数据库表格。CREATETABLE语句的使用格式如下:
CREATETABLE表名(字段名l数据类型[限制条件],字段名2数据类型[限制条件],……,字段名n数据类型[限制条件])
说明:
(1)表名是指存放数据的表格名称;字段名是指表格中某一列的名称,通常也称为列名。表名和字段名都应遵守标识符命名规则。
(2)数据类型用来设定某一个具体列中数据的类型。
(3)所谓限制条件就是当输入此列数据时必须遵守的规则。这通常由系统给定的关键字来说明。例如,使用UNIQUE关键字限定本列的值不能重复;NOTNULL用来规定表格中该列的值不能为空;PRIMARYKEY表明该列为该表的主键(也称主码),它既限定本列的值不能重复,也限定该列的值不能为空。
(4)[]表示可选项(下同)。例如,CREATE语句中的限制条件便是一个可选项。
2.修改数据表修改数据表包括向表中添加字段和删除字段。这两个操作都使用ALTER命令,但其中的关键字有所不同。添加字段使用的格式为:
ALTERTABLE表名ADD字段名数据类型[限制条件]删除字段使用的格式为:
ALTERTABLE表名DROP字段名3.删除数据表在SQL语言中使用DROPTABLE语句删除某个表格及表格中的所有记录,其使用格式如下:
DROPTABLE表名11.1.3数据操纵语言
1.向数据表中插入数据
SQL语言使用INSERT语句向数据库表格中插入或添加新的数据行,其格式如下:
INSERTINTO表名(字段名l,……,字段名n)VALUES(值l,……,值n)
说明:命令行中的“值”表示对应字段的插入值。在使用时要注意字段名的个数与值的个数要严格对应,二者的数据类型也应该一一对应,否则就会出现错误。
2.数据更新语句
SQL语言使用UPDATE语句更新或修改满足规定条件的现有记录,使用格式如下:
UPDATE表名SET字段名l新值l[,字段名2新值2……]WHERE条件说明:关键字WHERE引出更新时应满足的条件,即满足此条件的字段值将被更新。在WHERE从句中可以使用所有的关系运算符和逻辑运算符。
3.删除记录语句
SQL语言使用DELETE语句删除数据库表格中的行或记录,其使用格式如下:
DELETEFROM表名WHERE条件说明:通常情况下,由关键字WHERE引出删除时应满足的条件,即满足此条件的记录将被删除。如果省略WHERE子句,则删除当前记录。11.1.4数据查询语句数据库查询是数据库的核心操作。SQL语言提供了SELECT语句进行数据库的查询,并以数据表的形式返回符合用户查询要求的结果数据。SELECT语句具有丰富的功能和灵活的使用方式,其一般的语法格式如下:
SELECT[DISTINCT]字段名l[,字段名2,……]FROM表名[WHERE条件]
其中:DISTINCT表示不输出重复值,即当查询结果中有多条记录具有相同的值时,只返回满足条件的第一条记录值;语句中的字段名用来决定哪些字段将作为查询结果返回。用户可以按照自己的需要返回数据表中的任意的字段,也可以使用通配符“*”来表示查询结果中包含所有字段。11.2使用JDBC连接数据库JDBC是JavaDataBaseConnectivity的缩写,意思是Java程序连接和存取数据库的应用程序接口(API)。此接口是Java核心API的一部分。JDBC由一群类和接口组成,因此,通过调用这些类和接口所提供的成员方法,我们可以方便地连接各种不同的数据库,进而使用标准的SQL命令对数据库进行查询、插入、删除、更新等操作。11.2.1JDBC结构我们只要在Java数据库应用程序中指定使用某个数据库的JDBC驱动程序,就可以连接并存取指定的数据库。而且,当我们要连接几个不同的数据库时,只需修改程序中的JDBC驱动程序,无需对其他的程序代码做任何改动。JDBC的基本结构由Java程序、JDBC管理器、驱动程序和数据库四部分组成,如图2所示。在这四部分中,根据数据库的不同,相应的驱动程序又可分为四种类型。图16.2JDBC驱动程序存取结构
1.Java应用程序
Java程序包括Java应用程序和小应用程序,主要是根据JDBC方法实现对数据库的访问和操作。完成的主要任务有:请求与数据库建立连接;向数据库发送SQL请求;为结果集定义存储应用和数据类型;查询结果;处理错误;控制传输、提交及关闭连接等操作。
2.JDBC管理器
JDBC管理器为我们提供了一个“驱动程序管理器”,它能够动态地管理和维护数据库查询所需要的所有驱动程序对象,实现Java程序与特定驱动程序的连接。它完成的主要任务有:为特定数据库选择驱动程序;处理JDBC初始化调用;为每个驱动程序提供JDBC功能的入口;为JDBC调用执行参数等。
3.驱动程序驱动程序处理JDBC方法,向特定数据库发送SQL请求,并为Java程序获取结果。驱动程序可以完成下列任务:建立与数据库的连接;向数据库发送请求;用户程序请求时,执行翻译;将错误代码格式化成标准的JDBC错误代码等。
4.数据库这里的数据库是指Java程序需要访问的数据库及其数据库管理系统。11.2.2四类JDBC驱动程序当我们想要连接数据库并存取其中的数据时,选择适当类型的JDBC驱动程序是非常重要的。目前JDBC驱动程序可细分为四种类型,如图2所示。不同类型的JDBC驱动程序有着不一样的特性和使用方法。下面将说明不同类型的JDBC驱动程序之间的差异。
类型1:JDBC-ODBCBridge。这类驱动程序的特色是必须在我们的计算机上事先安装好ODBC驱动程序,然后通过JDBC-ODBCBridge的转换,把Java程序中使用的JDBCAPI转换成ODBCAPI,进而通过ODBC来存取数据库。类型2:JDBC-NativeAPIBridge。同类型1一样,这类驱动程序也必须在我们的计算机上先安装好特定的驱动程序(类似ODBC),然后通过JDBC-NativeAPIBridge的转换,把Java程序中使用的JDBCAPI转换成NativeAPI,进而存取数据库。
类型3:JDBC-Middleware。使用这类驱动程序时不需要在我们的计算机上安装任何附加软件,但是必须在安装数据库管理系统的服务器端加装中介软件(Middleware),这个中介软件会负责所有存取数据库时必要的转换。类型4:PureJDBCDriver。使用这类驱动程序时无需安装任何附加的软件(无论是我们的计算机或是数据库服务器端),所有存取数据库的操作都直接由JDBC驱动程序来完成。最佳的JDBC驱动程序类型是类型4,因为使用类型4的JDBC驱动程序不会增加任何额外的负担,而且类型4的JDBC驱动程序是由纯Java语言开发而成的,因此拥有最佳的兼容性。反观类型1和类型2的JDBC驱动程序都必须事先安装其他附加的软件,若我们有30台计算机就必须安装30次附加软件,这将使Java数据库程序的兼容性大打折扣。使用类型3的JDBC驱动程序也是不错的选择,因为类型3的JDBC驱动程序也是由纯Java语言开发而成的,并且中介软件也仅需要在服务器上安装。因此,我们建议最好以类型3和类型4的JDBC驱动程序为主要选择,类型1和类型2的JDBC驱动程序为次要的选择。11.2.3JDBC编程要点在Java中使用数据库进行JDBC编程时,Java程序中通常应包含下述几部分内容:
(1)在程序的首部用import语句将java.sql包引入程序:
importjava.sql.*;(2)使用Class.forName()方法加载相应数据库的JDBC驱动程序。若以加载jdbc-odbc桥为例,则相应的语句格式为:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");(3)定义JDBC的URL对象。例如:
StringconURL="jdbc:odbc:TestDB";
其中TestDB是我们设置的要创建的数据源。
(4)连接数据库。
Connections=DriverManager.getConnection(conURL);(5)使用SQL语句对数据库进行操作。
(6)使用close()方法解除Java与数据库的连接并关闭数据库。例如:
s.close();11.2.4常用的JDBC类与方法
1.DriverManage类
java.sql.DriverManager类是JDBC的管理器,负责管理JDBC驱动程序,跟踪可用的驱动程序并在数据库和相应驱动程序之间建立连接。如果我们要使用JDBC驱动程序,必须加载JDBC驱动程序并向DriverManage注册后才能使用。加载和注册驱动程序可以使用Class.forName()这个方法来完成。此外,java.sql.DriverManager类还处理如驱动程序登录时间限制及登录和跟踪消息的显示等事务。
2.Connection类
java.sql.Connection类负责建立与指定数据库的连接。
3.Statement类
java.sql.Statement类的主要功能是将SQL命令传送给数据库,并将SQL命令的执行结果返回。
4.PreparedStatement类
java.sql.PreparedStatement类的对象可以代表一个预编译的SQL语句,它是Statement接口的子接口。由于PreparedStatement类会将传入的SQL命令编译并暂存在内存中,所以当某一SQL命令在程序中被多次执行时,使用PreparedStatement类的对象执行速度要快于Statement类的对象。因此,将需要多次执行的SQL语句创建为PreparedStatement对象,可以提高效率。
PreparedStatement对象继承Statement对象的所有功能,另外还添加一些特定的方法。
5.ResultSet类
java.sql.ResultSet类表示从数据库中返回的结果集。当我们使用Statement和PreparedStatement类提供的executeQuery()方法来下达Select命令以查询数据库时,executeQuery()方法将会把数据库响应的查询结果存放在ResultSet类对象中供我们使用。11.2.5安装ODBC驱动程序示例尽管在四类JDBC驱动程序中,以选择类型三和类型四的JDBC驱动程序为最佳,但由于目前国内应用较广的数据库是MicrosoftAccess等微软的产品,因此,本小节以它为例,说明创建ODBC用户数据源的步骤。
(1)在Windows的“控制面板”中找到“ODBC(32)数据源”图标并双击之,弹出如图3所示的“ODBC数据源管理器”对话框。图3“ODBC数据源管理器”对话框
(2)在“用户DSN”选项卡的“用户数据源”列表中选中“MSAccessDatebase”选项,然后单击“添加”按钮,弹出如图4所示的“创建新数据源”对话框。图4“创建新数据源”对话框
(3)在图4中,选中“MicrosoftAccessDriver”项,然后单击“完成”按钮,弹出如图5所示的“ODBCMicrosoftAccess安装”对话框。在此对话框中,输入数据源名称后,单击“创建”按钮,弹出如图6所示的“新数据库”对话框。如果事先已经建好了数据库,在图5的对话框中也可单击“选取”按钮,进而指明数据库的存放路径。图5“ODBCMicrosoftAccess安装”对话框
(4)在图6所示的“新数据库”对话框中输入数据库名,选择路径,选择排序,然后单击“确定”按钮,返回“ODBCMicrosoftAccess安装”对话框。图6“新数据库”对话框
(5)在“ODBCMicrosoftAccess安装”对话框中单击“确定”按钮,返回“ODBC数据源管理器”对话框,新添加的用户数据源将出现在此对话框中,如图7所示。此时,单击“确定”按钮,新用户数据源创建完成。创建好用户数据源后,便可以对这个数据源进行数据表的创建和修改,记录的添加、修改和删除等数据库操作。图7安装完成后的“ODBC数据源管理器”对话框
64位操作系统不支持MicrosoftOLEDBProviderforJet驱动程序,也不支持更早的MicrosoftAccessDriver(*.mdb)方式连接。所以,程序里面的链接字符串不能正常工作.
Win7下Access的ODBC连接直接在控制面板---管理工具----数据源(ODBC)打开数据源配置,发现只有SQLServer的驱动,其他的都没有了。
解决方法是:C:/Windows/SysWOW64在这个目录下找到:odbcad32.exe这个文件,双击打开。里面有很多可用个数据源驱动,然后就可用添加连接Access的ODBC的数据源了。11.3JDBC编程实例11.3.1创建数据表
【示例程序c16_1.java】创建学生表student。此表有三个字段:学号(id)、姓名(name)及成绩(score)。importjava.sql.*;//引入java.sql包publicclassc16_1{publicstaticvoidmain(String[]args){StringJDriver="sun.jdbc.odbc.JdbcOdbcDriver";//声明JDBC驱动程序对象
StringconURL="jdbc:odbc:TestDB";//定义JDBC的URL对象
try{Class.forName(JDriver);//加载JDBC-ODBC桥驱动程序
}catch(java.lang.ClassNotFoundExceptione){System.out.println("ForName:"+e.getMessage());}try{Connectioncon=DriverManager.getConnection(conURL);//连接数据库URLStatements=con.createStatement();//建立Statement类对象
Stringquery="createtablestudent("+"idchar(10),"+"namechar(16),"+"scoreinteger"+")";//创建一个含有三个字段的学生表students.executeUpdate(query);//执行SQL命令s.close();//释放Statement所连接的数据库及JDBC资源
con.close();//关闭与数据库的连线
}catch(SQLExceptione){System.out.println("SQLException:"+e.getMessage());}}}其中,
createtablestudent(idchar(10),namechar(16),scoreinteger);
这个SQL语句表示建立一个名为student的表,包含id(字符型,宽度为10)、name(字符型,宽度为16)与score(数字型)三个字段。这段程序的操作结果是创建了一个数据库中student表的结构,表中还没有任何记录。运行结果见数据库文件TestDB.mdb。11.3.2向数据表中插入数据
【示例程序c16_2.java】在上例创建的数据表student中插入三个学生的记录。importjava.sql.*;publicclassc16_2{
publicstaticvoidmain(String[]args)
{StringJDriver="sun.jdbc.odbc.JdbcOdbcDriver";
StringconURL="jdbc:odbc:TestDB";try{Class.forName(JDriver);//注册驱动程序
}catch(java.lang.ClassNotFoundExceptione){System.out.println("ForName:"+e.getMessage(
));}try{Connectioncon=DriverManager.getConnection(conURL);//建立数据库连接
Statements=con.createStatement( );//创建Statement类对象s,准备进行SQL操作
Stringr1="insertintostudentvalues("+"'0001','王明',80)";Stringr2="insertintostudentvalues("+"'0002','高强',94)";Stringr3="insertintostudentvalues("+"'0003','李莉',82)";//使用SQL命令insert插入三条学生记录到表中
s.executeUpdate(r1);//执行SQL命令
s.executeUpdate(r2);s.executeUpdate(r3);s.close( );//释放Statement所连接的数据库及JDBC资源
con.close( );//关闭与数据库的连线
}
catch(SQLExceptione){System.out.println("SQLException:"+e.getMessage(
));}}}该程序的运行结果如图16.8所示。
图16.8程序c16_2的运行结果11.3.3更新数据
【示例程序c16_3.java】修改上例数据表中的第二条和第三条记录的学生成绩字段值,并把修改后的数据表的内容输出到屏幕上。importjava.sql.*;publicclassc16_3{publicstaticvoidmain(String[ ]args){StringJDriver="sun.jdbc.odbc.JdbcOdbcDriver";
StringconURL="jdbc:odbc:TestDB";String[
]id={"0002","0003"};
int[ ]score={89,60};
try{
Class.forName(JDriver);
}catch(java.lang.ClassNotFoundExceptione)
{System.out.println("ForName:"+e.getMessage(
));}try
{Connectioncon=DriverManager.getConnection(conURL);
//修改数据库中数据表的内容
PreparedStatementps=con.prepareStatement(
"UPDATEstudentsetscore=?whereid=?");inti=0,idlen=id.length;do{ps.setInt(1,score[i]);ps.setString(2,id[i]);
ps.executeUpdate(
);//执行SQL修改命令
++i;}while(i<id.length);
ps.close();//查询数据库并把数据表的内容输出到屏幕上
Statements=con.createStatement();ResultSetrs=s.executeQuery("select*fromstudent");while(rs.next( )){System.out.println(rs.getString("id")+"\t"+rs.getString("name")+"\t"+rs.getInt("score"));}s.close();con.close();}catch(SQLExceptione){System.out.println("SQLException:"+e.getMessage());}}}
在这个程序中使用了PreparedStatement类,它提供了一系列的set方法来设定位置。请注意程序中PreparedStatement()方法中的参数“?”。程序中的语句:
PreparedStatementps=con.prepareStatement("UPDATEstudentsetscore=?whereid=?");ps.setInt(1,score[i]);//将score[i]的值作为SQL语句中第一个问号所代表参数的值
ps.executeUpdate();
其中"UPDATEstudentsetscore=?whereid=?"这个SQL语句中各字段的值并没指定,而是以“?”表示。程序必须在执行ps.executeUpdate()语句之前指定各个问号位置的字段值。例如,用ps.setInt(1,score[i])语句中的参数1指出这里的score[i]的值是SQL语句中第一个问号位置的值。当前面两条语句执行完后,才可执行ps.executeUpdate()语句,完成对一条记录的修改。程序中用到的查询数据库并把数据表的内容输出到屏幕的语句是:ResultSetrs=s.executeQuery("select*fromstudent");while(rs.next()){System.out.println(rs.getString("id")+"\t"+rs.getString("name")+"\t"+rs.getInt("score"));}其中,executeQuery()返回一个Res
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CHATA 024-2022儿童中枢神经系统结核的诊断
- T/CGTA 01-2023饲用带轴高湿玉米质量分级
- T/CGMA 022001-2019屋顶通风装置防雨性能试验方法
- T/CCT 016-2024分散吸附集中再生VOCs治理用柱状活性炭
- T/CCS 072-2023智能化煤矿网络运维管理规范
- T/CCPITCSC 096-2022名表真假鉴定规范
- T/CCMA 0141-2022液压挖掘机排气污染物车载测量方法
- T/CCAS 014.5-2022水泥企业安全管理导则第5部分:水泥工厂化验室安全管理
- T/CATCM 001.1-2017保健类眼贴第1部分:通用要求
- T/CAPEB 00001.3-2022制药装备容器和管道第3部分:设计
- 2024年四川西华师范大学招聘辅导员笔试真题
- 2025年市政工程地下管网试题及答案
- 2025年武汉铁路局集团招聘(180人)笔试参考题库附带答案详解
- PHPstorm激活码2025年5月13日亲测有效
- 2025届云南省曲靖市高三第二次教学质量检测生物试卷(有答案)
- 农产品供应链应急保障措施
- 《ISO 37001-2025 反贿赂管理体系要求及使用指南》专业解读和应用培训指导材料之4:6策划(雷泽佳编制-2025A0)
- 2024年中国农业银行安徽蚌埠支行春季校招笔试题带答案
- 2025年2月21日四川省公务员面试真题及答案解析(行政执法岗)
- 国家开放大学汉语言文学本科《中国现代文学专题》期末纸质考试第一大题选择题库2025春期版
- 数字修约考试题及答案
评论
0/150
提交评论