V210-JDBC与数据库访问_第1页
V210-JDBC与数据库访问_第2页
V210-JDBC与数据库访问_第3页
V210-JDBC与数据库访问_第4页
V210-JDBC与数据库访问_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章JDBC与数据库访问目录10.1数据库根底知识10.2通过JDBC访问数据库10.3JavaDB10.4本章小结10.1数据库根底知识数据管理的两个阶段文件管理各种数据都是以文件为单位存储在外存,且由操作系统统一管理文件相对独立,文件结构不能很好地反映现实世界中事物之间的联系,文件中存在大量的数据冗余数据库管理以数据为中心组织数据,减少冗余,并提供更高的数据共享能力,由数据库系统进行管理程序和数据具有较高的独立性,当数据的逻辑结构改变时,不涉及数据的物理结构,也不影响应用程序,从而降低应用程序研制与维护的费用10.1.1数据库技术的特点数据库技术有如下一些特点面向企业或部门,以数据为中心组织数据,形成综合性的数据库为各应用共享采用一定的数据模型。数据模型不仅要描述数据本身的特点,而且要描述数据之间的联系数据冗余小,易修改、易扩充。不同的应用程序根据处理要求,从数据库中获取需要的数据,这样就减少了数据的重复存贮,也便于维护数据的一致性程序和数据有较高的独立性。当数据的物理结构和逻辑结构改变时,有可能不影响或较少影响应用程序具有良好的用户接口,用户可方便地开发和使用数据库对数据进行统一管理和控制,提供了数据的平安性、完整性、以及并发控制数据库根底知识10.1.1数据库技术的特点(续)应用程序访问数据库的根本模式DBMS〔数据库管理系统〕是数据库的核心软件。数据库系统的各种操作,包括创立数据库对象、检索和修改数据库中的数据,都是通过DBMS实现的数据库应用程序1数据库应用程序2数据库应用程序3DBMS数据库数据库根底知识10.1.2数据模型数据模型数据库的逻辑结构所有的数据库系统都是基于某种数据模型的不同种类的数据库可能支持不同的数据模型关系数据库就是因为支持关系模型而得名数据库根底知识10.1.2数据模型关系模型形象地说就是二维表结构,也称之为关系表一个关系数据库可以包含多个关系表,关系表是数据库中组织和存储数据的根本单位每个表都用于存储面向某个主题的信息。例如:学生表 存储学生信息系表 存储各系的信息课程表 存储课程信息等关系表每一行存储一个记录,每一列表示记录的一个属性。设计一个关系表时需要为表命名设计表的列结构,其中包括列名及列的数据类型数据库根底知识10.1.2数据模型学生表由5列组成,每一列表示学生的一个属性每个学生都是用学号、姓名、性别、出生年月及所属系的系号等属性来描述,在这些属性上的一组合法取值就对应一个学生记录〔表中的一行〕数据库根底知识10.1.3关系表中的主码与外来码主码为了保证关系表中没有重复的记录,需要为关系表定义一个主码,作用是唯一标识表中的一个记录可以是表中的一列,也可以由几列组合而成在建表时如果定义了主码,系统可以对输入该表的数据进行检查,要求主码不能重、也不能空〔NULL〕例如在学生表中学号可以作为主码,因为一个学号可以唯一地确定表中的一个学生记录由于学生中有重名现象,姓名就不能用来做为主码数据库根底知识10.1.3关系表中的主码与外来码外来码现实世界中事物之间的联系反映到数据库中就表达为表之间的联系,在关系数据库中,借助“外来码”实现存贮这种联系的信息如果一个表中的某一列是另外一个表中的主码,那么该列称之为外来码。例如在学生表中,“系号”就是外来码,因为系号是系表的主码,在学生表中设计了“系号”一列,就是为了存储学生和系之间的联系信息通过外来码和主码的等值连接将不同表里的相关记录连接在一起,从而实现数据库中相关数据的查找可以查询每个学生所在系的信息,也可以查询指定系所包含的学生信息数据库根底知识10.1.3关系表中的主码与外来码NumberNameDepartmentSalaryLocation23603Jones4131100NewJersey24568Kerwin4132000NewJersey34589Larson6421800LosAngeles35761Myers6111400Orlando47132Neumann4139000NewJersey78321Stephens6118500OrlandoPrimarykeyForeign

