程序基础及设计 6_第1页
程序基础及设计 6_第2页
程序基础及设计 6_第3页
程序基础及设计 6_第4页
程序基础及设计 6_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

单元8JDBC数据库管理Java程序设计基础教程(AI助学)(慕课版)人民邮电出版社一位咖啡馆的老板要管理顾客的订单信息,并实时监控库存情况,需要将订单信息存储到数据库中。此时可以使用Java数据库互连(JavaDatabaseConnectivity,JDBC)技术,它提供了一组用于执行结构查询语言(StructureQueryLanguage,SQL)语句的JavaAPI。本单元首先介绍数据库的基本概念和功能,Java应用程序需要可靠的数据库来存储和检索数据;其次介绍JDBC的常用API,包括Connection、Statement、PreparedStatement和ResultSet等,以及它们在数据库操作中的应用;最后,以MySQL数据库为例,演示如何使用JDBC连接和操作数据库,包括建立连接、执行增删改查操作和处理事务。本章导读Thechapter’sintroduction目录导航8.1数据库8.2

JDBC8.3事务管理8.4

【商业实例】“银行提款机”项目——将账户数据存储到数据库中8.5

【综合实训】使用JDBC实现对学生表的增删改查8.1数据库数据库提供了一种组织和存储大量数据的结构化方式,使庞大而复杂的数据变得有序和易于理解;通过高效的数据检索机制,助力用户快速从海量数据中找到所需信息。数据库具有保护数据安全的功能,通过各种安全措施(如访问控制、数据加密等)防止数据泄露或者遭受攻击在保证数据安全的同时,数据库保障了数据的完整性,通过设置主键、外键和其他约束条件,数据库能够有效避免数据冗余和数据不一致的情况发生数据库支持多用户同时访问和操作数据,且能保证在多用户操作下数据的一致性和完整性数据库提供了丰富的工具和功能来分析数据,帮助用户从数据中提取有价值的信息,并为决策提供依据当数据出现问题时,数据库中的备份和恢复功能可以帮助用户迅速恢复数据,保证业务的连续性8.1.1数据库的种类数据库按照存储类型的不同,可分为非关系数据库和关系数据库。非关系数据库(Non-RelationalDatabase)是一类不遵循传统关系模型、不使用SQL作为查询语言的数据库主要用于处理大规模数据和复杂数据类型非关系数据库关系数据库(RelationalDatabase)是一种基于关系模型的数据库,这种数据库以行(Row)和列(Column)的形式存储数据,形成一张二维表。其中,每行代表一条数据记录,每列代表一个数据属性每张表都有一个唯一标识,称为主键,用于唯一标识一行数据。两张表之间可以通过主键和外键建立联系关系数据库8.1.1数据库的种类市面上的关系数据库比较多,它们各有千秋,接下来将介绍应用广泛的几种关系数据库。MySQL:一个开源的关系数据库管理系统,以快速、稳定和易用著称,支持大型数据库,性能卓越。MySQL提供全面的安全管理,且可扩展性好,支持多种操作系统和编程语言接口,广泛应用于网站开发、数据分析等领域,特别适用于基于PHP的应用,如WordPress、Drupal等Oracle:一个企业级的关系数据库管理系统,以出色的稳定性、安全性和可扩展性闻名;支持大规模数据处理,提供全面的安全解决方案与备份和恢复机制。Oracle使用SQL进行数据操作,并提供PL/SQL,支持复杂程序编写,广泛应用于银行、电信等领域SQLServer:微软开发的关系数据库管理系统,支持丰富的数据类型和SQL扩展;具有出色的安全性和可靠性,提供了完整的备份和恢复机制;支持大规模数据处理和商业智能(BusinessIntelligence,BI)功能;可在Windows、Linux和Docker环境中运行,并提供了丰富的开发工具PostgreSQL:一个开源的对象—关系数据库管理系统,强调可扩展性和标准遵从性;支持大部分SQL标准,提供复杂查询、外键、触发器等现代特性;具有出色的可扩展性和可靠性,支持多种操作系统和编程语言;安全性高,提供多种安全机制,并支持SSL远程连接;在数据仓库、数据挖掘、在线事务处理等领域得到广泛应用8.1.2数据库的安装下载数据库01OPTION访问MySQL官网,选择菜单栏中的“DOWNLOADS”选项,单击“MySQLCommunity(GPL)Downloads»”超链接,进入MySQL社区版下载页面,如图8.2所示。图8.2MySQL社区版下载页面8.1.2数据库的安装单击“MySQLInstallerforWindows”超链接,选择版本,单击“Download”按钮进行MySQL数据库的下载,如图8.3所示。如果需要下载历史版本,选择“Archives”选项卡,进入历史版本下载页面,如图8.4所示。图8.3MySQL数据库的下载图8.4历史版本下载页面8.1.2数据库的安装安装数据库02OPTION数据库下载完成后双击安装文件,待安装程序运行后,选择安装类型,如图8.5所示,可根据需要选择以下几种安装类型。图8.5选择安装类型①Serveronly:只安装数据库服务。②Clientonly:只安装数据库客户端。③Full:安装数据库客户端和服务。④Custom:自定义安装。8.1.2数据库的安装选中“Serveronly”单选按钮,单击“Next”按钮,进入确认安装数据库服务界面,如图8.6所示。单击“Execute”按钮进入安装过程,此后一直单击“Next”按钮,直到进入图8.7所示的界面为止,需要在此界面中设置数据库密码。图8.6确认安装数据库服务界面图8.7数据库密码设置界面8.1.2数据库的安装密码设置完成后,单击“Next”按钮直至数据库安装完成,单击“Finish”按钮,如图8.8所示。图8.8数据库安装完成8.1.3数据库的简单操作数据库安装成功之后,就可以对数据库进行操作了。单击“开始”按钮,选择“MySQL8.0CommandClient”选项,打开MySQL命令行客户端,如图8.9所示。输入安装数据库时设置的密码即可登录。在数据库中,有数据库(Database)和表(Table)两个重要概念。图8.9MySQL命令行客户端01数据库一个包含各种数据的集合,这些数据以一种结构化的方式组织、存储和管理。它可以包含表、视图、存储过程等对象。在关系数据库中,数据库是由一个或多个相关的表组成的。一个数据库服务器实例可以包含多个数据库。02表数据库中存储数据的主要结构,由行和列组成。其中,每一列代表一个数据属性(如姓名、电话号码等),每一行代表一条数据记录。8.1.3数据库的简单操作(1)创建数据库CREATEDATABASEdatabase_name;(2)选择数据库USEdatabase_name;(3)创建表CREATETABLEtable_name(column1datatype,column2datatype,column3datatype,…);8.1.3数据库的简单操作(4)插入数据INSERTINTOtable_name(column1,column2,column3,…)VALUES(value1,value2,value3,…);(5)查询数据SELECTcolumn1,column2,…FROMtable_name;(6)更新数据UPDATEtable_nameSETcolumn1=value1,column2=value2,…WHEREcondition;(7)删除数据DELETEFROMtable_nameWHEREcondition;目录导航8.1数据库8.2

