JSP:JDBC

news2024/12/23 17:33:54

JDBCJava Data Base Connectivity的缩写)是Java程序操作数据库的API,也是Java程序与数据库相交互的一门技术。

JDBCJava操作数据库的规范,由一组用Java语言编写的接口组成,它对数据库的操作提供基本方法,但对于数据库的细节操作由数据库厂商进行实现,使用JDBC操作数据库,需要数据库厂商提供数据库的驱动程序。

关于Java程序与数据库相交互的示意图如下图所示。

JDBC(Java Database Connectivity) Java数据库连接,是一组用来按照统一方式访问数据库的API。它向程序员提供了独立于数据库的统一接口,可以使开发人员不必考虑所用的特定数据库便可编写应用程序,实现了Java与数据库的互连。

由一组用Java语言编写的类和接口组成它能够:与数据库建立连接、发送SQL语句、处理结果JDBC的主要接口

java.sql.Driver:任何驱动程序类都应该实现这个接口。读取数据库驱动器的信息、提供connect方法用于建立访问数据库所用的Connection对象

java.sql.DriverManager:用于管理JDBC驱动程序一个接口(使用此接口能够获得与相应数据库的连接)

java.sql.Connection:表示驱动程序与数据库之间的连接。(使用此连接可以创建一个Statement对象)

java.sql.Statement:能对数据库执行SQL语句,并得到返回的结果

java.sql.ResultSet:表示从数据库服务器返回的结果集。

ResultSet 有如下几个方法

1. boolean  next()

用于将 ResultSet定位到下一行

ResultSet最初是定位在第0行上的,此时应该先调用  next()方法将其定位到第1行上,然后才可输出。当 ResultSet已经到了最后一行时,再调用next()方法,则返回 false。

2. getXXX()

ResultSet已经定位在某一行上时,使用 getXxx ()方法得到这一行上单个字段的值。针对不同的字段类型,调用不同的getXxx ()方法(getString(col), getDate(col), getInt(col),…)

例:如果表中的第一个字段,字段名为“name”是文本型的; 则可以使用getString

(1)getString(“name”)来得到它的值。

如果表中的第三个字段,字段名为“score”是数值型的; 则可以使用getFloat(3) getFloat(“score”)来得到它的值。显示结果集中所有记录的前两列:

while(rs.next())

{

name =rs.getString(1);

phone =rs.getString(2);

System.out.println(name+","+phone);

}

JDBC连接数据库的过程

在了解了JDBC与数据库后,下面向大家介绍使用JDBC操作数据的开发流程,其关键步骤如下:(1)注册数据库驱动 :加载数据库驱动,注册到驱动管理器Class.forName(“com.mysql.jdbc.Driver”);

(2构建数据库连接URL     “JDBC协议+IP地址或域名+端口+数据库名称

MySQL连接URL的字符串为:“jdbc:mysql://localhost:3306/test”

3获取Connection对象

注册了数据库驱动及构建数据库URL后,通过驱动管理器获取数据库的连接ConnectionConnection对象是JDBC封装的数据库连接对象,创建此对象后,才可以对数据库进行相关操作:DriverManager.getConnection(url, username, password);

使用JDBC驱动程序访问数据库

获取相应数据库的jdbc驱动程序,并将它们保存在指定的位置, 然后重新启动tomcat服务

连接的具体步骤:以打电话通知同学为你带书为例…编写程序的具体步骤编写程序

加载驱动程序;---打开手机、找到电话簿:亲人、同学、朋友

定义所要连接数据库的地址;---定位到同学

建立与数据库的连接;--拨号给他打电话

建立语句对象;--接通后,你(对象)可以跟他(数据库)交流了

声明并执行SQL语句--任务:帮你带书

处理返回的结果--给带或是不能带

关闭对象--挂电话

首先应该导入java.sql。语句为: <%@ page import="java.sql.*" %>

利用Class.forName()方法加载某一个数据库的驱动程序。

语法:Class.forName(“JDBC驱动程序类);

方法:例1:使用JDBC/ODBC桥驱动程序:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

例2:使用SQLServer的驱动程序:Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);

经过以上其中之一语句的声明后,驱动程序就会自动地加载。