key数据库根底知识10.1.3关系表中的主码与外来码

——员工信息管理系统(PIMS)的例子该数据库中建有员工根本信息表〔person〕包括工作证号、姓名、部门编号、职务、工资、学历编号等字段工作证号〔ID〕是该表的主码Department列是一个外来码,匹配部门编码表中的DepID主码Education列也是一个外来码,匹配学历编码表中的EduID主码部门编码表〔department〕保存了部门编号和部门名称部门编号〔DepID〕是主码学历编码表〔education〕保存了学历编号和学历名称学历编号〔EduID〕是主码数据库根底知识10.1.3关系表中的主码与外来码

——员工信息管理系统(PIMS)的例子personIDNameDepartmentOccupationSalaryEducation1张三1Manager350052李四2Secretary120033王五3Driver150024韩六4Engineer30004departmentDepIDName1经理室2项目部3财务部4市场部5运输部6后勤部educationEduIDName1初中2高中3大专4本科5硕士6博士数据库根底知识10.1.4建立一个实例数据库建立数据库需要借助于数据库管理系统,不同的数据库管理系统其具体操作方法是不同的,以Windows平台上的一个简单的关系型数据库Access为例,建立一个数据库,为编写Java的数据库访问程序提供一个实例环境1.启动Office2007,在左侧“模板类别”下选择功能,并在右侧选择“新建空白数据库”。在文件名输入栏中输入“PMS.accdb”。该文件代表一个Access数据库数据库根底知识10.1.4建立一个实例数据库(续)PMS数据库窗口出现在Access主窗口中。在数据库窗口的左侧,列出了常用的7类数据库对象。中选中某对象类后,就可以在右窗口中进行有关该对象的操作,如建立、修改,运行等。7类对象的主要含义分别是:表-关系表,可以实现的操作包括表的建立、数据的维护、查询等查询-可以建立一个查询〔视图的概念〕,还可以运行SQL语句窗体-数据库应用界面,可进行简单数据库应用开发报表-报表的制作与打印输出页-可生成基于web页面的数据库应用界面宏-可定义完成特定任务的操作或操作集模块-可定义数据库中使用的公共过程与函数数据库根底知识10.1.4建立一个实例数据库(续)2.左侧的对象栏中右键“表1:表”,再选择“设计视图”,确定表名后,出现如图表设计窗口。在该窗口中可以定义字段的名称、数据类型、字段说明信息〔可选〕等。分别设计Person表、Department表、Education表数据库根底知识10.1.4建立一个实例数据库(续)数据库根底知识10.1.4建立一个实例数据库(续)3.建立表之间的联系点击主窗口“数据库工具”菜单中的“关系”选项,翻开“关系”视图窗口用鼠标拖动Education表的EduID属性,拉到Person表的Education属性上,在自动弹出的“编辑关系”对话框中,选择实施参照完整性,点击“创立”按钮用同样方法建立Department表中DepID列和Person表中Department列数据库根底知识10.1.4建立一个实例数据库(续)4.为每个表创立数据数据库根底知识10.1.5SQL语言简介SQL语言关系数据库的标准语言,从大型数据库〔如Oracle〕到微机数据库〔如Access〕都支持可以实现对数据库的各种操作。例如表及其他数据库对象的定义数据的查询与数据维护对数据库进行控制是非过程化的语言,只需要告诉数据库做什么,而不需要描述怎么做语句都是独立执行的,无上下文联系本身不区分大小写数据库根底知识10.1.5SQL语言简介(续)

——SQL关键字SQL关键字 描述SELECT 从一个或多个表中提取数据FROM SELECT查询的数据表格WHERE 决定数据行被提取、删除或更新的标准GROUPBY 对行进行分组的标准ORDERBY 对行进行排序的标准INNERJOIN 合并多个表格中的行INSERT 向指定表中插入行UPDATE 更新指定表中的行DELETE 删除指定表格中的行数据库根底知识10.1.5SQL语言简介(续)

——SQL语言的读/写操作在SQL语言中,对数据库中数据的操作可分为读写两种读操作〔查询〕通过SELECT语句实现,该语句的执行不会改变数据库中的数据可以返回一行或多行数据也可能没有返回结果〔没有查到满足条件的记录〕写操作,涉及到写操作的语句共有3个INSERTUPDATEDELETE数据库根底知识10.1.5SQL语言简介(续)

