数据库连接技术(ODBC)

开放式数据库互连Open DataBase Connectivity
实现了应用程序对多种不同DBMS的数据库的访问,实现了数据库连接方式的变革。
ODBC定义了一套基于SQL的、公共的、与数据库无关的API(应用程序设计接口);
使每个应用程序利用相同的源代码就可访问不同的数据库系统,存取多个数据库中的数据;
从而使得应用程序与数据库管理系统(DBMS)之间在逻辑上的独立性,使应用程序具有数据库无关性。

层次结构

图片损坏

ODBC应用程序接口:
是一种使用ODBC技术实现应用程序与数据库互连的标准接口。
ODBC驱动程序管理器:
用于管理系统中的各种驱动程序。
驱动程序:
是一个用于支持ODBC函数调用的模块,通常是一个动态链接库DLL。不同RDBMS的驱动程序是不同的。每种数据库都要向ODBC驱动程序管理器注册它自己的驱动程序。
建立与数据源的连接
向数据源提交请求
在应用程序需求时,转换数据格式
返回结果给应用程序
将运行错误格式化为标准代码返回
需要时可声明和处理游标。
数据源:
驱动程序与数据库系统连接的桥梁。
它不是数据库系统,而是用于表达ODBC驱动程序与DBMS特殊连接的命名。
在连接中,用数据源名来代表用户名、服务器名、连接的数据库名等;
可以将数据源名看成是与一个具体数据库建立的连接;
创建数据源最简单的方法是使用Windows的ODBC驱动程序管理器
SQL Server DBMS:
是用户向各数据库厂商购买的管理数据库的管理软件;
是管理数据库的系统软件;
用户可以执行SQL语句;
创建数据库、表、视图等;
对数据库进行权限管理。
SQL Server DB:
用户创建的数据库;
用于存储用户数据、对象。

应用程序使用ODBC访问数据库的步骤

1.首先必须用ODBC管理器注册一个数据源;
2.管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系;
3.应用程序只需将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接;
4.这样,应用程序就可以通过驱动程序管理器与数据库交换信息;
5.驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序;
6.驱动程序在执行完相应的SQL操作后,将结果通过驱动程序管理器返回给应用程序

数据库连接技术(JDBC)

JDBC(Java DataBase Connectivity,Java数据库连接)技术的简称 ,是一种用于执行SQL语句的Java API。
它由一组用Java编程语言编写的类和接口组成。这个API由java.sql.* 包中的一些类和接口组成,它为数据库开发人员提供了一个标准的API,使他们能够用纯Java API 来编写数据库应用程序。
注意:使用JDBC访问数据库需要相应数据库的JDBC驱动程序。

工作原理

图片损坏

JDBC程序访问数据库步骤

图片损坏 1.加载驱动 2.建立连接 3.创建Statement对象 4.执行SQL语句 5.ResultSet保存结果集 6.关闭连接

JavaWeb数据库编程

Web容器

1.Web 容器提供了运行servlet 所需的环境;
2.它负责实例化、初始化、调用服务方法并从服务中移除servlet,管理Servlet 的生命周期;
3.实现Servlet API;
4.它充当Web 服务器和Servlet 之间的桥梁;
5.将请求从Web 服务器转发到Servlet;
6.将响应从Servlet 转发到Web 服务器。

Servlet工作流程

图片损坏 1客户机将请求发送到服务器; 2.Servlet程序是由Web服务器调用,Web服务器收到客户端的Servlet访问请求后,解析客户端的请求; 3.服务器上的Web容器转载并实例化Servlet; 4.调用Servlet实例对象的init()方法; 5.调用Servlet的service()方法并将请求和响应对象作为参数传递进去; 6.Servlet 创建一个响应,并将其返回到Web容器。 7.Web容器将响应发回客户机。 8.服务器关闭或Servlet空闲时间超过一定限度时,调用destory()方法退出。

MyBatis访问数据库技术

MyBatis 是Apache的开源项目iBatis,基于Java的持久层框架,提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
MyBatis 是支持普通 SQL查询、存储过程和高级映射的优秀持久层框架。MyBatis 使用简单的XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录,而不是使用JDBC代码和参数实现对数据的检索。

基本步骤

图片损坏 1.读取配置文件SqlMapConfig.xml,此文件作为Mybatis的全局配置文件,配置了Mybatis的运行环境等信息。mapper.xml文件即SQL映射文件,文件中配置了操作数据库的SQL语句,此文件需要在SqlMapConfig.xml中加载; 2.SqlSessionFactoryBuilder通过Configuration生成sqlSessionFactory对象。 3.通过sqlSessionFactory打开一个数据库会话sqlSession会话,操作数据库需要通过sqlSession进行。 4.Mybatis底层自定义了Executor执行器接口操作数据库,Executor接口负责动态SQL的生成和查询缓存的维护,将MappedStatement对象进行解析,SQL参数转化、动态SQL拼接,生成JDBC Statement对象。

数据库存储过程

存储过程(Stored Procedure)是一种数据库的对象;
由一组能完成特定功能的SQL 语句集构成;
是把经常会被重复使用的SQL语句逻辑块封装起来,经编译后,存储在数据库服务器端;
当被再次调用时,而不需要再次编译;
当客户端连接到数据库时,用户通过指定存储过程的名字并给出参数,数据库就可以找到相应的存储过程予以调用。

创建存储过程的语法

图片损坏

执行存储过程

图片损坏 图片损坏

删除存储过程

图片损坏

PL/SQL基本语法

声明局部变量