注意:如果classpath路径中没有找到所需的驱动程序则会抛出 ClassNotFoundException异常。

通过此步骤,定义要连接的数据库资源

String ODBCURL" jdbc:odbc:dbName";

String sqlserverURL" jdbc:microsoft:sqlserver://host:1433;DatabaseName=dbName ";

String mysqlURL= "jdbc:mysql://host:port/dbName ";

String oracleURL= "jdbc:oracle:thin:@host:port:dbName ";

不同数据库连接的地址不同,这点需要特别注意

URL3部分组成,各个部分用冒号间隔,格式如下jdbc:<子协议>:<子名称>      

JDBC URL的3部分可分解如下:jdbc:JDBC中的协议就是jdbc

<子协议>数据库驱动程序名或数据库连接机制的名称。子协议的典型示例为oracle它用于连接oracle数据库

<子名称>一种标记数据库的方法。子名称根据子协议的不同而不同,使用子名称的目的是为定位数据库

例如 jdbc:oracle:thin:@[ip]:[port]:[sid]

子协议现在是 oracle子名称现在由四部分构成:包括驱动程序类型thin数据库服务器的IP地址提供服务的端口号、数据库的名字

语法:Connection con=DriverManager.getConnection(url,”登录数据库用户名,”登录密码);

例:以SQLServer连接数据库book为例用户名为sa,密码为123

Class.forName(" com.microsoft.jdbc.sqlserver.SQLServerDriver ");

String connStr=" jdbc:microsoft:sqlserver://host:1433;DatabaseName=book";

Connection conn = DriverManager.getConnection(connStr, " sa", " 123");

利用 Connection接口à createStatement() 方法创建语句对象

例:Statement stmt=conn.createStatement();

语句对象用于执行SQL语句。该对象负责将SQL语句传递给数据库管理系统执行;声明SQL语句,并将该语句通过Statement对象提交给服务器进行执行

String sql= " SELECT * FROM book ";//上面的语句用于从book表中查询所有记录

ResultSet resultSet=stmt.executeQuery(sql);//该语句将sql命令提交给数据库服务器进行执行,并将执行结果存储在ResultSet对象中进行执行。

Statement接口主要有如下三个方法:

 1. ResultSet  executeQuery(String sql)以sql语句为参数执行sql查询语句

      返回ResultSet结果集(一个二维表)

例如:

Statement stmt=con.createStatement();

Stringsql= " SELECT * FROM book ";

ResultSet rs=stmt.executeQuery(sql);

2. int  executeUpdate(String sql)

以sql语句为参数,执行sql更新语句及DDL语句,如添加、删除或修改操作,返回被受影响记录的条数。例如:

Statement stmt=con.createStatement();

String sql= " delete FROM book where bookid= " + " ‘12335’ ";

int i=stmt.executeUpdate(sql);

System.out.println(i);

3. boolean execute(String sql)

用于执行实现不知道类型的SQL语句,既可以执行查询语句,也可以执行更新语句

常用于动态的处理未知的SQL语句,事先无法知道该SQL语句的具体类型及执行的返回值

执行参数部分的SQL语句

当SQL语句的执行结果是一个ResultSet结果集时,本方法返回true并可以通过StatementàgetResultSet()方法得到返回的结果集

SQL语句执行后没有返回的结果集时,该方法返回false

Statement对象负责将SQL语句传递给数据库管理系统执行,返回的是一个ResultSet的对象 ResultSet对象,称为结果集是符合条件的所有行的集合

可以通过(first(), last(), previous(), next(), absolute(int), …) 方法浏览可滚动结果集中的内容rs.close();//关闭结果集

stmt.close();//关闭语句对象

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

将打开的资源关闭。注意:资源关闭的顺序和打开的顺序恰恰相反。

异常处理   数据库访问中可能会发生异常(如无法连接),需要做异常处理

编写Servlet时,需要将访问数据库代码放在try-catch结构中

try { …}catch(SQLExceptionex){ …}

在编写JSP页面时,数据库操作可以不写try-catch, 服务器将JSP编译成Servlet时会自动加上try-catch

7.2 通过JDBC连接MySQL数据库