——建表语句建表语句定义表中各列的名称及数据类型有关列的数据类型可参考具体数据库的语法手册CREATETABLEperson( idINTEGERPRIMARYKEY, //定义该列为主码 nameVARCHAR(10), //列定义,字符型 departmentINTEGER, //列定义,整型 occupationVARCHAR(10), salaryNUMBER, educationINTEGER);数据库根底知识10.1.5SQL语言简介(续)

——插入语句插入语句向指定表插入一条记录,插入的值要与表的定义匹配插入一行数据INSERTINTOtable_nameVALUES(value1,value2,....)插入一行数据在指定的字段上INSERTINTOtable_name(column1,column2,...)VALUES(value1,value2,....)例如在person表中插入一行INSERTINTOpersonVALUES(1,'张三',1,'manager',3500,5);数据库根底知识10.1.5SQL语言简介(续)

——修改语句修改语句修改指定记录中某列的值,更新表中原有数据其格式为UPDATEtable_nameSETcolumn_name=new_value

WHEREcolumn_name=some_value例如:将person表中id号为1的人员的工资修改为3700元UPDATEpersonSETsalary=3700//指定对哪列进行修改、如何修改WHEREid=1;//选择要修改的行数据库根底知识10.1.5SQL语言简介(续)

——删除语句删除语句删除表中的指定的数据其格式为DELETEFROMtable_nameWHEREcolumn_name=some_value例如删除部门号为4的员工记录DELETEFROMpersonWHEREdepartment=4;数据库根底知识10.1.5SQL语言简介(续)

——查询语句查询语句从指定表中取出指定的数据SELECTselect_list[INTOnew_table]FROMtable_source[WHEREsearch_condition][GROUPBYgroup_by_expression][HAVINGsearch_condition][ORDERBYorder_expression[ASC|DESC]]数据库根底知识10.1.5SQL语言简介(续)

——查询语句例:查询工资大于2000的员工的姓名及职务SELECT* //“*”号表示输出全部列的值FROMperson //指定查询的表,本查询只用到person表WHEREsalary>2000; //查询条件例:查询员工“张三”的学历,输出学历名SELECTFROMperson,education //该查询用到两个表WHERE='张三'ANDcation=id;数据库根底知识10.2通过JDBC访问数据库JDBC〔JavaDataBaseConnectivity〕是用于执行SQL语句的Java应用程序接口,由一组用Java语言编写的类与接口组成,是一种底层API使开发人员可以用纯Java语言编写完整的数据库应用程序用JDBC写的程序能够自动地将SQL语句传送给几乎任何一种数据库管理系统〔DBMS〕10.2通过JDBC访问数据库(续)

——JDBCJDBC〔JavaDataBaseConnectivity〕是一种标准,它让各数据库厂商为Java程序员提供标准的数据库访问类和接口,这样就使得独立于DBMS的Java应用开发工具和产品成为可能隔离了Java与不同数据库之间的对话,使得程序员只须写一遍程序就可让它在任何数据库管理系统平台上运行使用已有的SQL标准,并支持其它数据库连接标准,如与ODBC之间的桥接通过JDBC访问数据库10.2通过JDBC访问数据库(续)Java程序通过JDBC访问数据库的关系应用程序(Java)Java

JDBC驱动程序(Java类)Sun

JDBC/ODBC桥(本地)ODBC驱动程序(本地)数据库客户机数据库100%纯Java解决方案Java-本地代码混合解决方案通过JDBC访问数据库10.1.2通过JDBC访问数据库(续)

——ODBCODBC〔OpenDatabaseConnectivity〕由微软公司提出,用于在数据库管理系统(DBMS)中存取数据是一套用C语言实现的访问数据库的API通过ODBCAPI,应用程序可以存取保存在多种不同数据库管理系统〔DBMS〕中的数据,而不管每个DBMS使用了何种数据存储格式和编程接口对于没有提供JDBC驱动的数据库,从Java程序调用本地的C程序访问数据库会带来一系列平安性、完整性、健壮性等方面的问题,因而通过JDBC-ODBC桥来访问没有提供JDBC接口的数据库是一个常用的方案通过JDBC访问数据库10.1.2通过JDBC访问数据库(续)

——ODBC的结构ODBC的结构应用程序(Application):本身不直接与数据库打交道,主要负责处理并调用ODBC函数,发送对数据库的SQL请求及取得结果驱动器管理器(ODBCmanager):为应用程序装载数据库驱动器数据库驱动器(ODBCDrivers):实现ODBC的函数调用,提供对特定数据源的SQL请求。数据源(DataSources数据库):由用户想要存取的数据以及与它相关的操作系统、DBMS和用于访问DBMS的网络平台组成。访问数据库的模式你的程序<-->ODBC管理器<-->ODBC驱动程序<-->数据库通过JDBC访问数据库10.2通过JDBC访问数据库(续)

——ODBC的缺乏ODBC的缺乏是一个C语言实现的API,并不适合在Java中直接使用。从Java程序调用本地的C程序会带来一系列类似平安性、完整性、健壮性的缺点完全精确地实现从C代码ODBC到JavaAPI写的ODBC的翻译也并不令人满意。比方,Java没有指针,而ODBC中大量地使用了指针,包括极易出错的无类型指针“void*”。ODBC并不容易学习,它将简单特性和复杂特性混杂在一起,甚至对非常简单的查询都有复杂的选项。而JDBC刚好相反,它保持了简单事物的简单性,但又允许复杂的特性通过JDBC访问数据库10.2通过JDBC访问数据库(续)

——JDBCAPIJDBCAPI是一组由Java语言编写的类和接口,包含在java.sql和javax.sql两个包中java.sql为核心包,这个包包含于J2SE中javax.sql包扩展了JDBCAPI的功能,成为了J2EE的一个根本组成局部可分为两个层次面向底层的JDBCDriverAPI主要是针对数据库厂商开发数据库底层驱动程序使用面向程序员的JDBCAPI通过JDBC访问数据库10.2通过JDBC访问数据库(续)

——JDBCAPI的体系结构应用程序通过JDBCAPI和底层的JDBCDriverAPI打交道通过JDBC访问数据库10.2通过JDBC访问数据库(续)

——JDBCAPI的任务面向程序员的JDBCAPI可以完成以下主要任务首先建立和数据源的连接然后向其传送查询和修改等SQL命令最后处理数据源返回的SQL执行的结果通过JDBC访问数据库10.2通过JDBC访问数据库(续)

——JDBCAPI中重要的接口和类名称解释DriverManager处理驱动的调入并且对产生新的数据库连接提供支持DataSource在JDBC2.0API中被推荐使用代替DriverManager实现和数据库的连接Connection代表对特定数据库的连接Statement代表一个特定的容器,容纳并执行一条SQL语句ResultSet控制执行查询语句得到的结果集通过JDBC访问数据库10.2通过JDBC访问数据库(续)

——JDBC程序开发步骤一个根本的JDBC程序开发包含如下步骤设置环境,引入相应的JDBC类选择适宜的JDBC驱动程序并加载分配一个Connection对象分配一个Statement对象用该Statement对象进行查询等操作从返回的ResultSet对象中获取相应的数据关闭Connection通过JDBC访问数据库10.2.1设置环境在本机上安装有关数据库软件下载相应数据库驱动程序并安装在Java程序中引入相应的类和包。任何使用JDBC的源程序都需要引入java.sql包,如必要的时候还需要装载相应的JDBC-ODBC驱动程序的包importjava.sql.*;importsun.jdbc.odbc.JdbcOdbcDriver;通过JDBC访问数据库10.2.1设置环境(续)

——通过JDBC-ODBC桥访问数据库通过JDBC-ODBC桥访问数据库安装Java和JDBCAPI安装JDK的同时就自动安装了安装数据库驱动程序安装JDK的同时就自动安装了安装JDBC-ODBC桥驱动程序安装DBMS建立一个数据库,并注册数据源通过JDBC访问数据库10.2.1设置环境(续)

——注册数据源1.在Windows7操作系统下,依次进入本机的控制面板——>系统和平安——>管理工具——>数据源〔ODBC〕,或者在WindowsXP操作系统下,一次进入本机的控制面板——>管理工具——>数据源〔ODBC〕,弹出“ODBC数据源管理器”对话框,单击“系统DSN”选项卡通过JDBC访问数据库10.2.1设置环境(续)

——注册数据源2.单击“添加”按钮后弹出“创立数据源”对话框,选择“MicrosoftAccessDriver”选项。单击“完成”按钮后,弹出“ODBCMicrosoftAccess安装”对话框,在“数据源名”输入框中填写“PIMS”;在“说明”输入中填写“员工信息管理系统”;单击选择按钮,弹出“选择数据库”对话框,在目录中选定刚刚建好的数据库文件“PMS.mdb”通过JDBC访问数据库10.2.1设置环境(续)

——注册数据源3.单击“高级”按钮,弹出“设置高级选项”对话框,在“登录名称”文本编辑框中设定登录名称为“Test”,在“密码”文本编辑框中设定密码为“1234”。依次确定返回到“ODBC数据源管理器”对话框,这时可以发现“系统数据源”选项中增添了一个新确定的数据源“PIMS”,单击“ODBCMicrosoftAccess”对话框的“确定”按钮,就完成了数据源的注册通过JDBC访问数据库10.2.2建立连接

——装载驱动器接下来要建立和DBMS的连接。包括两个步骤装载驱动器,用Class.forName方法显式装载驱动程序,如:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");以完整的Java类名字符串为参数,装载此类,并返回一个Class对象描述此类执行上述代码时将自动创立一个驱动器类的实例,并自动调用驱动器管理器DriverManager类中的RegisterDriver方法来注册它这里“sun.jdbc.odbc.JdbcOdbcDriver”是驱动器类的名字,可以从驱动程序的说明文档中得到需要注意的是,如果驱动器类有可能不存在,使用此方法就可能会抛出ClassNotFoundException异常,因此需要捕获这个异常:try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){System.out.println(e.getMessage);}通过JDBC访问数据库10.2.2建立连接(续)

——建立连接建立与数据库的连接,调用DriverManager.getConnection()方法。例如,我们要连接上一节创立的Access数据库PIMS,语句如下:Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","test","1234");将返回与指定数据库建立的连接该方法有三个字符串参数第一个是JDBCURL,格式为jdbc:子协议:子名称Jdbc表示协议,JDBCURL中的协议总是jdbc;子协议是驱动器名称;子名称是数据库的名称,如果是位于远程效劳器上的数据库,那么还应该包括网络地址,//主机名:端口/数据库名第二个是访问数据库所需的用户名第三个是用户密码Connection是一个接口,表示与指定数据库的连接DriverManager类位于JDBC的管理层,作用于用户和驱动程序之间。它负责跟踪在一个系统中所有可用的JDBC驱动程序,并在数据库和相应驱动程序之间建立连接通过JDBC访问数据库10.2.3对数据库进行操作建立好到数据库的连接后,就可以进行对数据库的操作了,一般包括如下三个步骤使用Connection对象创立Statement对象使用Statement对象执行SQL命令从上一步骤返回的ResultSet对象中提取执行结果通过JDBC访问数据库10.2.3对数据库进行操作(续)

——创立Statement对象Connection接口有3个方法可用来创立向数据库发送SQL语句的对象createStatement创立向数据库发送SQL语句的Statement对象,用于简单的SQL语句

Statementstmt=con.createStatement();prepareStatement创立向数据库发送SQL语句的PreparedStatement对象,用于带有一个或多个参数的SQL语句。在SQL语句执行前,这些参数将被赋值prepareCall创立向数据库发送SQL语句的CallableStatement对象,用于调用数据库中的存储过程通过JDBC访问数据库10.2.3对数据库进行操作(续)

——使用Statement对象执行语句Statement接口提供了三种执行SQL语句的方法,使用哪一个方法由SQL语句所产生的内容决定executeQuery用于产生单个结果集的语句,例如SELECT语句

ResultSetrs=stmt.executeQuery("Select*FromPerson");executeUpdate用于执行INSERT、UPDATE或DELETE语句,以及CREATETABLE

stmt.executeUpdate("DELETEFROMPersonWHEREName='李四'");返回值是一个整数,表示受影响的行数〔即更新计数〕,比方修改了多少行、删除了多少行等。对于CREATETABLE等语句,因不涉及到行的操作,所以executeUpdate的返回值总为零Execute用于执行返回多个结果集〔ResultSet对象〕、多个更新计数或二者组合的语句。例如执行某个已存储过程或动态执行SQL,这时有可能出现多个结果的情况通过JDBC访问数据库10.2.3对数据库进行操作(续)

——提取执行结果查询结果作为结果集〔ResultSet〕对象返回后,我们可以从ResultSet对象中提取结果使用next方法ResultSet对象中含有检索出来的行,其中有一个指示器,指向当前可操作的行,初始状态下指示器是指向第一行之前方法next的功能是将指示器下移一行,所以第一次调用next方法时便将指示器指向第一行,以后每一次对next的成功调用都会将指示器移向下一行通过JDBC访问数据库10.2.3对数据库进行操作(续)

——提取执行结果使用getXXX方法使用相应类型的getXXX方法可以从当前行指定列中提取不同类型的数据。例如,提取VARCHAR类型数据时就要用getString方法,而提取FLOAT类型数据的方法是getFloat允许使用列名或列序号作为getXXX方法的参数Strings=rs.getString("Name");提取当前行Name列中的数据,并把其从SQL的VARCHAR类型转换成Java的String类型,然后赋值给对象sStrings=rs.getString(2); //提取当前行的第2列数据这里的列序号指的是结果集中的列序号,而不是原表中的列序号通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10-1通过JDBC访问PIMS数据库,进行查询、添加操作importjava.sql.*;publicclassex10_1{ publicstaticvoidmain(String[]args)throwsException{ StringDBDriver="sun.jdbc.odbc.JdbcOdbcDriver"; StringconnectionStr="jdbc:odbc:PIMS"; Connectioncon=null; Statementstmt=null; ResultSetrs=null; Class.forName(DBDriver); //加载驱动器 con=DriverManager.getConnection(connectionStr,“Test”,“1234”); //连接数据库 stmt=con.createStatement(); //创立Statement对象 rs=stmt.executeQuery(“Select*FromPerson”); //查询表 while(rs.next()){ //显示所有记录的ID和姓名 System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); };通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10-1

//添加一条记录 stmt.executeUpdate(“INSERTINTOPersonVALUES(9,‘林时’,3,‘accountant’,2000,4)”); System.out.println("添加数据后的信息为"); rs=stmt.executeQuery(“Select*FromPerson”); //查询表格 while(rs.next()){ //显示 System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); }; stmt.executeUpdate("DELETEFROMPersonWHEREName='林时'"); System.out.println("删除数据后的信息为:"); rs=stmt.executeQuery(“Select*FromPerson”); //查询表格 while(rs.next()){ //显示 System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); }; stmt.close(); //关闭语句 con.close(); //关闭连接 }}通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10_1运行结果执行结果为1张三2李四3王五4韩六添加数据后的信息为:1张三2李四3王五4韩六9林时删除数据后的信息为:1张三2李四3王五4韩六可见数据库中确实是先增加了一条记录,后又删除了一条记录通过JDBC访问数据库10.2.3对数据库进行操作(续)

——getConnectiongetConnection方法的三种形式:staticConnectiongetConnection(Stringurl)staticConnectiongetConnection(Stringurl,Propertiesinfo)staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)urladatabaseurloftheformjdbc:subprotocol:subnameInfoalistofarbitrarystringtag/valuepairsasconnectionarguments;normallyatleasta"user"and"password"propertyshouldbeincluded通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10_1另一种连接方法…StringconnectionStr="jdbc:odbc:PIMS";…Propertiesprop=newProperties();prop.put("charSet","GBK"); //设置数据库连接编码为GBKprop.put("user","Test");prop.put("password","1234");con=DriverManager.getConnection(connectionStr,prop);

