第10章 数据库编程_第1页
第10章 数据库编程_第2页
第10章 数据库编程_第3页
第10章 数据库编程_第4页
第10章 数据库编程_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

第10章数据库编程《Java基础案例教程》(第3版)学习目标/Target掌握JDBC的常用API,能够简述JDBC常用API的作用

了解JDBC,能够简述JDBC的概念及优点掌握DbUtils的使用,能够使用DbUtils进行数据的增删改查学习目标/Target熟悉DbUtils的作用,能够简述QueryRunner中执行查询、插入、更新和删除操作的方法,以及ResultSetHandler中常用实现类封装结果集的特点熟悉数据库连接池,能够在JDBC程序中使用数据库连接池掌握JDBC编程,能够独立编写JDBC程序操作数据库中的数据章节概述/

Summary为了满足业务需求,应用程序通常需要存储和管理数据。考虑到高效性、便捷性和安全性,大多数应用程序都会选择将数据存储在数据库中进行管理。在与数据库交互时,应用程序需要使用特定的技术来连接和操作数据库中的数据。其中,JDBC是Java用于访问关系型数据库的一种技术。本章将讲解使用JDBC在Java应用程序中进行数据库编程的相关知识。目录/Contents0102JDBC简介JDBC编程03数据库连接池03DbUtilsJDBC简介10.110.1.1JDBC概述了解JDBC概述,能够简述JDBC的概念及优点

先定一个小目标!10.1.1JDBC概述数据库编程是指使用编程语言与数据库进行交互的过程,主要涉及与数据库建立连接、执行SQL语句、读取和写入数据等操作。其中,驱动程序是根据数据库的规范和要求实现的程序,是连接和操作数据库的必要组件,不同的数据库可能有不同的规范和要求,因此提供的驱动程序也会有所差异。10.1.1JDBC概述在JDBC(JavaDatabaseConnectivity,Java数据库互联)出现之前,各数据库厂商提供自己独立的数据库驱动程序,开发人员想要操作不同类型的数据库,需要编写专门针对每个数据库的程序。例如,要访问MySQL数据库就需要编写一种程序,要访问Oracle数据库就需要编写另一种程序。这种情况下,应用程序的可移植性非常差,因为每次切换数据库都需要修改和适配程序。10.1.1JDBC概述JDBC的出现解决了上述问题,JDBC是一套访问数据库的标准Java类库,它定义了应用程序访问和操作数据库的API。通过JDBC,开发人员可以使用相同的API操作MySQL、Oracle或其他关系型数据库。10.1.1JDBC概述Java应用程序通过JDBC访问不同关系型数据库的流程如下图所示。10.1.2JDBC常用API掌握JDBC的常用API,能够简述JDBC常用API的作用

先定一个小目标!10.1.2JDBC常用APIJDBC的API主要位于java.sql包中,该包定义了一系列访问数据库的接口和类,Java程序开发人员可以利用这些接口和类,编写操作数据库数据的JDBC程序。下面将针对java.sql包内常用的接口和类进行讲解。(1)Driver接口Driver接口是JDBC驱动程序的核心接口之一,它定义了与数据库驱动程序进行通信的方法。每个数据库厂商都会提供自己的驱动程序并实现Driver接口,以支持应用程序与该数据库的连接。在编写JDBC程序时,需要把所使用的数据库驱动程序或类库加载到项目的classpath中。10.1.2JDBC常用API(2)DriverManager类DriverManager类是用于管理JDBC驱动程序的类,该类中定义了注册驱动程序及获取数据库连接对象的静态方法,其常用方法如下表所示。方法声明功能描述staticvoidregisterDriver(Driver

driver)用于在DriverManager中注册给定的JDBC驱动程序staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)用于建立和数据库的连接,并返回表示连接的Connection对象需要注意的是,在编写代码时,一般不会使用registerDriver(Driver

driver)方法注册驱动。因为DriverManager类中有一个静态代码块,该静态代码块内部会执行DriverManager对象的

registerDriver()方法注册驱动,所以,如果使用registerDriver()方法注册驱动,相当于注册了两次驱动程序。10.1.2JDBC常用API(2)DriverManager类如果想要手动注册驱动,只需加载Driver类就可以实现,手动注册驱动程序的示例如下。com.mysql.cj.jdbc.Driver为需要注册到DriverManager的驱动类。需要注意的是,使用Class类的forName()方法注册驱动时,参数中指定的驱动类必须是类的全限定名。Class.forName("com.mysql.cj.jdbc.Driver");10.1.2JDBC常用API(2)DriverManager类JDBC根据URL的信息与数据库建立连接,其URL需要按照特定的语法格式来配置。具体的URL格式会根据不同的数据库类型和驱动程序而有所变化,其中连接到MySQL数据库的URL语法格式如下。jdbc:mysql://[hostname]:[port]/database-name[?参数键值对1&参数键值对2…]10.1.2JDBC常用API(2)DriverManager类对连接到MySQL数据库的URL语法格式中的各项解释如下。“jdbc:mysql://”:表示JDBC驱动程序使用