(1)创建名称为10.1的动态Web项目,将MySQL数据库的驱动包添加至项目的构建路径,构建开发环境

(2) 创建程序中的主页index.jsp,在该页面中加载数据库驱动并创建数据库连接

应用程序为了能和数据库交互信息,必须首先和数据库建立连接。目前在开发中常用的连接数据库的方式是加载JDBC-数据库驱动程序。

Java语言编写的数据库驱动程序称作JDBC-数据库驱动程序。JDBC可以调用本地的JDBC-数据库驱动程序和相应的数据库建立连接,如图所示。

使用JDBC-数据库驱动程序方式和数据库建立连接需要经过2个步骤

加载JDBC-数据库驱动程序

② 和指定的数据库建立连接。

使用JDBC-数据库驱动程序访问数据库时,必须要保证连接数据库的应用程序所驻留的计算机上安装有相应JDBC-数据库驱动程序,比如,Tomcat服务器上的某个Web应用程序想访问MySQL数据库管理系统所管理的数据库,那么Tomcat服务器所驻留的计算机上必须要安装MySQL提供的JDBC-数据库驱动程序。

登录MySQL的官方网站www.mysql.com下载JDBC-数据库驱动程序(JDBC Driver for MySQL)。本教材下载的是mysql-connector-java-5.1.28.zip

解压后的mysql-connector-java-5.1.28-bin.jar复制到Tomcat服务器所使用的JDK的扩展目录中。应用程序加载MySQLJDBC-数据库驱动程序代码如下:

 try{

Class.forName("com.mysql.jdbc.Driver");

 }  catch(Exception e){

 }

Java.sql包中的DriverManager类有两个用于建立连接的类方法:

Connection getConnection(java.lang.String, java.lang.String, java.lang.String)

Connection getConnection(java.lang.String)

数据库服务器占用的端口是3306,假设MySQL数据库服务器所驻留的计算机的IP地址是192.168.100.1。应用程序要和warehouse建立连接,用户的id和密码分别是root99

 那么使用Connection getConnection(java.lang.String, java.lang.String, java.lang.String)

方法建立连接的代码如下:

try{  String uri = "jdbc:mysql:// 192.168.100.1:3306/warehouse"

String user ="root";

String password ="99";

con = DriverManager.getConnection(uri,user,password);

 }catch(SQLException e){

System.out.println(e);

}

使用Connection getConnection(java.lang.String) 方法建立连接的代码如下:

try{  String uri =" jdbc:mysql:// 192.168.100.1:3306/warehouse?user=root&password=99";

con = DriverManager.getConnection(uri);

}catch(SQLException e){

System.out.println(e);

}

在某些Web程序中需要避免操作数据库出现中文乱码,那么需要使用

Connection getConnection(java.lang.String) 方法建立连接,连接中的代码是(假设用户是root,其密码是99):

String uri = "jdbc:mysql://127.0.0.1/warehouse?"+"user=root&password=&characterEncoding=gb2312";

con = DriverManager.getConnection(uri);

应用程序一旦和某个数据库建立连接,就可以通过SQL语句和该数据库中的表交互信息,比如查询、修改、更新表中的记录


JDBCJava Web中的应用

1、开发模式

​​​​​​​在Java Web开发使用JDBC,应遵循MVC的设计思想,从而使用Web程序拥有一定的健壮性、可扩展性。JDBC应用于Java Web开发中,处于MVC之中的模型层位置,如下图所示。

2、分页查询

分页查询是Java Web开发之中十分常用的技术。在数据库量非常大的情况下,不适合将所有数据显示到一个页面之中,既给查看带来有便,又占用了程序及数据库的资源,此时就需要对数据进行分页查询。

通过JDBC实现分页查询的方法有很多种,而且不同的数据库机制也提供了不同的分页方式,两种非常典型的分页方法。

1、通过ResultSet的光标实现分页

2、通过数据库机制进行分页

连接MySQL数据库和连接Oracle数据库的方法非常类似。只是有两个地方需要注意一下

1. 需要把MySQL的驱动程序mysql-connector-java-5.0.4-bin.jar部署到“/WEB-INF/lib/”下。(MySQL驱动程序可以从其官方网站www.mysql.com上下载)