//连接数据库…通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10_1另一种连接方法importjava.sql.*;importjava.util.Properties;publicclassJDBCPIMS{ publicstaticvoidmain(String[]args)throwsException{ StringDBDriver="sun.jdbc.odbc.JdbcOdbcDriver"; StringconnectionStr="jdbc:odbc:PIMS"; Connectioncon=null; Statementstmt=null; ResultSetrs=null; Class.forName(DBDriver); //加载驱动器

Propertiesprop=newProperties(); prop.put("charSet","GBK"); //设置数据库连接编码为GBK prop.put("user","Test"); prop.put("password","1234");通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10_1另一种连接方法 con=DriverManager.getConnection(connectionStr,prop); //连接数据库 stmt=con.createStatement(); //创立Statement对象 rs=stmt.executeQuery("Select*FromPerson"); //查询表 while(rs.next()) //显示所有记录的ID和姓名 { System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); } stmt.executeUpdate("INSERTINTOPersonVALUES(9,'林时',3,'accountant',2000,4)"); //添加一条记录 System.out.println("添加数据后的信息为"); rs=stmt.executeQuery("Select*FromPerson"); //查询表格 while(rs.next()) //显示 { System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); }通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10_1另一种连接方法 stmt.executeUpdate("DELETEFROMPersonWHEREName='林时'");

