JSP操作数据库核心技术

JSP操作数据库核心技术

1.JDBC技术简介
JDBC是一套面向对象的应用程序接口,它制定了统一的访问
各类关系数据库的标准接口,为各个数据库厂商提供了标准接口
的实现。通过使用JDBC技术,开发人员可以用纯Java语言和标准
的SQL语句编写完整的数据库应用程序,并且真正的实现了软件
的跨平台型。
JDBC技术简介 (1)
JDBC的全称为“Java DataBase Connectivity”,它是一组使用Java语言编写的用于连接数据库的程序接口(API)。
1.JDBC执行步骤
JDBC主要完成以下4个步骤:
(1)与数据库建立连接。
(2)向数据库发送SQL语句。
(3)处理发送的SQL语句。
(4)将处理的结果进行返回。
使用JDBC操作数据库如图所示。

在这里插入图片描述

JDBC技术简介 (2)
2.JDBC的优缺点
JDBC优点:

  1. JDBC与ODBC十分相似,便于软件开发人员的理解。
  2. JDBC使软件开发人员从复杂的驱动程序编写工作解脱出来,可以 完全专著与业务逻辑的开发。
  3. JDBC支持多种关系型数据库,这样可以增加软件的可移植性。
  4. JDBC编写接口是面向对象的,开发人员可以将常用的方法进行二 次封装,从而提高代码的重用性。

JDBC缺点:

  1. 通过JDBC访问数据库时,实际的操作速度会降低。
  2. 虽然JDBC编程接口是面向对象的,但通过JDBC访问数据库依然 是面向关系的。
  3. JDBC提供了对不同厂家的产品支持,这样对数据源的操作有所影 响。

2.JDBC的结构
目前比较常见的JDBC驱动程序可以分为4种,如表所示。

在这里插入图片描述

数据库驱动程序
使用JDBC操作数据库首先必须要安装驱动程序,大多数数据库都有JDBC驱动程序,常见的驱动程序如表所示。

在这里插入图片描述

3.JDBC核心编程接口
(1)驱动器接口:Driver
任何一种数据库驱动程序都提供一个java.sql.Driver接口的驱动类,在加载某个数据库驱动程序的驱动类时,都创建自己的实例对象并向java.sql.DriverManage类注册该实例对象。数据库驱动加载在DriverManage类的执行过程如图所示。
在这里插入图片描述
(2)驱动管理类:DriverManager (1)
负责管理JDBC驱动程序的基本服务,作用于用户和驱动程序之间,负责追踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。另外,DriverManager类也处理驱动程序登录时间限制及登录和跟踪消息的显示等事务。
追踪有用的驱动程序 :
DriverManager类中一系列驱动类通过调用DriverManager类中的registerDriver()方法进行了注册。程序员将不用直接调用DriverManager类中的registerDriver()方法;而是在加载驱动程序时,由驱动程序自动调用并加载驱动类,然后自动在DriverManager类中注册。DriverManager注册的方式有以下两种:
(3)驱动管理类:DriverManager (2)
(1)通过Class静态类中的forName()方法进行调用。该方法通过Java反射技术加载驱动程序类。由于与外部设置无关,因此推荐使用这种加载驱动程序的方法。代码如下,其中“db.Driver”为数据库的驱动名称:
Class.forName(“db.Driver”);
(2)通过将数据库驱动名称添加到java.lang.System类中的jdbc.drivers属性中。该方式是一个由DriverManager类加载的驱动程序类名的列表,并用冒号(:)分隔。
在上述两种方式中,新加载的驱动类都通过调用DriverManager类中的registerDriver()方法进行自动注册。出于安全方面的因素,JDBC管理层将跟踪哪个类加载器提供哪个驱动程序。这样,当DriverManager类打开连接时,它仅使用本地文件系统或与发出连接请求的代码相同的类加载器提供的驱动程序。
(4)驱动管理类:DriverManager (3)
建立连接
加载驱动类并在DriverManager类中注册后,即可用来与数据库建立连接。当调用 DriverManager类中getConnection()方法发出连接请求时,DriverManager类将检查每个驱动程序,并查看该类是否可以建立连接。例如,通过SQL Server2000数据库的驱动和URL获取数据库的连接。

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver "); 
String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=wy_userInfo";
DriverManager.getConnection(url,"user","password"); 

DriverManager类除了getConnection()方法外,还存在其他的方法,如表所示。

在这里插入图片描述

(5)数据库连接接口:Connection
java.sql.Connection接口表示与特定数据库的连接,并在连接的上下文中可以执行SQL语句并返回结果。通过Connection对象可以获取一个数据库和表等数据库对象的详细信息。Connection接口中常用的方法如表所示。

在这里插入图片描述

(6)执行静态SQL语句接口:Statement (1)
java.sql.Statement接口用来执行静态的SQL语句,并返回执行结果。处理静态的SQL语句主要分为3种Statement对象:Statement、PreparedStatement、CallableStatement。它们作为在指定连接上执行SQL语句的容器。这3种Statement对象的关系如图所示。
在这里插入图片描述
(7)执行静态SQL语句接口:Statement (2)
创建Statement对象
取得数据库连接对象后,就可以通过该连接发送SQL语句。Statement对象可以通过Connection对象中的createStatement()方法进行创建,例如:
Connection con = DriverManager.getConnection(url, “sa”,""); //取得数据库连接
Statement stmt = con.createStatement(); //获取Statement对象
为了执行Statement对象,被发送到数据库的SQL语句将被作为参数提供给Statement类中的指定方法。例如,通过Statement对象执行查询的SQL语句:
ResultSet rs = stmt.executeQuery(“select * from wy_user”);
(8)执行静态SQL语句接口:Statement (3)
2.使用Statement对象执行SQL语句
Statement接口提供了3种执行语句的方法,如表所示。
在这里插入图片描述