2). 注册驱动程序和获取连接的语句变为:

Class.forName("com.mysql.jdbc.Driver");或者Class.forName("org.gjt.mm.mysql.Driver");

Connection con = DriverManager.getConnection("jdbc:mysql://[ip]:[port]/[sid]","Login","password");

例:

<%@page contentType="text/html; charset=GBK" %>

<%@page import="java.sql.*" %>

<%

Class.forName("com.mysql.jdbc.Driver");

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/book","root",“123");

Statement stmt = con.createStatement();

stmt.executeUpdate("create table table1(id int, name varchar(30))");

stmt.executeUpdate("insert into table1 values(10, 'java')");

stmt.executeUpdate("insert into table1 values(20, 'JSP')");

out.print("table1 has been created!");

stmt.close(); con.close();

%>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1249625.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-11-24--oracle--实验--[Merge 语句]

oracle--实验---Merge语句 1.认知Merge 语句 • merge 语句是 sql 语句的一种。在 SQL server 、 Oracle 数据库中可用&#xff0c; MySQL 中不可用。 • merge 用来合并 update 和 insert 语句。目的&#xff1a;通过 merge 语句&#xff0c;根据一张表&#xff08; 原数据表…

superset 后端增加注册接口

好烦啊-- &#xff1a;< 1.先定义modes: superset\superset\models\user.py # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information…

JSP EL表达式之 empty

好 本文我们还是继续说EL表达式 我们来讲一个非空判断的好手 empty 我们直接编写代码如下 <% page contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %> <%request.setCharacterEncoding("UTF-8");%> <!DOCTYPE html&…

探索亚马逊云科技云存储服务的性能

文章作者&#xff1a;Libai 引言 随着企业越来越多地依赖云存储解决方案&#xff0c;确保存储性能的最佳状态变得至关重要。在本文中&#xff0c;我们将探讨在亚马逊云科技云存储服务上进行存储性能基准测试的重要性&#xff0c;以及如何帮助企业做出资源分配和优化的明智决策…

小程序中的大道理之二--抽象与封装

继续扒 接着 上一篇 的叙述, 健壮性也有了, 现在是时候处理点实际的东西了, 但我们依然不会一步到底, 让我们来看看. 一而再地抽象(Abstraction Again) 让我们继续无视那些空格以及星号等细节, 我们看到什么呢? 我们只看到一整行的内容, 当传入 3 时就有 3 行, 传入 4 时就…

postgresql从入门到精通 - 第35讲:中间件PgBouncer部署|PostgreSQL教程

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第35讲&#…

Linux加强篇002-部署Linux系统

目录 前言 1. shell语言 2. 执行命令的必备知识 3. 常用系统工作命令 4. 系统状态检测命令 5. 查找定位文件命令 6. 文本文件编辑命令 7. 文件目录管理命令 前言 悟已往之不谏&#xff0c;知来者之可追。实迷途其未远&#xff0c;觉今是而昨非。舟遥遥以轻飏&#xff…

SpringBoot : ch05 整合Mybatis

前言 随着Java Web应用程序的快速发展&#xff0c;开发人员需要越来越多地关注如何高效地构建可靠的应用程序。Spring Boot作为一种快速开发框架&#xff0c;旨在简化基于Spring的应用程序的初始搭建和开发过程。而MyBatis作为一种优秀的持久层框架&#xff0c;提供了对数据库…

【微服务专题】SpringBoot自动配置源码解析

目录 前言阅读对象阅读导航前置知识笔记正文0、什么是自动配置0.1 基本概念0.2 SpringBoot中的【约定大于配置】0.3 从SpringMVC看【约定大于配置】0.4 从Redis看【约定大于配置】 一、EnableAutoConfiguration源码解析二、SpringBoot常用条件注解源码解析2.1 自定义条件注解2.…

web前端开发基础----标准流布局和非标准流布局

1&#xff0c;标准流布局 标准流&#xff0c;也称文档流或普通流&#xff0c;是所有元素默认的布局方式。 在标准流中&#xff0c;元素按照其在 HTML 中出现的顺序&#xff0c;自上而下依次排列&#xff0c;并占据其父容器内的可用空间。 标准流中的元素按照其自然尺寸和位置进…