//删除名字为“林时”的记录

System.out.println("删除数据后的信息为:"); rs=stmt.executeQuery("Select*FromPerson"); //查询表格

while(rs.next()) //显示

{ System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); } stmt.close(); //关闭语句

con.close(); //关闭连接

}}通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10-2建立员工信息输入与统计界面,实现一个图形用户界面的数据库应用程序按“员工登记”按钮后弹出的员工记录录入界面菜单“选项”包括“员工登记”和“员工统计”两个菜单项。点击“员工统计”将显示出当前员工数通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10-2importjavax.swing.*;importjavax.swing.border.*;importjava.awt.*;importjava.awt.event.*;importjava.sql.*;publicclassEx10_2implementsActionListener{ JFramef=null; //类属性 publicEx10_2(){ //构造方法 f=newJFrame("员工信息"); //创立一个顶层容器 ContainercontentPane=f.getContentPane(); //获得其内容面板 JPanelbuttonPanel=newJPanel(); //创立一中间容器JPanel JButtonb=newJButton("员工登记"); //创立一原子组件——按钮 b.addActionListener(this); //为按钮添加事件监听器对象 buttonPanel.add(b); //将此按钮添加到中间容器 b=newJButton("退出系统"); //再创立一按钮 b.addActionListener(this); //为按钮增加事件监听器 buttonPanel.add(b); //将按钮添加到中间容器 buttonPanel.setBorder(BorderFactory.createTitledBorder( //设置中间容器边 BorderFactory.createLineBorder(Color.blue,2),"员工登记系统", TitledBorder.CENTER,TitledBorder.TOP)); contentPane.add(buttonPanel,BorderLayout.CENTER); //将中间容器添加到内容面板通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10-2 JMenuBarmBar=newJMenuBar(); //创立菜单条 JMenuselection=newJMenu("选项"); JMenuItemregist=newJMenuItem("员工登记"); JMenuItemsum=newJMenuItem("统计"); selection.add(regist); selection.add(sum); JMenusys=newJMenu("系统"); JMenuItemexit=newJMenuItem("退出系统"); sys.add(exit); mBar.add(selection); mBar.add(sys); f.setJMenuBar(mBar); //为窗体增加菜单 regist.addActionListener(this); //为菜单添加事件监听器 sum.addActionListener(this); exit.addActionListener(this); f.pack(); f.setVisible(true); f.addWindowListener(newWindowAdapter(){ //为窗口操作添加监听器 publicvoidwindowClosing(WindowEvente){ System.exit(0); } }); }通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10-2 publicvoidactionPerformed(ActionEvente){ //实现ActionListener接口唯一的方法 Stringcmd=e.getActionCommand(); //从事件对象获得相关命令名称 if(cmd.equals("员工登记")){ //根据名称选择相应事件 newRegistSystem(f); //显示员工登记对话框 }elseif(cmd.equals("退出系统")){ System.exit(0); }elseif(cmd.equals("统计")){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载驱动器 //和数据库建立连接 Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","Test","1234"); Statementstmt=con.createStatement(); //创立语句 ResultSetrs=stmt.executeQuery("Select*FromPerson"); inti=0; while(rs.next()) i=i+1; JOptionPane.showMessageDialog(f,"共有"+i+"名员工"); //显示信息对话框 stmt.close(); con.close(); //关闭到数据库的连接 }catch(Exceptionex){} } } publicstaticvoidmain(String[]args) //主方法,用于创立Ex9_7类的一个对象 {newEx10_2();}}通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10-2classRegistSystemimplementsActionListener//用于产生JDialog,实现事件监听器接口{ JDialogdialog; JTextFieldtF1=newJTextField(); JTextFieldtF2=newJTextField(); JTextFieldtF3=newJTextField(); JTextFieldtF4=newJTextField(); JTextFieldtF5=newJTextField(); JTextFieldtF6=newJTextField(); RegistSystem(JFramef){//构造方法,从其调用方法中获得对话框的父窗口

dialog=newJDialog(f,"员工登记",true);//产生一modal对话框

ContainerdialogPane=dialog.getContentPane();//接下来注意添加各个组件

dialogPane.setLayout(newGridLayout(7,2)); dialogPane.add(newJLabel("员工编号:",SwingConstants.CENTER)); dialogPane.add(tF1);通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10-2 dialogPane.add(newJLabel("员工姓名:",SwingConstants.CENTER)); dialogPane.add(tF2); dialogPane.add(newJLabel("部门编号",SwingConstants.CENTER)); dialogPane.add(tF3); dialogPane.add(newJLabel("职务",SwingConstants.CENTER)); dialogPane.add(tF4); dialogPane.add(newJLabel("工资",SwingConstants.CENTER)); dialogPane.add(tF5); dialogPane.add(newJLabel("学历编号",SwingConstants.CENTER)); dialogPane.add(tF6); JButtonb1=newJButton("确定"); dialogPane.add(b1); JButtonb2=newJButton("取消"); dialogPane.add(b2); b1.addActionListener(this);//为两按钮增加事件监听器

b2.addActionListener(this); dialog.setBounds(200,150,400,130); dialog.show(); }通过JDBC访问数据库10.2.3对数据库进行操作(续)