MySQL协议进行连接。hostname:数据库的主机名或IP地址。port:数据库的端口号,如果连接的是本机MySQL数据库,并且使用MySQL的默认端口号3306,则URL中的[hostname]:[port]可以省略。database-name:数据库名称,如果需要在URL中定制连接的一些属性和配置,可以在数据库名称后面使用问号(?)进行声明,如果需要添加多个参数键值对,参数键值对之间使用&进行连接。10.1.2JDBC常用API(2)DriverManager类编写JDBC程序中,注册驱动和获取数据库连接的示例代码如下。//注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//数据库的连接路径Stringurl="jdbc:mysql://localhost:3306/jdbc";Stringusername="root";Stringpassword="root";//获取数据库连接Connectionconn=DriverManager.getConnection(url,username,password);10.1.2JDBC常用API

小提示:如果基于MySQL5之后的驱动包编写操作数据库数据的JDBC程序时,可以省略注册驱动的步骤。程序执行时会自动加载驱动包的META-INF/services/java.sql.Driver文件中的驱动类。MySQL5的驱动类名称为com.mysql.jdbc.Driver,MySQL8的驱动类为com.mysql.cj.jdbc.Driver。(2)DriverManager类10.1.2JDBC常用API(3)Connection接口Connection接口用于表示与数据库的连接,是进行数据库操作的主要入口点。可以通过Connection对象与数据库建立连接,并进行各种数据库操作,包括执行SQL查询、更新数据和进行事务管理等。10.1.2JDBC常用API(3)Connection接口Connection接口的常用方法如下表所示。方法声明功能描述StatementcreateStatement()用于创建一个Statement对象,Statement对象可以执行静态SQL语句PreparedStatementprepareStatement(Stringsql)用于创建一个PreparedStatement对象,PreparedStatement对象可以执行预编译的SQL语句voidcommit()用于提交事务,使所有上一次提交/回滚后进行的更改成为持久更改,并释放当前Connection对象持有的所有数据库锁voidsetAutoCommit(booleanautoCommit)用于设置是否关闭自动提交模式voidroolback()用于回滚事务,用于取消在当前事务中进行的所有更改,并释放当前Connection对象持有的所有数据库锁voidclose()用于关闭与数据库的连接并释放资源10.1.2JDBC常用API(3)Connection接口Connectionconn=DriverManager.getConnection(url,username,password);Stringsql="SELECT*FROMuserWHEREid=1";//定义SQL语句Statementstmt=conn.createStatement();//获取执行SQL语句的对象

Statementtry{

conn.setAutoCommit(false);//关闭事务的自动提交,手动提交事务

stmt.executeUpdate(sql);//执行SQL语句

mit();//提交事务}catch(Exceptionthrowables){

conn.rollback();

//回滚事务 throwables.printStackTrace();}stmt.close();//释放资源conn.close();编写JDBC程序时,通过Connection进行事物管理的示例如右所示。10.1.2JDBC常用API(4)Statement接口Statement接口是Java中用于执行SQL语句的重要接口之一,该接口的实例可以通过Connection对象的createStatement()方法获取,通过该接口实例可以将静态SQL语句发送到数据库中进行编译与执行,并返回数据库的处理结果。静态SQL语句是指在编译时就确定好的SQL语句,其结构和内容在程序运行期间不会发生变化。10.1.2JDBC常用API(4)Statement接口Statement接口提供了三个常用方法用于执行SQL语句,具体如下表所示。方法声明功能描述booleanexecute(Stringsql)用于执行SQL语句,该方法执行SQL语句后可能会返回多个结果,如果执行后结果为ResultSet对象,则返回true;如果执行后结果为受影响的行数或没有任何结果,则返回falseintexecuteUpdate(Stringsql)用于执行SQL中的INSERT、UPDATE和DELETE语句。该方法返回一个int类型的值,表示数据库中受SQL语句影响的行数ResultSetexecuteQuery(Stringsql)用于执行SQL中的SELECT语句,该方法返回一个表示查询结果的ResultSet对象10.1.2JDBC常用API(5)PrepareStatement接口使用Statement接口执行SQL语句时,如果不对输入的SQL语句进行把控,就很有可能收到SQL注入攻击。同时,手动拼接SQL语句会使代码变得冗长,难以阅读和维护。为此,JDBCAPI提供了扩展的PreparedStatement接口,该接口的对象可以执行预编译的SQL语句。预编译的SQL语句是指在执行SQL语句之前,先将SQL语句发送到数据库进行编译,生成一个预编译的执行计划,然后再执行。预编译的SQL语句在每次执行时只需传递参数,而无需重新解析和编译SQL语句,可以在SQL语句中使用占位符来代替具体的参数值。10.1.2JDBC常用API(5)PrepareStatement接口PreparedStatement接口还提供了一系列setter方法,用于将具体的参数值赋值给指定的占位符,常用方法如下。方法声明功能描述intexecuteUpdate()用于执行INSERT、UPDATE或DELETE语句ResultSetexecuteQuery()用于执行SELECT语句,并返回结果集voidsetInt(int

parameterIndex,int

x)用于将SQL语句中parameterIndex位置的占位符赋值为int类型的参数xvoidsetFloat(intparameterIndex,floatf)用于将SQL语句中parameterIndex位置的占位符赋值为float类型的参数fvoidsetLong(intparameterIndex,longl)用于将SQL语句中parameterIndex位置的占位符赋值为long类型的参数l10.1.2JDBC常用API(5)PrepareStatement接口接上页表格。方法声明功能描述voidsetDouble(intparameterIndex,doubled)用于将SQL语句中parameterIndex位置的占位符赋值为double类型的参数dvoidsetBoolean(intparameterIndex,booleanb)用于将SQL语句中parameterIndex位置的占位符赋值为boolean类型的参数bvoidsetString(intparameterIndex,Stringx)用于将SQL语句中parameterIndex位置的占位符赋值为String类型的参数xvoidsetObject(intparameterIndex,Objecto)用于将SQL语句中parameterIndex位置的占位符赋值为Object