Oracle研学-介绍及安装

一 ORACLE数据库特点: 支持多用户&#xff0c;大事务量的事务处理数据安全性和完整性控制支持分布式数据处理可移植性(跨平台&#xff0c;linux转Windows) 二 ORACLE体系结构 数据库&#xff1a;oracle是一个全局数据库&#xff0c;一个数据库可以有多个实例&#xff0c;每个…

【Rust日报】2023-11-22 Floneum -- 基于 Rust 的一款用于 AI 工作流程的图形编辑器

Floneum -- 基于 Rust 的一款用于 AI 工作流程的图形编辑器 Floneum 是一款用于 AI 工作流程的图形编辑器&#xff0c;专注于社区制作的插件、本地 AI 和安全性。 Floneum 有哪些特性&#xff1a; 可视化界面&#xff1a;您无需任何编程知识即可使用Floneum。可视化图形编辑器可…

【数据库篇】关系模式的表示——(1)问题的提出

1、关系模式的表示 R&#xff1a;表示关系的名字比如&#xff1a;sc选课表&#xff0c;student学生表。 U&#xff1a;表示一个关系模式的所有属性&#xff0c;比如student表&#xff1a;U&#xff08;sno&#xff0c;sname&#xff0c;sage&#xff0c;ssex&#xff09;。 …

代码随想录算法训练营第五十四天|392.判断子序列 115.不同的子序列

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 392.判断子序列 class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp [[0] * (len(t)1) for _ in range(len(s)1)]for i in ra…

mysql 变量和配置详解

MySQL 中还有一些特殊的全局变量&#xff0c;如 log_bin、tmpdir、version、datadir&#xff0c;在 MySQL 服务实例运行期间它们的值不能动态修改&#xff0c;也就是不能使用 SET 命令进行重新设置&#xff0c;这种变量称为静态变量。数据库管理员可以使用前面提到的修改源代码…

吴恩达《机器学习》10-1-10-3:决定下一步做什么、评估一个假设、模型选择和交叉验证集

一、决定下一步做什么 在机器学习的学习过程中&#xff0c;我们已经接触了许多不同的学习算法&#xff0c;逐渐深入了解了先进的机器学习技术。然而&#xff0c;即使在了解了这些算法的情况下&#xff0c;仍然存在一些差距&#xff0c;有些人能够高效而有力地运用这些算法&…

为什么要隐藏id地址?使用IP代理技术可以实现吗?

随着网络技术的不断发展&#xff0c;越来越多的人开始意识到保护个人隐私的重要性。其中&#xff0c;隐藏自己的IP地址已经成为了一种常见的保护措施。那么&#xff0c;为什么要隐藏IP地址&#xff1f;使用IP代理技术可以实现吗&#xff1f;下面就一起来探讨这些问题。 首先&am…

【Qt之QTextDocument】使用及表格显示富文本解决方案

【Qt之QTextDocument】使用 描述常用方法及示例使用QTextList使用QTextBlock使用QTextTable表格显示富文本结论 描述 QTextDocument类保存格式化的文本。 QTextDocument是结构化富文本文档的容器&#xff0c;支持样式文本和各种文档元素&#xff0c;如列表、表格、框架和图像。…

oled的使用 动态的变量 51

源码均在IIC手写程序中 外部中断实现变量加一 #include "reg52.h" #include "main.h" #include <intrins.h> #include "OLED.h" #include "bmp.h" #include "Delay.h" sbit LED1 P1^0; sbit LED2 P1^1; sbit LED3…

项目实战详细讲解带有条件响应的 SQL 盲注、MFA绕过技术、MFA绕过技术、2FA绕过和技巧、CSRF绕过、如何寻找NFT市场中的XSS漏洞

项目实战详细讲解带有条件响应的 SQL 盲注、MFA绕过技术、MFA绕过技术、2FA绕过和技巧、CSRF绕过、如何寻找NFT市场中的XSS漏洞。 带有条件响应的 SQL 盲注 这篇文章的核心要点如下: 漏洞发现:作者在Portswigger提供的实验室中发现了一个盲SQL注入漏洞。这个漏洞存在于一个应…