——例10-2 publicvoidactionPerformed(ActionEvente){ Stringcmd=e.getActionCommand(); if(cmd.equals("确定")){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动器 Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","Test","1234"); Statementstmt=con.createStatement();//创立语句 intID=Integer.parseInt(tF1.getText()); Stringname=tF2.getText(); intDepID=Integer.parseInt(tF3.getText()); StringOccupation=tF4.getText(); intsalary=Integer.parseInt(tF5.getText()); intEduID=Integer.parseInt(tF6.getText()); StringSQLOrder="INSERTINTOPersonVALUES("+ID+",'" //创立SQL命令字符串 +name+"',"+DepID+",'"+Occupation+"'," +salary+","+EduID+")"; stmt.executeUpdate(SQLOrder);//添加一条记录 stmt.close(); con.close();//关闭连接 }catch(Exceptionex){} }elseif(cmd.equals("取消")){ dialog.dispose();//直接返回主窗口 } }}通过JDBC访问数据库10.2.4执行带参数的SQL语句JDBC支持带参数的SQL语句的执行,这给SQL语句的执行带来很大的灵活性使用该功能时不能使用Statement类对象,必须利用PreparedStatement类对象通过JDBC访问数据库10.2.4执行带参数的SQL语句(续)

——例10-3importjava.sql.*;publicclassEx10_3{ publicstaticvoidmain(String[]args)throwsException{ StringDBDriver="sun.jdbc.odbc.JdbcOdbcDriver"; StringconnectionStr="jdbc:odbc:PIMS"; Class.forName(DBDriver); Connectioncon=DriverManager.getConnection(connectionStr,"Test","1234");

//设置了2个参数 Stringsq="UPDATEpersonSETsalary=?WHEREname=?"; PreparedStatementpstmt=con.prepareStatement(sq);

//为第1个参数赋值,根据参数类型的不同调用不同方法 pstmt.setInt(1,5000); pstmt.setString(2,“张三”); //为第2个参数赋值 pstmt.executeUpdate(); //执行SQL语句 pstmt.close(); //关闭语句 con.close(); //关闭连接 }}通过JDBC访问数据库10.3JavaDBJavaDB:从Java6开始,在JDK中自带的数据库采用Java实现通过JavaDB,程序员可以省掉安装和配置外部数据库的过程,并能方便的进行数据库编程JavaDB的使用方式可以分为嵌入式模式和效劳器模式嵌入式模式的驱动器名为“org.apache.derby.jdbc.EmbeddedDriver”,效劳器模式的驱动器名为“org.apache.derby.jdbc.ClientDriver”10.3JavaDB(续)

——例10-4嵌入式模式JavaDBimportjava.sql.*;importjava.util.*;publicclassHelloJavaDB{ publicstaticvoidmain(String[]args){ try{ StringDBDriver="org.apache.derby.jdbc.EmbeddedDriver"; StringconnectionStr="jdbc:derby:Person;create=true"; Class.forName(DBDriver).newInsta

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论