版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第13章
数据库访问技术本章知识点JDBC技术 JDBC的体系结构 JDBC驱动程序类型 JDBC中的主要接口和类的使用 DriverManager类 Connection接口 Statement接口 PreparedStatement接口ResultSet接口数据库开发模式JDBC(JavaDatabaseConnectivity)技术:使用标准的SQL,以统一的方式、非常便捷的操作各种主流数据库。JDBC开发的数据库应用既可以跨平台,也可以跨数据库运行。JDBCAPI:Sun制定的操作数据库的标准,与数据库操作相关的部分都是接口,没有提供实现类。关于JDBC13.1JDBC的体系结构和JDBC驱动程序的实现方式JDBC提供的编程接口分为两部分:面向应用程序的编程接口JDBCAPI和供底层开发的驱动程序接口JDBCDriverAPI。JDBCDriverAPI是为各个商业数据库厂商提供的,数据库厂商依据JDBCDriverAPI接口设计各自数据库产品的驱动程序。数据库驱动程序是与具体的数据库相关的,用于向数据库提交SQL请求,并将结果返回给应用程序。13.1.1JDBC的体系结构JDBCAPI是为Java程序员提供的,其作用是屏蔽不同的数据库驱动程序之间的差别,使Java程序员有一个标准的、纯Java的数据库程序设计接口,使Java可以访问任意类型的数据库。13.1.1JDBC的体系结构JDBCDriverManager工作在Java应用程序与数据库驱动程序之间,为应用程序加载和调用驱动程序。Java应用程序首先使用JDBCAPI来与JDBCDriverManager交互,由JDBCDriverManager载入指定的数据库驱动程序,之后就可以由JDBCAPI直接存取数据库。13.1.1JDBC的体系结构13.1.2JDBC驱动程序的实现方式JDBCAPIType2NativeAPINativeDriver数据库Type3JDBC-NetpureJavadrivermiddleware服务器数据库Type4Native-protocolpureJavadriver数据库本地协议纯Java驱动程序13.1.2JDBC驱动程序的实现方式NativeAPIBridgeJava应用程序NativeDriver数据库Type2:Native-APIpartly-Javadriver:本地API-部分用Java来编写的驱动程序。应用程序使用JDBCAPI访问数据库时,驱动程序将JDBCAPI访问转换成数据库厂商提供的数据库API访问。要求客户端必须安装特定的数据库客户端开发包,限制了应用程序对其他数据库的使用(可移植性)。例如,Oracle提供有此类型的驱动。最大的好处就是功能强大;缺点:需要在客户端安装一个很大的数据库客户端开发包、非可移植性,数据库升级可能要修改客户端API,线程不安全等等。
13.1.2JDBC驱动程序的实现方式Type3:JDBC-NetpureJavadriver:JDBC网络纯Java驱动程序。JDBC驱动程序会将JDBCAPI调用解释成与数据库无关的网络通信协议,经过中间服务器的第二次解析,最后才转换成相对应的数据库通信协议。通过中间件存取数据库,用户不需要安装特定的驱动程序,而是调用中间件。具有最大的灵活性,通常由非数据库厂商提供。JDBC-middlewareJava应用程序middleware数据库13.1.2JDBC驱动程序的实现方式Type4:Native-protocolpureJavadriver:本地协议纯Java驱动程序。这种驱动程序将JDBCAPI调用直接转换为数据库管理系统
所使用的相关协议。性能最高。PureJavaDriverJava应用程序数据库13.2建立JDBC数据库连接13.2.1JDBCAPI的主要类和接口DriverManager是用于管理JDBC驱动的服务类,使用getConnection()方法获取到数据库的连接对象Connection。13.2.1JDBCAPI的主要类和接口Connection对象代表到数据库的物理连接,通过它可以获取执行SQL语句的Statement对象和PreparedStatement对象。13.2.1JDBCAPI的主要类和接口Statement对象在执行SQL语句时将SQL语句传入。PreparedStatement对象则用预编译的方式包装SQL语句,执行SQL语句时无需再传入SQL语句,通常只需要传入SQL语句的参数,因为数据库不必每次都编译SQL语句,因此性能更好。13.2.1JDBCAPI的主要类和接口Statement对象和PreparedStatement对象执行select语句时,会返回查询得到的结果集ResultSet对象。ResultSet接口提供了访问查询结果的方法:用next()方法实现对记录集合的迭代(行层次),对于当前记录通过字段的索引值或者字段名可以获取字段的取值(列层次)。使用Type4纯Java驱动的方式建立数据库连接的过程。1.导入数据库驱动程序jar文件13.2.2连接数据库1.导入数据库驱动程序jar文件13.2.2连接数据库2.加载驱动(1)使用类装载器加载驱动Java的Class类提供了静态方法forName("类名"),其功能是要求JVM查找并加载指定的类。 Class.forName(driverName);driverName为数据库驱动程序类,例如,MySQL的驱动程序类为com.mysql.jdbc.Driver(在MySQL的驱动jar包下按照包层次可以找到Driver类)。 Class.forName("com.mysql.jdbc.Driver");注意:因为被加载的类未必总会被找到,所以forName()方法有一个ClassNotFoundException异常需要被捕获。13.2.2连接数据库2.加载驱动(2)直接实例驱动直接实例驱动就是创建数据库驱动类的对象,并使用DriverManager类的registerDriver()方法注册该对象。13.2.2连接数据库try{ Driverdriver=newcom.mysql.jdbc.Driver(); DriverManager.registerDriver(driver);}catch(SQLExceptione){ e.printStackTrace();}3.建立数据库连接驱动加载成功后,就可以使用DriverManger类的getConnection()方法建立与特定数据库的连接,并返回到该数据库连接的Connnetion对象。getConnection()的格式:
ConnnetiongetConnection(Stringurl,Stringuser,Stringpassword)13.2.2连接数据库1URL访问数据库的路径jdbc:subProtocol://subName主通信协议子通信协议主机地址/数据库名2user用户名3password用户密码13.2.2连接数据库Connectioncon=DriverManager.getConnection("jdbc:mysql://:3306/test","root","1234");1URL访问数据库的路径jdbc:subProtocol://subName主通信协议子通信协议主机地址/数据库名2user用户名3password用户密码13.2.2连接数据库4.自定义数据库连接工具类(1)配置文件为了提高Java应用程序的可移植性,通常情况下,数据库连接的驱动、URL字符串、用户名和密码不会直接写在程序中,而是通过读取配置文件导入。这样,无论Java程序需要连接哪一种数据库,都只需将它们的连接信息写入配置文件即可。配置文件perties:driver=com.mysql.jdbc.Driverurl=jdbc:mysql://:3306/testuser=rootpassword=123413.2.2连接数据库(2)创建连接工具类因为连接数据库的步骤是固定的,所以通常将加载驱动、从配置文件读取连接信息、获取数据库连接这些操作封装在一个工具类中,在所有需要使用JDBC的应用程序中直接调用工具类中封装好的方法。配置文件的读取放在static代码块中,在工具类被加载时即完成读取任务。建立数据库连接的工具方法也设计为static,通过工具类直接调用。public
classConnectionFactory{ //利用静态代码块,在工具类被加载时即执行配置文件的读取
private
staticPropertiesprops=newProperties();
static{
try{
props.load(newFileInputStream("perties")); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } }
13.2.2连接数据库 public
staticConnectiongetConnection(){ Connectioncon=null;
try{ Stringdriver=props.getProperty("driver"); Stringurl=props.getProperty("url"); Stringusername=props.getProperty("user"); Stringpassword=props.getProperty("password"); Class.forName(driver); con=DriverManager.getConnection(url,username,password); }catch(ClassNotFoundExceptione){ System.out.println("failedtoregisterdriver."); e.printStackTrace(); }catch(SQLExceptione){ System.out.println("failedtoexecutesql."); e.printStackTrace(); }
returncon; }}13.2.2连接数据库使用JDBC编写数据库应用程序的步骤通常包括:(1)加载驱动(2)建立数据库连接(3)创建Statement或PreparedStatement对象(4)执行SQL语句(5)如果有ResultSet结果集,则对其进行处理(6)释放资源13.3使用JDBC访问数据库通过Connection对象可以获取Statement对象。Connection接口中获取Statement的方法:
StatementcreateStatement()Statement对象用来执行SQL语句,其中用于执行数据表的增(insert)、删(delete)、改(update)操作的方法:
executeUpdate()13.3.1Statement与数据表的增、删、改【例13-1】封装2个方法,完成向数据表user中添加记录和修改记录的操作。13.3.1Statement与数据表的增、删、改(1)获取Statement对象(2)定义SQL语句(3)使用Statement对象执行SQL语句(4)关闭资源【例13-2】利用PreparedStatement对象完成insert(Useruser)操作。13.3.1Statement与数据表的增、删、改"values('grace@126.com','grace','学习')""values('"+user.getEmail()+"','"+user.getUsername()+"','"+user.getHobbies()+"')";字符串拼接的工程非常浩大、繁琐、易错。对于需要传入参数的SQL语句的处理,强烈建议使用PreparedStatement对象处理。PreparedStatement的两个优势(1)它用预编译的方式包装SQL语句,数据库不必每次编译SQL语句,因此性能比Statement好。13.3.2PreparedStatement与数据表的增、删、改insertintouservalues(null,'lucy@126.com','lucy','体育运动');insertintouservalues(null,'leo@126.com','leo','看书');insertintouservalues(null,?,?,?);在执行SQL语句前向占位符“?”传递取值!PreparedStatement的两个优势(2)PreparedStatement对象封装的SQL语句用占位符代表参数,在执行SQL语句前,使用PreparedStatement中定义的各种setXxx()方法对参数进行赋值即可,免去了拼接SQL字符串的繁琐工作,降低了编程复杂度。13.3.2PreparedStatement与数据表的增、删、改PreparedStatement的使用方式:(1)获取PreparedStatement对象前,先定义好SQL语句,参数部分用占位符“?”表示。(2)利用Connection的prepareStatement()方法获取PreparedStatement对象,此时向其传入前面定义好的SQL语句。(3)执行SQL语句前向PreparedStatement对象传入参数,传参时要根据参数的数据类型选择对应的setXxx()方法,例如,对于字符串型的字段要使用setString(),int型字段要使用setInt(),等等,具体可以查看API。(4)用executeUpdate()方法执行增、删、改SQL语句。13.3.2PreparedStatement与数据表的增、删、改13.3.3数据表的查询与ResultSetStatement对象和PreparedStatement对象执行select语句时,会返回查询得到的结果集ResultSet对象。Statement和PreparedStatement都使用executeQuery()方法执行select查询语句,该方法的格式如下:ResultSetexecuteQuery(),查询结果以ResultSet对象返回。结果集ResultSet是一个存储查询结果的对象。13.3.3数据表的查询与ResultSet1.ResultSet的类型13.3.3数据表的查询与ResultSetStatementcreateStatement(int
resultSetType,int
resultSetConcurrency)PreparedStatementprepareStatement(Stringsql,intresultSetType,intresultSetConcurrency)TYPE_FORWARD_ONLY(只允许向前访问一次)TYPE_SCROLL_INSENSITIVE(向前或向后移动)TYPE_SCROLL_SENSITIVE(向前或向后移动+会受到其他用户对数据库所做更改的影响)CONCUR_READ_ONLY(只读)CONCUR_UPDATABLE(可修改)2.ResultSet的迭代—行操作获取到ResultSet结果集后,初始的指针指在结果集第一条记录的前面。如果可以确定select查询的结果只包含一条记录,则使用if(rs.next()){……}控制迭代;如果select查询的结果集包含多条记录,使用while(rs.next()){……}控制迭代。13.3.3数据表的查询与ResultSet3.ResultSet的getXxx()方法—列操作指针指向ResultSet对象的某行后,利用ResultSet提供的各种getXxx()方法,可以获取当前行中的字段取值,获取字段可以用它们在数据表中的位置1、2、3、…,也可以用字段的名称。例如:StringgetString(intcolumnIndex):按字段的位置取出文本型字段值。StringgetString(StringcolumnName):按字段的名字取出文本型字段值。13.3.3数据表的查询与ResultSet【例13-3】向user表中增加一个标识最后一次登录日期的字段,插入几条记录后查询、打印某个指定日期之后的所有记录。13.3.3数据表的查询与ResultSetJava中在java.util包和java.sql包下各自有一个Date类,java.sql包下的Date类用于从数据表读出的date类型数据的存储,java.util包下的Date类则用于与之配合的客户端程序。所以在实体类中,lastLoginDate成员的数据类型应为java.util.Date。带有数据库的应用系统,JDBC访问的架构分为以下几部分。(1)实体类创建一个entity包,为系统中的每个数据表定义一个实体类。实体类与表中的各个字段一一对应,包括个数、数据类型,再定义相应的setter/getter方法、构造方法。(2)DAO接口创建dao包,为每个数据表的访问创建DAO接口,给出最基本的关于数据表的增、删、改、查等操作,这些是关于数据表的最小的原子操作。(3)DAO实现类在dao包下创建impl包----dao.impl,针对某一种数据库实现DAO接口中的方法。连接数据库时利用ConnectionFactory工具类。13.4综合实践--数据库访问的开发模式(4)业务层类创建一个service包,建立系统的业务层。service层根据自身业务需要组合DAO层的增、删、改、查原操作,如果业务层的方法业务逻辑简单,很有可能就是直接调用DAO层的方法。分层架构的好处是为程序提供更好的扩展性和可维护性。随着service业务逻辑的复杂化,业务层方法可能需要调用多个DAO层方法,也可能在需要关联多张数据表时组合多个DAO。(5)应用程序类创建一个client包,定义客户端程序,利用service中提供的业务完成应用系统的功能。13.4综合实践--数据库访问的开发模式13.4.1基于数据库存储的用户管理系统业务层负责封装DAO层的方法,用户管理系统中的业务逻辑比较简单,所以就是直接调用DAO层的方法。注意:业务层方法将增、删、改、查操作从业务层面进行命名,分别为add()、remove()、modify()、find()。13.4.2业务层--封装DAO中的方法各个对话框类在事件处理时使用UserService对象完成相应业务功能,UserService对象中封装的UserDao对象按需创建即可。13.4.3应用层—调用业务层方法完成系统功能本章思维导图MySQL数据库与SQL语法MySQL是一个多用户、多线程的数据库,由瑞典MySQLAB公司开发,2010年被甲骨文公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。其特点是体积小、速度快、总体拥有成本低,为开源软件,MySQL已经成为目前最受欢迎的中小型企业数据库之一。MySQL官方网址:1MySQL数据库的安装和配置MySQL的安装过程:按向导采取默认安装即可MySQL服务器的配置(1)MySQL服务的端口号:MySQL默认数据库应用实例的服务端口是3306。“端口”是一个软件领域抽象出来的概念,如果把计算机的IP地址看作是一部电话,那么端口就相当于分机。每个端口会对应一个端口号,标识计算机为某个应用程序分配的可以与外部进行通信的编号,比如HTTP服务的端口号为80,FTP服务的端口号为21等。1MySQL数据库的安装和配置(2)指定MySQL数据库的字符集MySQL数据库默认的字符集是latin1,即ISO-8859-1,为单字节编码,为了使数据库应用能按照中文字符进行SQL操作,建议在安装时将字符集选定为gbk。系统变量说明安装时指定gbk后的my.ini配置文件character__set_client从客户端发送给服务器的语句的字符集[mysql]default-character-set=gbkcharacter_set_connection客户端和服务器连接的字符集character_set_results从服务器发送到客户端的select语句的最终结果的字符集character_set_database当前数据库的默认字符集[mysqld]character-set-server=gbkcharacter_set_server服务器的默认字符集1MySQL数据库的安装和配置为了避免出现中文乱码,在MySQL中关于字符集的使用应遵循如下原则:(1)保证存入和取出的编码一致,即令character_set_client、character_set_connection、character_set_results的取值相同。为了能够以字符为单位来进行SQL操作,建议使用gbk或者utf8编码。(2)一般情况下,服务端字符集设为utf8(可以支持多国语言),其他设置为gbk。(3)建立数据库/表、进行数据库连接操作时显式指定字符集(建议utf8),而不是依赖MySQL的默认设置,否则在迁移数据库时会带来很大困扰。1MySQL数据库的安装和配置1MySQL数据库的安装和配置启动MySQL后首先输入密码,进入命令行方式1)数据库操作命令2MySQL数据库的基本命令功能命令创建数据库createdatabase[ifnotexists]数据库名
[defaultcharacterset…];显示数据库showdatabases;连接数据库use数据库名;删除数据库drop数据库名;2MySQL数据库的基本命令2)
数据表操作命令功能命令建表createtable<表名>(<字段名1><类型1>[,..<字段名n><类型n>])[characterset=…];显示表showtables;查看表结构desc表名;删除表droptable<表名>;更改表名renametable原表名to新表名;在表中增加字段altertable表名add字段名类型[default…];在表中删除字段altertable表名dropcolumn字段名;修改字段名称/类型altertable表名change原字段名新字段名新类型;【例】建立一张用户信息表,包括id(非空、自动增量、主键)、email(变长字符串、非空、唯一)、username(变长字符串、默认为空)、hobbies(变长字符串、非空)等字段。数据表字符集采用utf8。2MySQL数据库的基本命令说明:“auto_increment”是MySQL中的自增长类型。很多数据库对主键都支持这种自增长的特性,如果某个字段的类型是整型,而且该字段作为主键,则可以指定该列具有自增长功能。这个值没有任何物理含义,仅仅用于标识每行记录。默认地,auto_increment字段的开始值是1,每产生一条新记录递增1。2MySQL数据库的基本命令createtableuser(idintNOTNULLauto_incrementprimarykey,emailvarchar(50)NOTNULLunique,usernamevarchar(50),hobbiesvarchar(50)NOTNULL)charactersetutf8;2MySQL数据库的基本命令createtableuser(idintNOTNULLauto_increment,emailvarchar(50)NOTNULLunique,usernamevarchar(50),hobbiesvarchar(50)NOTNULL,primarykey(id))charactersetutf8;3SQL语句SQL全称是“结构化查询语言(StructuredQueryLanguage)”,最早由IBM公司提出,目的是为了在不同的数据库之间构建一个统一的操作平台。由于SQL具有结构化、功能强大,简单易学的特点,1987年被ANSI制定为标准,此后几乎所有的关系型数据库都支持SQL语言。SQL包含4个部分数据查询语言DQL(DataQueryLanguage):select数据操纵语言DML(DataManipulationLanguage):insert,update,delete数据定义语言DDL(DataDefinitionLanguage):create,drop数据控制语言DCL(DataControlLanguage):commit,rollback功能命令插入记录insertinto<表名>[(<字段名1>[,<字段名2>…])]values(值1)[(值2)…
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年城市文化旅游市场培育策略
- 公路工程劳务外包合同
- 安保消防服务外包合同
- 食堂保洁服务外包合同
- 医院后勤保洁外包合同
- 明日之后建模外包合同
- 学校组织比赛外包合同
- 快递出港客服外包合同
- 2026届浙江省宁波市镇海中学高三下学期模拟预测历史试题(含答案)
- 公立医院解除外包合同
- 2024算力中心冷板式液冷发展研究报告
- 煤炭企业组织结构的创新
- 装配式建筑装饰装修技术 课件 模块三 装配式吊顶
- 新青岛版-二年级下册数学-口算题
- 2024年福建省莆田市初中毕业班质量检查二模英语试卷
- 十大零容忍培训
- 药物不良反应培训讲义
- 汉语写作与百科知识样题
- 提高喷射混凝土施工一次验收合格率QC成果
- 2018年山东德州中考英语试卷真题含答案
- 小白船叶圣陶读后感
评论
0/150
提交评论