类型的参数o10.1.2JDBC常用API(6)ResultSet接口ResultSet接口是JDBC中用于表示数据库查询结果集的接口,执行查询语句得到的结果集会被封装到一个ResultSet对象中。可以将ResultSet对象看作一个包含多个数据行的表格,每一行代表结果集中的一条记录,每一列代表每个字段的值。ResultSet接口内部维护着一个游标,用于指示当前行的位置。初始化ResultSet对象时,游标位于第一行之前的位置。通过调用next()方法,可以将游标移动到下一行。10.1.2JDBC常用API(6)ResultSet接口ResultSet接口的常用方法如下表所示。方法声明功能描述StringgetString(intcolumnIndex)通过字段的索引获取String类型的值,参数columnIndex代表字段在查询结果中的索引StringgetString(StringcolumnName)通过字段的名称获取String类型的值,参数columnName代表字段的名称intgetInt(intcolumnIndex)通过字段的索引获取int类型的值,参数columnIndex代表字段在查询结果中的索引intgetInt(StringcolumnName)通过字段的名称获取int类型的值。参数columnName代表字段的名称booleanabsolute(introw)将游标移动到结果集的第row条记录booleanprevious()将游标从结果集的当前位置移动到上一条记录10.1.2JDBC常用API(6)ResultSet接口方法声明功能描述booleannext()将游标从结果集的当前位置移动到下一条记录voidbeforeFirst()将游标移动到结果集开头(第一条记录之前)voidafterLast()将游标指针移动到结果集末尾(最后一条记录之后)booleanfirst()将游标移动到结果集的第一条记录booleanlast()将游标移动到结果集的最后一条记录intgetRow()返回当前记录的行号StatementgetStatement()返回生成结果集的Statement对象voidclose()释放此ResultSet对象的数据库和JDBC资源10.1.2JDBC常用API(6)ResultSet接口ResultSet移动结果集的游标和获取结果集数据的示例如下所示。//执行SQL并获取结果集ResultSetrs=stmt.executeQuery(sql);//光标向下移动一行,并且判断当前行是否有数据while(rs.next()){ //根据字段的名称获取结果集中的数据 intid=rs.getInt("id"); Stringname=rs.getString("username");//根据字段的索引获取结果集中的数据 Stringpwd=rs.getString(3);}//释放资源rs.close();JDBC编程10.210.2JDBC编程掌握JDBC编程,能够独立编写JDBC程序操作数据库中的数据

先定一个小目标!10.2JDBC编程加载并注册数据库驱动程序通过DriverManager获取数据库连接通过Connection对象获取Statement对象关闭连接,释放资源操作ResultSet结果集执行SQL语句使用JDBC的常用API编写JDBC程序的大致步骤如下。10.2JDBC编程案例演示下面根据上述步骤编写一个JDBC程序,用于查询数据库中的数据并输出在控制台。(1)搭建数据库环境在MySQL中创建一个名称为jdbc_demo的数据库,在该数据库中创建一个tb_space表用于存储航天里程碑的信息。CREATEDATABASEIFNOTEXISTSjdbc_demoCHARACTERSETutf8mb4;USEjdbc_demo;CREATETABLEtb_space( idINTPRIMARYKEYAUTO_INCREMENT, nameVARCHAR(40), launchtimeDATE );10.2JDBC编程案例演示(1)搭建数据库环境为了便于后续测试,在tb_space表中插入三条数据。INSERTINTOtb_space(name,launchtime) VALUES('东方红一号','1970-4-24'),

