Web技术基础教程 10_第1页
Web技术基础教程 10_第2页
Web技术基础教程 10_第3页
Web技术基础教程 10_第4页
Web技术基础教程 10_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

JavaWeb开发技术与案例教程第6章JDBC访问数据库第6章知识结构6.1使用JDBC访问MySQL•6.1.1下载与安装MySQL•6.1.2配置MySQL•6.1.3配置环境变量•6.1.4验证安装•6.1.5连接数据库6.2案例学习:JDBC操作•6.2.1创建数据库•6.2.2创建数据表•6.2.3增加数据•6.2.4删除数据•6.2.5查询数据•6.2.6修改数据6.3技术要点6.4本章小结1第6章课程导入在实际的网站项目中,需要和数据库进行交互,实现数据库的“增、删、查、改”操作,在JavaWeb中,可以使用基于JDBC(JavaDataBaseConnectivity)的JavaAPI访问关系数据库。通过创建Statement对象执行SQL语句。上述技术组合构建出从前端请求到后端数据处理、再到数据库持久化的完整链路,为Web应用提供可靠的数据支撑。本章将学习的内容包括使用JDBC访问MySQL、异常处理、字符编码等。◆本章要点•掌握MySQL数据库的安装、环境变量配置和使用Workbench验证。•掌握在JavaWeb项目中引入JDBC驱动的两种方式(手动lib目录和Maven依赖)。•掌握JDBC编程的核心六个步骤:加载驱动、建立连接、创建语句、执行SQL、处理结果、关闭资源。•掌握使用Statement对象执行数据库的增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)操作。•掌握使用try-with-resources语句进行异常处理并自动关闭数据库资源,防止资源泄漏。2第6章课程导入◆素养目标•

践行绿色数据库理念,优化资源利用:结合连接池配置,理解数据库连接复用的重要性。•

强化异常处理规范,保障系统健壮性:在JDBC异常捕获实践中,倡导“早崩溃、快恢复”的容错设计理念。•

培养全局视野,理解数据持久化价值:通过DAO模式学习,建立“数据持久化是系统核心”的认知高度。36.1使用JDBC访问MySQL

JDBC提供了一套完整的Java类库,使得Java应用程序能够以一种统一的方式访问各种不同类型的数据库,而无需为每一种数据库编写特定的代码。如图6-1所示,JDBC为数据库厂商和第三方中间件厂商提供了一个标准的API,使得他们能够在Java平台上进行数据库连接和操作。

MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在Web应用方面,MySQL是最好的关系数据库管理系统(RelationalDataBaseManagementSystem,RDBMS)应用软件之一。46.1.1下载与安装MySQL下载MySQL访问MySQL的官方网站,在下载页面选择适合操作系统的版本。在下载选项中,选择“MySQLCommunityDownloads”,这是免费社区开源的版本。本教程以MySQLCommunityServer8.0.40Windows版本为例进行安装说明。不同版本MySQL的安装方法有所区别,请按照实际情况操作。56.1.1下载与安装MySQL◆如图6-2所示,选择适当的版本以后,单击Download按钮,并跳过注册步骤,直接下载安装包。/downloads/windows/installer图6-2MySQL数据库下载页面【注意】在选择下载链接时,一定要选择MSIInstaller版本。66.1.1下载与安装MySQL◆如图6-3所示,如果弹出登录账号的界面,可以直接单击Nothanks,juststartmydownload.”进行免登录下载。图6-3忽略登录直接下载76.1.1下载与安装MySQL安装MySQL◆如图6-4所示,双击下载的安装包,启动安装程序。图6-4MySQL安装包86.1.1下载与安装MySQL◆如图6-5所示,如果出现如下缺少VisualStudio的警告,需要安装VisualStudio依赖。进入下载页面,选择对应版本进行下载。/en-us/cpp/windows/latest-supported-vc-redist◆下载完成后直接单击MSI安装包启动安装即可。图6-5缺少VisualStudio依赖的提示框96.1.1下载与安装MySQL◆在安装向导中,选择Custom安装类型,以便自定义安装的模块。根据需要选择安装路径,并继续下一步。◆如图6-6所示,在SelectProducts中,选择MySQLServer、MySQLWorkbench和MySQLShell三个模块后,进入下一步安装。图6-6MySQL安装模块选择106.1.1下载与安装MySQL◆如图6-7所示,确认安装模块选择正确后,单击Execute执行安装。图6-7MySQL安装进度界面116.1.1下载与安装MySQL耐心等待一段时间,MySQL安装完成。126.1.2配置MySQL完成安装后,进入配置界面,直接点Next进入配置。下面是每个界面的配置说明。136.1.2配置MySQL◆TypeandNetworking如图6-8所示,当前界面用于配置MySQLServer网络参数,设置默认端口(通常是3306),一般不建议修改。其他选项同样保持默认值,不需要改动。图6-8MySQL服务端口与网络配置146.1.2配置MySQL◆AuthenticationMethod如图6-9所示,修改认证方式,一般不需要修改,单击Next进入下一步。如果后面需要使用数据库图形化工具操作数据库,旧版本的工具不支持加强密码验证方式,就会产生数据库连接错误。这时建议选择第二个密码选项或者升级软件图形化工具的版本,以解决连接错误的问题。图6-9配置验证方法156.1.2配置MySQL◆AccountsandRoles如图6-10所示,MySQL用户设置界面,在开发环境中,可以将密码设置为root,以方便后续开发的设置。在生产环境中,需要设置复杂的密码,以防止被破解。图6-10设置账户信息166.1.2配置MySQL◆WindowsService如图6-11所示,MySQL的服务设置,保留默认设置即可。图6-11配置服务信息176.1.2配置MySQL◆ServerFilePermissions如图6-12所示,服务文件权限设置,不需要修改,保留默认设置即可。图6-12Windows服务文件权限设置186.1.2配置MySQL◆ApplyConfiguration如图6-13所示,保存配置界面,直接单击Execute,耐心等待,当所有选项前面打勾,表示安装成功,直接单击Finish。如果出现某个选项打叉的情况,表示该项配置失败,需要根据情况解决问题。在弹出的后续界面中,直接单击Next或者Finish即可。图6-13完成配置196.1.2配置MySQL【注意】首次安装MySQL非常重要,如果没有安装成功,需要处理遗留问题才能重新安装。因此,读者在首次安装时,需要谨慎操作,尽量保证首次就能安装成功。不同版本安装页面有所变化,请读者根据实际页面的指南进行操作。206.1.3配置环境变量如图6-14所示,MySQL安装完成后,需要在系统配置环境变量,指明MySQL的bin目录路径。在系统环境变量中,编辑Path变量,新建变量值为MySQL的安装主目录下的bin子目录,默认路径为C:\ProgramFiles\MySQL\MySQLServer8.0\bin。图6-14配置环境变量216.1.3配置环境变量如果忘记安装路径,可以通过以下方法确定:◆如图6-15所示,在Windows开始搜索框中,输入“mysql”,在查找结果中,找到MySQL8.0CommandLineClient,右击并在弹出菜单中,单击“打开文件位置”。图6-15查找MySQL命令行工具226.1.3配置环境变量◆如图6-16所示,在弹出的窗口中,找到MySQL8.0CommandLineClient并右击,在弹出的菜单中,单击“打开文件所在位置”。图6-16获得MySQL所在目录236.1.3配置环境变量◆如图6-17所示,此时弹出的窗口,在地址栏中显示的路径即为MySQL的bin目录。图6-17获得MySQLbin所在目录246.1.4验证安装MySQLWorkbench连接验证◆如图6-18所示,安装成功后,将自动打开MySQLWorkbench界面,如果没有自动打开,可以在Windows的开始菜单中找到。图6-18连接MySQL服务器256.1.4验证安装◆在Workbench界面中,双击MySQLConnections中的LocalinstanceMySQL80,输入密码后,将自动连接MySQL实例。如果连接成功,说明安装成功。◆使用Workbench等可视化工具查询数据库,如图6-19所示。除了MySQL自带的Workbench,还有NavicatforMySQL、phpMyAdmin和SQLyog等第三方可视化工具,可以查看和修改数据库,操作简单快捷。图6-19可视化工具查询数据界面266.1.4验证安装(代码示例)◆CMD命令验证也可以打开命令提示符(CMD)或PowerShell。输入以下命令。mysql-uroot-p276.1.4验证安装如图6-20所示,按下回车键。在提示输入密码时,输入在安装过程中设置的root密码。如果能够成功登录并看到MySQL的命令行界面,也说明安装和配置成功。图6-20通过命令行连接MySQL286.1.4验证安装【注意】在安装过程中,如果遇到需要安装VisualStudio或其他依赖项的提示,请按照提示进行安装。如果在安装或配置过程中遇到问题,可以查阅MySQL的官方文档或寻求社区支持。296.1.5连接数据库◆导入jar包在项目中加载jar包是引入外部库和功能的关键步骤。可以使用直接下载和Maven两种方法引入,下面以JDBC的Connector包为例,介绍这两种引入方法的操作实例。306.1.5连接数据库直接下载引入方法◆如图6-21所示,访问MySQL的官方网站并进入下载页面,在页面选择读者安装的MySQL版本对应的Connector包,如果没有完全一致的版本可以选择与MySQL主程序版本接近的版本,一般情况下是兼容的。如果在Windows中开发,请选择操作系统为PlatformIndependent。/archives/c-j图6-21JDBC驱动下载页面316.1.5连接数据库◆如图6-22所示,解压下载的Connector压缩包,将mysql-connector-j-XXX.jar文件,复制到Web项目中,WEB-INF的lib目录下(如果项目中没有lib目录,需要自行创建该目录)。然后在lib目录中右击该文件,在弹出的菜单中选择AddasLibrary,单击OK确定,上述操作的目的是将jar包添加至部署目录中。图6-22手动引入jar包方法326.1.5连接数据库使用Maven加载方法使用Maven加载jar包,是Java项目中比较常见且推荐的做法。Maven是一个项目管理和构建自动化工具,它使用pom.xml文件管理项目的依赖、构建、报告和文档等。大多数现代的IDE都支持Maven。可以在IDE中导入Maven项目,IDE会自动读取pom.xml文件并下载所有必要的依赖项。由于该方法对资源的管理比较灵活和方便,因此,在后续的项目讲解中,主要以Maven导入方法为主。下面同样以加载JDBC的Connector包为例,讲解Maven的操作方法。336.1.5连接数据库◆回忆前面所学,如图6-23所示,利用IntelliJIDEA创建Web项目时,在首页中,可以选择项目的构建系统为Maven,创建完成后,在项目主目录下,有一个名称为pom.xml的文件,这说明项目是支持Maven的。图6-23创建Maven项目346.1.5连接数据库(清单6-1pom.xml)...<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version><!--请根据MySQL版本选择适当驱动版本--></dependency>...356.1.5连接数据库◆如图6-24所示,如果读者并不清楚该库的依赖信息,可以访问Maven官网搜索获取对应信息,例如,输入“MySQLJDBC”,出现搜索结果后,单击对应版本,进入界面后将显示具体的依赖信息,将<dependency>的文本复制到pom.xml文件中的<dependencies>标记内即可。图6-24Maven依赖信息搜索页面【注意】请根据您安装的MySQL版本选择对应的驱动版本,有可能不存在与MySQL版本完全一致的驱动,此时选择同个系列即可(例如8.0.x系列的驱动通常兼容MySQL8.0.40)。366.1.5连接数据库◆如图6-25所示,配置完成后,在项目上右击,单击“Maven→Reloadproject”,IntelliJIDEA将自动完成Maven更新。等待更新后,将在ExternalLibraries目录下显示JDBC的jar包。因为需要从远端服务器下载对应文件,所以更新过程中需要联网。图6-25Maven依赖加载后的项目库结构376.1.5连接数据库(代码示例)<%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><%Class.forName("com.mysql.cj.jdbc.Driver");%>386.1.5连接数据库另外,诸如SQLite、Oracle、PostgreSQL和SQLSever等其他数据库的驱动分别为:•org.sqlite.JDBC•oracle.jdbc.OracleDriver•org.postgresql.Driver•com.microsoft.sqlserver.jdbc.SQLServerDriver【注意】在旧版本的MySQLJDBC驱动中,加载类名有所不同,例如MySQL5.x系列及之前的版本为com.mysql.jdbc.Driver,MySQL8.x及更高版本为com.mysql.cj.jdbc.Driver。另外,现代网站开发中已经不推荐在JSP页面中直接连接数据库,这将在后续章节中学习,例如结合Servlet技术连接数据库。在Servlet中连接数据库和JSP的Scriptlet的原理是相同的,因此为引导读者入门,下列将利用JSP简单讲解如何连接数据库。396.1.5连接数据库◆建立连接对象使用DriverManager.getConnection()方法建立与MySQL数据库的连接。需要提供数据库的URL、用户名和密码作为参数。例如:406.1.5连接数据库(代码示例)<%Stringurl="jdbc:mysql://localhost:3306/university";//数据库URL,university为数据库名Stringusername="root";//数据库用户名Stringpassword="root";//数据库密码Connectionconnection=DriverManager.getConnection(url,username,password);%>416.1.5连接数据库◆创建语句对象在JDBC中,定义了Statement、PreparedStatement和CallableStatement等3种语句类型。其中PreparedStatement是Statement的子类,CallableStatement是PreparedStatement的子类。每一种语句对象用来运行特定类型的SQL语句。Statement对象用来运行简单类型的SQL语句,语句中无需指定参数。PreparedStatement对象用来运行包含(或不包含)IN类型参数的预编译SQL语句,使用PreparedStatement预编译语句可以在很大程度上防止SQL注入攻击,提高Web的安全性。CallableStatement对象用来调用数据库存储过程。这里实例采用Statement方法创建语句对象。例如:StringsqlQuery="SELECT*FROMyourtable";Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(sqlQuery);426.1.5连接数据库(代码示例)◆执行SQL查询使用上述Statement对象执行SQL查询语句,并获取结果集。例如:<%Statementstatement=connection.createStatement();Stringquery="SELECT*FROMyour_table";//替换为实际的SQL查询语句ResultSetresultSet=statement.execute(query);//处理结果集while(resultSet.next()){Stringdata=resultSet.getString("your_column");//替换为实际的列名out.println(data+"<br>");}%>436.1.5连接数据库(代码示例)◆关闭数据库连接和资源释放在处理完查询结果后,关闭ResultSet结果集、Statement对象和Connection连接,以释放资源。例如:<%resultSet.close();statement.close();connection.close();%>446.1.5连接数据库◆完整代码清单6-2所示的代码是使用JSP直接连接MySQL数据库并查询系统用户表的完整实例页面,通过JDBC驱动加载数据库连接后执行SELECT查询,将user表中的所有用户数据逐行提取并显示在网页上,最后关闭数据库连接释放资源。456.1.5连接数据库(清单6-2mysql_jdbc.jsp)1/2<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MySQL</title></head><body><%--设置驱动--%><%Class.forName("com.mysql.cj.jdbc.Driver");%><%--连接数据库--%><%Stringurl="jdbc:mysql://:3306/mysql";//数据库URL,mysql为MySQL的默认表Stringusername="root";//数据库用户名Stringpassword="root";//数据库密码Connectionconnection=DriverManager.getConnection(url,username,password);%><%--查询数据库--%>466.1.5连接数据库(清单6-2mysql_jdbc.jsp)2/2<%Statementstatement=connection.createStatement();Stringquery="SELECT*FROMuser";//SQL查询语句ResultSetresultSet=statement.executeQuery(query);//处理结果集while(resultSet.next()){Stringdata=resultSet.getString("user");//列名out.println(data+"<br>");}%><%--关闭数据库连接和资源释放--%><%resultSet.close();statement.close();connection.close();%></body></html>476.1.5连接数据库上述代码实现从数据库中获取所有数据库名称,如果运行结果如图6-26所示,则说明连接数据库成功。http://localhost:8080/ch06/mysql_jdbc.jsp图6-26查询数据库结果486.2案例学习:JDBC操作在上一节的实例中,已经通过JDBC成功地将JSP与数据库连接。本节通过一个完整的实例讲解了在网站开发中,对数据库进行“增、删、查、改”的基础操作。496.2.1创建数据库清单6-3所示的代码用于创建MySQL数据库,通过加载JDBC驱动建立与本地MySQL服务器的连接,然后执行CREATEDATABASE语句创建名为“university”的数据库,最后关闭数据库连接并在页面上显示创建成功的提示信息。506.2.1创建数据库(清单6-3create_database.jsp)<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MySQL</title></head><body><%Class.forName("com.mysql.cj.jdbc.Driver");//连接数据库Stringurl="jdbc:mysql://:3306/";//数据库URL,未创建数据库前,库名为空Stringusername="root";//数据库用户名Stringpassword="root";//数据库密码Connectionconnection=DriverManager.getConnection(url,username,password);Statementstatement=connection.createStatement();Stringquery="CREATEDATABASEuniversityCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;";//执行SQL语句,注意与查询SQL的区别statement.execute(query);//关闭数据库连接和资源释放statement.close();connection.close();out.println("创建数据库成功,请打开Workbench。");%></body></html>516.2.1创建数据库其中,CHARACTERSETutf8mb4:utf8mb4是UTF-8的超集,能够完整地表示Unicode字符,包括特殊字符和表情符号。如果只需要标准的UTF-8,可以改为utf8,但建议使用utf8mb4以确保最大的兼容性。COLLATEutf8mb4_unicode_ci是一种排序规则,unicode_ci表示不区分大小写。在浏览器中,访问下面的地址,将会创建一个名称为university的数据库。http://localhost:8080/ch06/create_database.jsp【注意】访问create_database.jsp页面之前,请确保数据库不存在university数据库,否则将出现“Can'tcreatedatabase'university';databaseexists”的错误信息。526.2.1创建数据库上述create_database.jsp实例代码虽然实现简单,但是存在一个问题:如果statement.execute()抛出异常,connection.close()和statement.close()将不会被调用,导致严重的数据库连接泄漏。因此,可以对代码进行优化,使用Java的try-with-resources语句自动关闭资源,这是现代Java的最佳实践,并且更简洁,清单6-4所示的代码是优化后的代码实例。在后续实例中,本书将采用优化后的方法演示。536.2.1创建数据库(清单6-4create_database_optimize.jsp)1/2<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MySQL</title></head><body><%//加载数据库驱动try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){out.println("数据库驱动加载失败:"+e.getMessage());return;//停止执行}//连接数据库//数据库URL,未创建数据库前,库名为默认mysql,也可以为空Stringurl="jdbc:mysql://:3306/mysql";Stringusername="root";//数据库用户名546.2.1创建数据库(清单6-4create_database_optimize.jsp)2/2Stringpassword="root";//数据库密码//使用try-with-resources自动关闭资源Stringsql="CREATEDATABASEuniversityCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;";try(Connectionconnection=DriverManager.getConnection(url,username,password);Statementstatement=connection.createStatement()){statement.execute(sql);out.println("创建数据库成功,请打开Workbench。");}catch(SQLExceptione){//统一处理SQL异常out.println("数据库操作异常:"+e.getMessage());e.printStackTrace(response.getWriter());}//connection和statement会在这里被自动关闭%></body></html>556.2.1创建数据库上述优化的代码利用了try-with-resources语句。Connection和Statement实例在try()括号内被声明和初始化。这样做的好处是,无论try块中的代码是正常执行完毕,还是因为SQLException(例如数据库已存在)而提前终止,Java都会确保statement和connection对象的close()方法被自动调用。这极大地简化了资源释放的代码,并从根本上防止了因忘记关闭连接而导致的资源泄漏问题。566.2.2创建数据表(清单6-5create_table.jsp)1/2<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%--导入JavaSQL包和MySQL驱动类--%><%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MySQL数据库操作</title></head><body><%Stringurl="jdbc:mysql://:3306/university";Stringusername="root";Stringpassword="root";Stringsql="""CREATETABLEstudents(student_idVARCHAR(100)NOTNULLPRIMARYKEY,nameVARCHAR(100)NOTNULL,genderVARCHAR(10));""";576.2.2创建数据表(清单6-5create_table.jsp)2/2try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){out.println("数据库驱动加载失败:"+e.getMessage());return;//停止执行}try(Connectionconnection=DriverManager.getConnection(url,username,password);Statementstatement=connection.createStatement()){statement.execute(sql);out.println("创建数据表成功,请打开Workbench验证。");}catch(SQLExceptione){out.println("数据库操作异常:"+e.getMessage());e.printStackTrace(response.getWriter());}%></body></html>【注意】上述代码SQL语句使用了三个双引号(""")来定义,这种使用方式称为文本块(TextBlocks)功能,它在JDK15中引入,也称为多行字符串字面量(Multi-lineStrings)。这个功能旨在简化在Java代码中嵌入多行字符串的情况,特别是在编写SQL语句、JSON、XML或其他需要多行文本的场景时。586.2.2创建数据表◆在浏览器中,访问下面的地址,将会在university数据库中创建一个名称为students的数据表。http://localhost:8080/ch06/create_table.jsp【注意】访问create_table.jsp页面之前,请确保数据库university不存在'students'数据表,否则将出现“Table'students'alreadyexists”的错误信息。596.2.2创建数据表◆然后可以通过MySQLWorkbench的导航窗口查看如图6-27所示的数据表结构,注意单击窗口下面的Schemas选项卡。图6-27数据表结构606.2.3增加数据(清单6-6insert.jsp)1/2<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MySQL</title></head><body><%Stringurl="jdbc:mysql://:3306/university";Stringusername="root";Stringpassword="root";Stringsql="INSERTINTOstudents(student_id,name,gender)values('00002','张一云','男')";try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){out.println("数据库驱动加载失败:"+e.getMessage());return;//停止执行}try(Connectionconnection=DriverManager.getConnection(url,username,password);616.2.3增加数据(清单6-6insert.jsp)2/2Statementstatement=connection.createStatement()){statement.execute(sql);out.println("插入数据成功,请打开Workbench。");}catch(SQLExceptione){out.println("数据库操作异常:"+e.getMessage());e.printStackTrace(response.getWriter());}%></body></html>626.2.3增加数据◆在浏览器中,访问下面的地址,将会在students数据表中添加一行记录。http://localhost:8080/ch06/insert.jsp◆以相同的方法,添加数行数据,用于后续实例测试。打开MySQLWorkbench,右击导航窗口中数据表名,单击或者手动输入Select语句,可以看到数据表中的数据,如图6-28所示。图6-28查询数据结果636.2.3增加数据(代码示例)插入上述数据的SQL如下所示:INSERTINTOstudents(student_id,name,gender)VALUES('00001','张小明','男');INSERTINTOstudents(student_id,name,gender)VALUES('00002','张一云','男');INSERTINTOstudents(student_id,name,gender)VALUES('00003','李华','女');INSERTINTOstudents(student_id,name,gender)VALUES('00004','王小丽','女');INSERTINTOstudents(student_id,name,gender)VALUES('00005','张小六','男');INSERTINTOstudents(student_id,name,gender)VALUES('00006','孙晓晓','女');646.2.4删除数据(清单6-7delete.jsp)1/2使用清单6-7所示的代码删除学号为“00003”的学生记录。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MySQL</title></head><body><%//数据库连接配置Stringurl="jdbc:mysql://:3306/university";Stringusername="root";Stringpassword="root";//静态SQL语句(无用户输入,故无SQL注入风险)Stringsql="DELETEFROMstudentsWHEREstudent_id='00006'";try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){out.println("数据库驱动加载失败:"+e.getMessage());return;//停止执行656.2.4删除数据(清单6-7delete.jsp)2/2}try(Connectionconnection=DriverManager.getConnection(url,username,password);Statementstatement=connection.createStatement()){statement.execute(sql);out.println("删除数据成功,请打开Workbench。");}catch(SQLExceptione){out.println("数据库操作异常:"+e.getMessage());e.printStackTrace(response.getWriter());}%></body></html>666.2.4删除数据在浏览器中,访问下面的地址,将会在students数据表中删除指定条件的记录。http://localhost:8080/ch06/delete.jsp数据库的数据修改结果如图6-29所示。图6-29删除指定数据记录结果676.2.5查询数据清单6-8所示的代码的作用是从MySQL数据库的students表中查询学生信息并展示在网页上,通过JDBC连接university数据库,使用try-with-resources语句自动管理数据库连接资源,安全地执行SELECT查询并将学号、姓名和性别字段以逗号分隔的形式逐行输出,同时包含完善的异常处理机制来捕获和显示数据库驱动加载失败及SQL操作异常的错误信息。686.2.5查询数据(清单6-8select.jsp)1/2<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MySQL</title></head><body><%Stringurl="jdbc:mysql://:3306/university";Stringusername="root";Stringpassword="root";Stringsql="SELECT*FROMstudents";try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){out.println("数据库驱动加载失败:"+e.getMessage());return;//停止执行}try(Connectionconnection=DriverManager.getConnection(url,username,password);696.2.5查询数据(清单6-8select.jsp)2/2Statementstatement=connection.createStatement();ResultSetresultSet=statement.executeQuery(sql)){while(resultSet.next()){Stringid=resultSet.getString("student_id");Stringname=resultSet.getString("name");Stringgender=resultSet.getString("gender");out.println(id+","+name+","+gender+"<br>");}}catch(SQLExceptione){out.println("数据库操作异常:"+e.getMessage());e.printStackTrace(response.getWriter());}%></body></html>706.2.5查询数据上述代码运行结果如图6-30所示。http://localhost:8080/ch06/select.jsp图6-30查询数据结果716.2.5查询数据(清单6-9select_where.jsp)1/2除了上述实例所演示的用法,还可以结合SQL语句,进行WHERE子句等方法查询,例如,如果需要查询性别为“女”的所有学生记录,可以改为如清单6-9所示的代码。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MySQL</title></head><body><%Stringurl="jdbc:mysql://:3306/university";Stringusername="root";Stringpassword="root";Stringsql="SELECT*FROMstudentswheregender='女'";try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){out.println("数据库驱动加载失败:"+e.getMessage());return;//停止执行}try(Connectionconnection=DriverManager.getConnection(url,username,password);726.2.5查询数据(清单6-9select_where.jsp)2/2Statementstatement=connection.createStatement();ResultSetresultSet=statement.executeQuery(sql)){while(resultSet.next()){Stringid=resultSet.getString("student_id");Stringname=resultSet.getString("name");Stringgender=resultSet.getString("gender");out.println(id+","+name+","+gender+"<br>");}}catch(SQLExceptione){out.println("数据库操作异常:"+e.getMessage());e.printStackTrace(response.getWriter());}%></body></html>736.2.5查询数据上述代码运行结果如图6-31所示。http://localhost:8080/ch06/select_where.jsp图6-31限定条件查询数据结果746.2.6修改数据(清单6-10update.jsp)1/2清单6-10所示的代码实现将学号为“00004”的学生,名字改为刘小丽。<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@pageimport="java.sql.*"%><%@pageimport="com.mysql.cj.jdbc.Driver"%><!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>MySQL</title></head><body><%Stringurl="jdbc:mysql://:3306/university";Stringusername="root";//数据库用户名Stringpassword="root";//数据库密码Stringsql="UPDATEstudentsSETname='刘小丽'WHEREstudent_id='00004'";try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){out.println("数据库驱动加载失败:"+e.getMessage());return;//停止执行}try(Connectionconnection=DriverManager.getConnection(url,username,password);756.2.6修改数据(清单6-10update.jsp)2/2Statementstatement=connection.createStatement()){statement.execute(sql);out.println("更新数据成功,请打开Workbench。");}catch(SQLExceptione){out.println("数据库操作异常:"+e.getMessage());e.printStackTrace(response.getWriter());}%></body></html>766.2.6修改数据在浏览器中,访问下面的地址,将会在“students”数据表中更新指定条件的记录。http://localhost:8080/ch06/update.jsp上述代码运行后,数据库表数据修改后的结果如图6-32所示。图6-32更新数据结果776.3技术要点◆异常处理在实际开发中,JSP应用与MySQL数据库交互时,异常处理是非常重要的,因为数据库操作可能会因为各种原因失败,例如连接失败、SQL语法错误、违反数据约束等。良好的异常处理不仅能提高程序的健壮性,还能提供有用的错误信息帮助开发人员调试和维护。在JSP页面中,尽量将数据库操作代码放在try-catch块中,以便捕获和处理异常。为了让程序抛出异常,下面实例将查询语句中的表名students改为studentsx,模拟抛出“表不存在”异常的效果。此时,通过控制台显示的调试信息,可以排查程序异常原因。清单6-11所示的代码是一个使用try-catch异常

温馨提示

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

最新文档

评论

0/150

提交评论