3.SQL语句执行完成
当连接处于自动提交模式时,其中所执行的SQL语句在完成时将自动提交或还原。
4.关闭Statement对象
Statement对象将由Java垃圾收集程序自动关闭。

(9)执行预编译的SQL语句接口:PreparedStatement (1)
PreparedStatement接口继承并扩展了Statement接口,用来执行动态的SQL语句。PreparedStatement接口包含已编译的SQL语句,并且包含于PreparedStatement对象中的 SQL语句可具有一个或多个参数。该语句为每个参数保留一个问号(?)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX()方法来提供。由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。
作为Statement的子类,PreparedStatement除了继承Statement的所有功能外,还添加了一些方法,用于设置发送给数据库以取代参数占位符的值。同时,execute()方法、 executeQuery()方法和executeUpdate()方法已被更改,从而不再需要参数。这些方法的 Statement形式(接受SQL语句参数的形式)不应该用于PreparedStatement对象。

(10)执行预编译的SQL语句接口:PreparedStatement (2)
1.创建PreparedStatement对象
例如,创建包含带两个参数占位符的SQL语句的PreparedStatement对象:
PreparedStatement pstmt =
con.prepareStatement(“UPDATE wy_table SET m =? WHERE x= ?”);
2.传递多参数
例如,将第一个参数设为“王”,第二个参数设为“毅” :
pstmt.setString(1,“王”);
pstmt.setString(2,“毅”);
PreparedStatement类常用传递参数的方法如表所示。
(11)执行预编译的SQL语句接口:PreparedStatement (3)
在这里插入图片描述

(12)执行预编译的SQL语句接口:PreparedStatement (4)
3.执行预编译的SQL语句
设置完预编译的SQL语句后,就可以通过PreparedStatemen类中的方法执行该SQL语句。PreparedStatemen类执行SQL语句的方法如表所示。
在这里插入图片描述

4.参数中数据类型的一致性
setXXX()方法中的XXX是Java类型。它是一种隐含的JDBC类型(一般SQL语句类型),因为驱动程序将把Java类型映射为相应的JDBC类型,并将该JDBC类型发送给数据库。在编写代码时要确保将每个参数的Java类型映射为与数据库所需的JDBC数据类型兼容的JDBC类型。
(13)处理存储过程语句接口:CallableStatement (1)
CallableStatement对象为所有的关系性数据库提供了一种以标准形式调用已储存过程的方法。该对象可以处理两种形式的存储过程:一种形式带结果参数,另一种形式不带结果参数。结果参数是一种输出参数,是已储存过程的返回值。两种形式都可带有数量可变的输入、输出或输入和输出的参数。问号将用作参数的占位符。在JDBC中,调用存储过程的语法如下:
{call 过程名[(?,?,…)]}
返回结果参数的过程的语法如下:
{? = call 过程名[(?, ?, …)]}
(14)处理存储过程语句接口:CallableStatement (2)
1.创建CallableStatement对象
CallableStatement对象是用Connection类中的prepareCall()方法创建。其中,存在有两个变量,不含结果参数代码设置如下:
CallableStatement cstmt = con.prepareCall("{call getTestData(?,?)}");
2.输入和输出参数
将输入参数传给CallableStatement对象是通过setXXX()方法完成的。如果存储过程返回的是输出参数,则在执行CallableStatement对象前必须先注册每个输出参数的JDBC类型。注册JDBC 类型是用registerOutParameter()方法来完成的。语句执行完后,CallableStatement的getXXX()方法将取回参数值。例如:
(15)处理存储过程语句接口:CallableStatement (3)

CallableStatement cstmt = con.prepareCall("{call getTestData(?,?)}"); 
cstmt.registerOutParameter(1,java.sql.Types.TINYINT); 
cstmt.registerOutParameter(2, java.sql.Types.DECIMAL,3);	
cstmt.executeQuery();
//从第1个输出参数中取出一个Java字节
byte x = cstmt.getByte(1); 
//从第2个输出参数中取出一个BigDecimal对象(小数点后面带3位数) 
java.math.BigDecimal n = cstmt.getBigDecimal(2,3); 

3.执行存储过程

当设置完存储过程的参数后,就可以通过CallableStatement类中的方法执行该存储过程。CallableStatement类执行存储过程的方法如表所示。

在这里插入图片描述

(16)返回查询结果集接口:ResultSet (1)
java.sql.ResultSet接口类似于一个数据表,通过该接口的实例可以获得检索结果集以及对应的数据表相关信息。Result实例通过执行查询数据库的语句生成。一个Statement对象在同一时刻只能打开一个ResultSet对象。可以通过字段的序号或者字段的名字来制定获取某个字段的值。ResultSet对象的常用方法如表所示。

在这里插入图片描述

(17)返回查询结果集接口:ResultSet (2)

在这里插入图片描述

(18)返回查询结果集接口:ResultSet (3)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43708822/article/details/85836184