('神舟五号','2003-10-15'),('嫦娥一号','2007-10-24');10.2JDBC编程案例演示(1)搭建数据库环境为了查看数据是否插入成功,使用SELECT语句查询tb_space表中的数据,执行结果如下图所示。10.2JDBC编程案例演示(2)创建项目,导入数据库驱动程序在IDEA中创建一个名称为chapter10的Java项目,在项目的根目录创建文件夹lib,在lib文件夹中导入数据库驱动的JAR包。右击lib文件夹,在弹出的菜单中选择“AddasLibrary...”,弹出CreateLibrary对话框。10.2JDBC编程案例演示(3)编写JDBC程序在项目chapter10的src目录下创建一个名称为com.itheima.jdbc的包,并在该包中创建类Example01。在该类中读取jdbc_demo数据库下tb_space表中的所有数据,并将读取结果输出到控制台。Example01.java源代码10.2JDBC编程案例演示(3)编写JDBC程序运行文件Example01.java,结果如下图所示。数据库连接池10.310.3数据库连接池熟悉数据库连接池,能够在JDBC程序中使用数据库连接池

先定一个小目标!10.3数据库连接池在之前的讲解中,每次连接数据库都会创建一个Connection对象,使用完毕就会将其销毁。每一个数据库连接对象都对应一个物理的数据库连接,这样重复创建与销毁的过程会造成系统的性能低下,对此,可以使用数据库连接池。10.3数据库连接池数据库连接池是个容器,负责分配、管理数据库连接对象,通过数据库连接池,程序可以复用连接对象,而不是每次连接数据库都重新创建和销毁数据库连接对象,可以大大提高系统的性能和效率。10.3数据库连接池数据库连接池操作数据库的过程如下图所示。10.3数据库连接池为了更加方便地使用和管理数据库连接池,Java提供了DataSource接口,该接口为应用程序提供了标准化和可重用的方式管理和提供数据库连接。目前,许多厂商和组织已经实现了DataSource接口并提供相应的数据库连接池,常见的数据库连接池包括DBCP、C3P0和Druid等。不同数据库连接池的底层实现可能存在差异,但使用方法基本相似。下面以Druid为例讲解数据库连接池的使用。10.3数据库连接池Druid数据库连接池的使用步骤如下所示。(1)导入JAR包在项目chapter10的lib文件夹中添加Druid的JAR包,并使lib文件夹内的JAR包在项目中生效。10.3数据库连接池(2)创建配置文件在项目的src目录下创建配置文件perties,用于存放数据库连接的信息。perties源代码10.3数据库连接池(3)测试数据库连接池创建一个测试类Example02,并在该类的main()方法中加载连接池的配置文件,根据配置文件的信息创建连接池对象,并通过连接池对象获取数据库连接对象。Example02.java源代码10.3数据库连接池(3)测试数据库连接池运行文件Example02.java文件,运行结果如下图所示。DbUtils10.410.4DbUtils掌握DbUtils的使用,能够使用DbUtils进行数据的增删改查

先定一个小目标!10.4DbUtils使用JDBC进行开发时,像SQL中传递参数值,以及处理结果的时候比较繁琐,导致冗余代码较多,对此,可以将JDBC常用的一些功能进行封装,提高编程效率。CommonsDbUtils是一个开源的JDBC工具类库。它对JDBC进行了简单的封装,简化了JDBC进行数据查询和记录读取操作。10.4DbUtils1.QueryRunner类QueryRunner类提供了对SQL语句操作的API,它封装的查询、插入、更新和删除等数据库操作方法,可以更方便地进行数据库操作。QueryRunner类常用的构造方法和方法如下表所示。方法功能描述

QueryRunner()用于创建一个与数据库无关的QueryRunner对象,后期再操作数据库时,需要手动提供一个Connection对象QueryRunner(DataSourceds)用于根据数据源ds创建QueryRunner对象intupdate(Connectionconn,Stringsql,Object...params)用于执行增加、删除和更新等数据操作,其中传入的参数

params

会赋值到SQL语句的占位符中,并根据数据库连接对象执行SQL语句10.4DbUtils1.QueryRunner类接上页表格。方法功能描述intupdate(Stringsql,Object...params)用于执行增加、删除和更新等数据操作,和上一行方法的区别在于它需要从构造方法的数据源DataSource中获得Connection对象query(Connectioncon

温馨提示

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

评论

0/150

提交评论