JDBC8.3事务管理8.4

【商业实例】“银行提款机”项目——将账户数据存储到数据库中8.5

【综合实训】使用JDBC实现对学生表的增删改查8.2.1JDBC的概念要通过程序对数据库进行控制,需要使用工具JDBC。JDBC是Java提供的API,用来规范客户端程序对数据库的访问,并提供了查询和更新数据库中数据的方法。JDBC的特点包括数据库无关性、支持SQL语句、处理结果集、提供事务支持、预编译SQL语句、支持存储过程调用、可实现异常处理和批处理更新等。8.2.2JDBC的原理JDBC可以将程序和数据库连接起来,并且对外提供对应的API,开发者只需要操作对应的API就可以实现对数据库的操作。JDBC架构主要包括两部分:JDBCAPI和JDBCDriverAPI。JDBCAPIJDBCAPI提供与数据库交互(如执行SQL语句、获取结果集等)所需的各种方法和接口01JDBCDriverAPIJDBCDriverAPI供驱动程序开发者实现,以连接不同的数据库028.2.2JDBC的原理Java程序与数据库交互的步骤如下。加载并注册JDBC驱动:Java程序会通过Class.forName()方法加载数据库特有的JDBC驱动,并注册到DriverManager类中。建立数据库连接:Java程序通过DriverManager的getConnection()方法建立到数据库的连接创建Statement或PreparedStatement对象:一旦连接建立,Java程序就可以通过Connection对象的createStatement()或prepareStatement()方法创建Statement或PreparedStatement对象,用于执行SQL语句执行SQL语句:Java程序通过Statement或PreparedStatement对象的executeQuery()或executeUpdate()方法执行SQL语句处理结果集:如果执行的是查询操作,则Java程序可以通过ResultSet对象处理返回的结果集关闭连接:Java程序需要关闭ResultSet、Statement和Connection对象,以释放资源8.2.2JDBC的原理对Java程序来说,JDBC驱动就像一个数据库的代理,Java程序通过JDBCAPI与JDBC驱动交互,然后JDBC驱动通过数据库特有的方式与数据库进行通信。JDBC驱动原理如图8.10所示。图8.10JDBC驱动原理8.2.3JDBC核心类JDBC有DriverManager、Connection、Statement、ResultSet这4个核心类。JDBC的管理层,负责注册和管理所有的数据库驱动程序。DriverManager会维护一个注册的驱动程序列表DriverManager一个与特定数据库的连接(会话)。在此连接上可以创建语句对象(Statement、reparedStatement或CallableStatement),执行SQL语句并返回结果Connection一个表示数据库查询结果的对象。ResultSet的基本操作包括移动其游标(例如,从一行移动到下一行)和获取当前行的列值ResultSet一个用于执行SQL语句的工具,有3种类型的语句——Statement(用于执行静态SQL语句)、PreparedStatement(用于执行预编译SQL语句)和CallableStatement(用于执行数据库存储过程)Statement8.2.4JDBC驱动连接数据库在使用JDBC连接数据库之前,需要导入JDBC包,这是Java提供的一个用于数据库连接的库。在代码文件的顶部,需要添加以下import语句。importjava.sql.*;加载并注册JDBC驱动。可以通过以下代码实现。Class.forName("com.MySQL.jdbc.Driver");“com.MySQL.jdbc.Driver”是MySQL数据库的驱动。如果使用的是其他数据库(如Oracle或SQLServer),则需要换成对应的驱动。8.2.4JDBC驱动连接数据库建立与数据库的连接,可以通过DriverManager类的getConnection()方法实现,这个方法需要数据库的URL、用户名和密码。Stringurl="jdbc:MySQL://localhost:3306/mydatabase";Stringusername="root";Stringpassword="password";Connectionconn=DriverManager.getConnection(url,username,password);创建Statement对象,并执行SQL语句。Statementstmt=conn.createStatement();Stringsql="SELECT*FROMmytable";ResultSetrs=stmt.executeQuery(sql);8.2.4JDBC驱动连接数据库处理查询的结果Stringname=rs.getString("name");intage=rs.getInt("age");System.out.println("Name:"+name+",Age:"+age);}关闭连接,释放数据库资源rs.close();stmt.close();conn.close();目录导航8.1数据库8.2