图片损坏 record是指在不明确变量类型的时候,为保证程序语法的格式而使用的占位符 它可以存储一个实体类数据(类比,因为SQL中没有实体类的概念),也就是一个实例对象的全部数据(或部分)都可以存放在一个record类型的变量中

条件语句

图片损坏

循环语句

图片损坏 图片损坏

遍历命令结果

图片损坏

数据库触发器

触发器是特殊类型的存储过程,主要由操作事件(INSERT、UPDATE、DELETE) 触发而被自动执行。
触发器可以实现比约束更复杂的数据完整性,经常用于加强数据的完整性约束和业务规则。
触发器本身是一个特殊的事务单位。
特点:
与表相关联:必须定义在表或视图上。
自动触发:由执行INSERT、DELETE、UPDATE操作时触发,不能直接调用,也不能传递或接受参数
是事务的一部分:触发器和触发语句作为可在触发器内回滚的单个事务

分类

1.INSERT触发器、DELETE触发器、UPDATE触发器
2.语句级触发器、行级触发器
3.BEFORE触发器:在触发事件之前执行触发器。
AFTER触发器:在触发事件之后执行触发器。
INSTEAD OF触发器:当触发事件发生后,执行触发器中指定的函数,而不是执行产生触发事件的SQL 语句,从而替代产生触发事件的SQL操作。在表或视图上,对于INSERT、UPDATE 或 DELETE 三种触发事件,每种最多可以定义一个INSTEAD OF 触发器

触发器相关的特殊变量

(1)NEW
数据类型是RECORD。对于行级触发器,它存有INSERT或UPDATE操作产生的新的数据行。对于语句级触发器,它的值是NULL。
(2)OLD
数据类型是RECORD。对于行级触发器,它存有被UPDATE或DELETE操作修改或删除的旧的数据行。对于语句级触发器,它的值是NULL。
(3)TG_OP
数据类型是text;是值为INSERT、UPDATE、DELETE 的一个字符串,它说明触发器是为哪个操作引发。
总结:NEW和OLD用于行级触发器,存放修改前(或后)的数据,可以调用数据行中某个字段的数据
TG_OP用于语句级触发器,存储触发器的触发类型

关于语句级触发器(default)和行级触发器(FOR EACH ROW)
语句级的语句针对的是SQL语句,当一条SQL语句执行的操作同时修改了数据库表中的任意条数据时,触发器只会执行一次;这种触发器是针对整个 SQL 语句的操作。当执行一条 SQL 语句时,语句级触发器会在整个语句执行完成后被激活,无论这条语句涉及多少行数据。它们对整个语句的操作进行处理,而不是逐行处理。
行级的行针对是数据库表,每当修改一行数据时,触发器都会执行一次;这种触发器是针对表的每一行数据的操作。当对表进行 INSERT、UPDATE 或 DELETE 操作时,行级触发器会在每一行上被激活。它们对表中每一行的操作进行处理。

语法和使用

创建触发器

图片损坏

修改触发器

图片损坏

删除触发器

图片损坏

使用步骤

(1)检查数据库中将要创建的触发器所依附的表或视图是否存在,如果不存在,必须首先创建该表或视图。
(2)创建触发器被触发时所要执行的触发器函数,该函数的类型必须是TRINGER型,是触发器的执行函数。但要注意,有些数据库不需要独立定义触发器函数,而是在创建触发器时,定义触发器的过程体。
(3)创建触发器,一般需要指明触发器依附的表,触发器被触发执行的时间,触发器是行级触发器还是语句级触发器,触发器执行需要满足的条件

数据库游标

(1)游标(Cursor)是一种临时的数据库对象;
(2)用来存放从数据库表中查询返回的数据记录;
(3)提供了从结果集中提取并分别处理每一条记录的机制;
(4)游标总是与一条SQL查询语句相关联;
(5)游标包括:SQL语言的查询结果,指向特定记录的指针。

声明

(1)在存储过程中游标类型的变量。例如:游标变量 refcursor;
refcursor是关键字;
此时,游标变量还没有绑定查询语句,因此不能访问游标变量。
(2) 使用游标专有的声明语法,如:
游标名 CURSOR [ ( arguments ) ] FOR query;
其中arguments为由逗号分隔的参数列表,用于打开游标时向游标传递参数,类似于存储过程或函数的形式参数;query是select数据查询语句,返回的值存储在游标变量中。

打开

(1)OPEN FOR:
其声明形式为:
OPEN unbound_cursor FOR query;
打开未绑定的游标变量,其query查询语句是返回记录的SELECT语句。
(2)OPEN FOR EXECUTE
其声明形式为: OPEN unbound_cursor FOR EXECUTE query-string;
打开未绑定的游标变量。EXECUTE将动态执行查询字符串。
(3)打开一个绑定的游标,其声明形式为:
OPEN bound_cursor [ ( argument_values ) ];
仅适用于绑定的游标变量,只有当该变量在声明时包含接收参数,才能以传递参数的形式打开该游标,参数将传入到游标声明的查询语句中

读取

其声明形式为: FETCH cursor INTO target;
FETCH命令从游标中读取下一行记录的数据到目标中,读取成功与否,可通过PL/SQL内置系统变量FOUND来判断。

关闭

CLOSE cursorName;
当游标数据不再需要时,需要关闭游标,以释放其占有的系统资源,主要是释放游标数据所占用的内存资源,cursorName是游标名。

游标和存储过程

游标不是存储过程,它是一种对象,可以体现为存储过程中的变量,这个特殊的变量可以与某条查询语句查询出来的数据绑定,暂时存储这些数据,并可通过循环将这些数据逐条提供给变量,便于存储过程使用,这可以使得查询结果与存储过程分离,更直观,具有封装性和可重用性