数据库编程
数据库连接技术(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程序访问数据库步骤

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

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

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

执行存储过程


删除存储过程

PL/SQL基本语法
声明局部变量

条件语句

循环语句


遍历命令结果

数据库触发器
触发器是特殊类型的存储过程,主要由操作事件(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是游标名。
游标和存储过程
游标不是存储过程,它是一种对象,可以体现为存储过程中的变量,这个特殊的变量可以与某条查询语句查询出来的数据绑定,暂时存储这些数据,并可通过循环将这些数据逐条提供给变量,便于存储过程使用,这可以使得查询结果与存储过程分离,更直观,具有封装性和可重用性