JDBC8.3事务管理8.4

【商业实例】“银行提款机”项目——将账户数据存储到数据库中8.5

【综合实训】使用JDBC实现对学生表的增删改查8.3.1事务的概念事务在计算机中被定义为一个程序执行的一系列操作,这一系列操作是一个整体,要么都执行,要么都不执行。在数据库中,事务可以是读取、写入、更新、删除等一系列操作。事务的操作结果可以分为两种,即成功和失败。如果成功,那么之前执行的操作都会提交;如果失败,那么之前执行的操作都会回滚(Rollback),一切内容恢复为操作之前的状态,如图8.11所示。图8.11事务的执行流程8.3.2事务的特性事务具有以下4个特性,通常称之为ACID特性。事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。原子性(Atomicity)在事务开始和完成时,数据必须保持一致。一致性(Consistency)一旦事务完成(即提交),其修改记录将永久保存在数据库中。即使系统崩溃,事务的修改记录也存在。持久性(Durability)数据库提供了一种隔离方法,可以把事务分开,使每个事务不被其他事务干扰,即一个事务所做的修改在最终提交以前,对其他事务是不可见的隔离性(Isolation)8.3.2事务的特性使用JDBC进行事务操作的示例如下:publicvoidtransfer(StringfromAccount,StringtoAccount,Doubleamount)throwsSQLException{Connectionconn=null;PreparedStatementpstmt=null;try{//获取连接

conn=dataSource.getConnection();//开启事务

conn.setAutoCommit(false);//执行转账操作

Stringsql1="UPDATEaccountSETbalance=balance-?WHEREname=?";pstmt=conn.prepareStatement(sql1);pstmt.setDouble(1,amount);pstmt.setString(2,fromAccount);pstmt.executeUpdate();//模拟系统中断

//inti=1/0;Stringsql2="UPDATEaccountSETbalance=balance+?WHEREname=?";pstmt=conn.prepareStatement(sql2);8.3.2事务的特性pstmt.setDouble(1,amount);pstmt.setString(2,toAccount);pstmt.executeUpdate();//如果没有问题,则提交事务

mit();}catch(Exceptione){//如果出现问题,则回滚事务

if(conn!=null){conn.rollback();}e.printStackTrace();}finally{//释放资源

if(pstmt!=null){pstmt.close();}if(conn!=null){conn.close();}}}在上述代码中,定义了一个转账的方法,这个方法中有两步操作:从一个账户扣款和给另一个账户存款。因为这两步操作要么都成功,要么都不成功,所以把它们放在了一个事务中。在执行这两步操作的过程中出现任何问题,都会回滚事务,以保证数据的一致性。8.3.3事务的隔离级别MySQL支持多个用户同时对数据库进行操作,然而这些用户可能操作同一部分数据,这个时候就会涉及事务的隔离级别。事务隔离级别定义了一个事务可能受其他并发事务影响的程度。脏读(DirtyRead)在一个事务处理过程中读取了另一个未提交的事务中的数据。如果那个未提交的事务最终失败或者回滚,那么此次读取的就是不正确的数据不可重复读(Non-RepeatableRead)在一个事务内多次读取同一数据,由于其他事务的修改或删除,每次读取的结果都不同幻读(PhantomRead)在一个事务内执行两次相同的查询操作,但返回的结果集不一样。这通常是因为其他事务在这两次查询期间插入或删除了一些记录8.3.3事务的隔离级别SQL标准中定义了4种隔离级别。01读未提交(ReadUncommitted)最低的隔离级别,事务可读取尚未提交的数据变更,可能导致脏读、幻读和不可重复读02读已提交(ReadCommitted)事务只能读取其他事务已提交的数据变更,而对未提交的数据变更无感知。这种隔离级别可以防止脏读,但幻读和不可重复读仍可能发生03可重复读(RepeatableRead)对同一属性的多次读取结果一致,除非数据被当前事务所修改04串行化(Serializable)最高的隔离级别,通过强制事务按顺序执行,彻底避免了脏读、不可重复读及幻读8.3.3事务的隔离级别这4个隔离级别从上到下并发性能越来越差(数据一致性越来越好),从下到上数据一致性越来越差(并发性能越来越好)。在实际应用中,需要根据业务需求和系统承受能力来选择合适的隔离级别。事务隔离级别对比如表8.1所示。事物隔离级别脏读不可重复读幻读读未提交是是是读已提交否是是可重复读否否是串行化否否否表8.1事务隔离级别对比目录导航8.1数据库8.2

JDBC8.3事务管理8.4

【商业实例】“银行提款机”项目——将账户数据存储到数据库中8.5

【综合实训】使用JDBC实现对学生表的增删改查【商业实例】“银行提款机”项目——将账户数据存储到数据库中本实例涉及数据库表的创建、数据初始化,以及通过程序对数据库进行操作。首先,在MySQL数据库中定义一个包含账户、余额和创建时间等属性的账户表,并创建一条测试数据。其次,通过JDBC技术,在程序中实现与账户表的交互,包括账户的创建和转账。再次,通过程序创建lisi和wangwu两个账户,并初始化账户余额为100元。最后,实现转账功能,这一过程需要开启事务以确保转账的原子性和一致性,从而保障资金的安全。整个流程体现了数据库设计与程序操作的紧密结合。【商业实例】“银行提款机”项目——将账户数据存储到数据库中任务1:创建账户表CREATEDATABASEtest;USEtest;(1)打开MySQL命令行客户端,输入密码,登录数据库。(2)选择数据库,没有可以使用的数据库时需要创建,这里创建数据库test,并使用该数据库,如图8.12所示。图8.12创建并使用数据库test【商业实例】“银行提款机”项目——将账户数据存储到数据库中CREATETABLEAccounts(idINTAUTO_INCREMENT,accountVARCHAR(255)NOTNULL,balanceDECIMAL(10,2)NOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id));(3)创建一张数据库表,包含id、account、balance、created_at4个属性,如图8.13所示。图8.13创建数据库表【商业实例】“银行提款机”项目——将账户数据存储到数据库中INSERTINTOAccounts(account,balance)VALUES('zhangsan',1000.00);(4)创建一条数据,供测试使用,如图8.14所示。图8.14创建测试数据【商业实例】“银行提款机”项目——将账户数据存储到数据库中任务2:使用JDBC访问数据库importjava.sql.*;publicclassSelectAccount{//数据库连接URLprivatestaticfinalStringDB_URL="jdbc:MySQL://localhost:3306/test";//数据库用户名

privatestaticfinalStringUSER="root";//数据库密码

privatestaticfinalStringPASS="password";publicstaticvoidmain(String[]args){try{//1.注册JDBC驱动

Class.forName("com.MySQL.cj.jdbc.Driver");//2.建立数据库连接

Connectionconn=DriverManager.getConnection(DB_URL,USER,PASS);(1)在程序中,使用JDBC访问数据库,并与账户表进行交互。(2)使用main()函数查询账户zhangsan,代码如下。【商业实例】“银行提款机”项目——将账户数据存储到数据库中//3.执行查询

Stringsql="SELECT*FROMAccountsWHEREaccount=?";PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setString(1,"zhangsan");//4.从结果集中提取数据

ResultSetrs=pstmt.executeQuery();while(rs.next()){//按列名检索

intid=rs.getInt("id");Stringaccount_name=rs.getString("account");doublebalance=rs.getDouble("balance");Timestampcreated_at=rs.getTimestamp("created_at");//显示值System.out.print("ID:"+id);System.out.print(",账户:"+account_name);System.out.print(",余额:"+balance);System.out.println(",创建时间:"+created_at);}//5.清理环境

rs.close();pstmt.close();conn.close();}catch(Exceptione){e.printStackTrace();}}}【商业实例】“银行提款机”项目——将账户数据存储到数据库中任务3:创建账户importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;publicclassCreateAccount{//数据库连接URLprivatestaticfinalStringDB_URL="jdbc:MySQL://localhost:3306/test";//数据库用户名

privatestaticfinalStringUSER="root";//数据库密码

privatestaticfinalStringPASS="password";publicstaticvoidmain(String[]args){//创建账户lisicreateAccount("lisi",100D);//创建账户wangwucreateAccount("wangwu",100D);}publicstaticvoidcreateAccount(Stringaccount,doublebalance){(1)创建账户【商业实例】“银行提款机”项目——将账户数据存储到数据库中try{//1.注册JDBC驱动

Class.forName("com.MySQL.cj.jdbc.Driver");//2.建立数据库连接

Connectionconn=DriverManager.getConnection(DB_URL,USER,PASS);//3.执行插入操作

Stringsql="INSERTINTOAccounts(account,balance)VALUES(?,?)";PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setString(1,account);pstmt.setDouble(2,balance);pstmt.executeUpdate();System.out.println("成功创建账户:"+account);//4.清理环境

pstmt.close();conn.close();}catch(Exceptione){e.printStackTrace();}}}【商业实例】“银行提款机”项目——将账户数据存储到数据库中importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;publicclassTransferFunction{//数据库连接URLprivatestaticfinalStringDB_URL="jdbc:MySQL://localhost:3306/tes?autoReconnect=true&useSSL=false";//数据库用户名

privatestaticfinalStringUSER="root";//数据库密码

privatestaticfinalStringPASS="password";publicstaticvoidmain(String[]args){//调用转账方法

transferFunds("lisi","wangwu",50D);}publicstaticvoidtransferFunds(StringfromAccount,StringtoAccount,doubleamount){Connectionconn=null;PreparedStatementpstmt1=null;PreparedStatementpstmt2=null;(2)实现转账功能【商业实例】“银行提款机”项目——将账户数据存储到数据库中try{//1.注册JDBC驱动

Class.forName("com.MySQL.cj.jdbc.Driver");//2.打开数据库连接

conn=DriverManager.getConnection(DB_URL,USER,PASS);//3.开启事务

conn.setAutoCommit(false);//4.执行扣款操作

Stringsql1="UPDATEAccountsSETbalance=balance-?WHEREaccount_name=?";pstmt1=conn.prepareStatement(sql1);pstmt1.setDouble(1,amount);pstmt1.setString(2,fromAccount);intaffectedRows1=pstmt1.executeUpdate();//5.执行存款操作

Stringsql2="UPDATEAccountsSETbalance=balance+?WHEREaccount_name=?";pstmt2=conn.prepareStatement(sql2);pstmt2.setDouble(1,amount);pstmt2.setString(2,toAccount);intaffectedRo

温馨提示

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

评论

0/150

提交评论