数据库第六章——应用编程

连接技术

在这里插入图片描述

ODBC接口技术

Open DataBase Connectivity,开放式数据库互连

定义了一套基于SQL的、公共的、与数据库无关的API

层次结构

在这里插入图片描述

  • ODBC应用程序接口:一种使用ODBC技术实现用用程序和数据库互连的标准接口
  • ODBC驱动程序管理器:管理系统中的各种驱动程序
  • 驱动程序:用于支撑ODBC函数动用的模块,通常是一个动态链库DLL
    • 不同的RDBMS驱动程序不同,每种数据库都要向ODBC驱动程序管理器注册它自己的驱动程序
    • 作用
      • 建立于数据源的连接
      • 向数据源提交请求
      • 在应用程序需求时,转换数据格式
      • 返回结果给应用程序
      • 将运行错误格式化为标准代码返回
      • 需要时可声明和处理游标
  • 数据源:驱动程序和数据库连接的桥梁
    • 可以看作是与一个具体数据库建立的连接

步骤

在这里插入图片描述

配置数据源

在这里插入图片描述
在这里插入图片描述

JDBC

Java DataBase Connectivity,Java数据库连接
用于执行SQL语句的Java API

原理

在这里插入图片描述

步骤

在这里插入图片描述

  1. 加载驱动
Class.forName("驱动名称");
Class.forName("org.postgresql.Driver");
  1. 建立连接
DriverManager.getConnection(String url);
/*例*/
String URL = "jdbc:postgresql://localhost:5432/testdb";
String userName =" myuser" ;
String passWord = "sa";
connection conn = DriverManager.getConnection (URL, userName, passWord) ;
  1. 创建Statement对象
Statement stmt = conn.createStatement();
  1. 执行SQL语句
String sql = "INSERT INTO public.student (sid, sname, gender, birthday, major,
phone)" + " VALUES (2017001', '张山','','1998-10-10',' 软件工程','13602810001')";
stmt.executeUpdate(sql);
  1. ResultSet保存
String sql ="SELECT id,name,age FROM company";
ResultSet rs = stmt.executeQuery(sql);
  1. 关闭连接
//需要显式地关闭
rs.close();//关闭结果集对象
stmt.close();//关闭执行对象
conn.close();//关闭连接对象

Eclipse下使用

  1. 下载JDBC驱动程序包:postgresql-42.2.2.jar
  2. 创建工程PostgreSQL
  3. 创建jdbclib目录,并将postgresql-42.2.2.jar拷贝到该目录
  4. 并做如下配置
    在这里插入图片描述

Java WEB数据库编程

数据库系统工作原理

在这里插入图片描述
常见Java Web服务器

  • Tomcat (Apache) :当前应用最广的JavaWeb服务器;
  • JBoss (Redhat红帽) :支持JavaEE,应用比较广;
  • GlassFish (Oracle) : Oracle开 发JavaWeb服务器,应用不是很广;
  • Weblogic (Oracle) : Oracle开 发JavaWeb服务器,支持JavaEE,适合大型项目;
  • Websphere (IBM) : IBM开发JavaWeb服务 器,支持JavaEE,适合大型项目;

Servlet技术

原理

  • 客户机将HTTP请求发送给Web服务器
  • Web服务器将该请求转发给Servlet
  • Servlet处理该请求
  • Servlet将响应发送给Web服务器
  • Web服务器将响应转发给客户机

容器

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

基本流程

在这里插入图片描述

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

JSP技术

Java Server Pages,Web服务器端的开发技术 ≈ HTML + Java
服务器端动态页面开发技术

页面组成
  1. HTML标记
  2. JSP标记
  3. 成员变量与成员方法<%! %>
  4. Java程序片<% %>
  5. Java表达式<%= %>
  6. 注释
    在这里插入图片描述

MyBatis数据库持久层框架

目的
代替一些底层的处理
结构
在这里插入图片描述

访问步骤
在这里插入图片描述

  • 第一步:读取配置文件Sq IMapConfig. xml,此文件作为Mybat is的全局配置文件,配置了Mybat is的运行环境等信息。mapper. xml文件即SQL映射文件,文件中配置了操作数据库的SQL语句,此文件需要在Sq| MapConfig. xml中加载;
  • 第二步:SqISessionFactoryBuilder通过Configuration 生成sqlSessionFactory对象。
  • 第三步:通过sq ISess ionFactory打开一个数据库会话sq ISess ion会话,操作数据库需要通过sqlSess i on进行。
  • 第四步: Mybat is底层自定义了Executor执行器接口操作数据库,Executor 接口负责动态SQL的生成和查询缓存的维护,将MappedStatement 对象进行解析,SQL参数转化、动态SQL拼接,生成JDBC Statement对象。

存储过程(期末考编程)

存储过程是一种数据库的对象,由一组SQL语句和过程语句组成,编译后存储于数据库中.外部层序使用专门的语言调用存储过程执行

  • 创建存储过程
//创建存储过程
CREATE [OR REPLACE] FUNCTION name ([[argmode][argname]argtype[{DEFAULT|=}default_expr][,...]])[RETURNS retype|RETURNS TABLE(column_name column_type[,...])]
AS$$ //$$用于声明存储过程代码的开始
DECLARE --声明段
BEGIN
	--函数体语句
END;
$$LANGUAGE lang_name;//$$表明代码结束,LANGUAGE后指明所用的编程语言

在这里插入图片描述

  • 执行存储过程
//执行存储过程
select 存储过程名(参数);
select * from 存储过程名(参数);
//存储过程调用其他存储过程
select into 自定义变量 from 存储过程(参数);
  • 删除存储过程
//删除过程
DROP FUNCTION[IF EXISTS] name ([[argmode][argname]argtype[,...]])[CASCADE|RESTRICT]

参数表
在这里插入图片描述

PL/pgSQL

postgresql的存储过程语言

基本语法

  • 声明变量
declare
	变量名 变量类型;
//声明为记录类型
variable_name RECORD;//RECORE只是一个占位符
  • 条件语句
IF boolean-expression THEN
	statements
END IF;

IF boolean-expression THEN
	statements
ELSE
	statements
END IF;

IF boolean-expression THEN
	statements
ELSEIF boolean-expression THEN
	statements
ELSE
	statements
END IF;
  • 循环语句
//基本的LOOP
LOOP 
	statements;
	EXIT[label] WHEN expression;//类似c语言的break
END LOOP[label];

CONTINUE[label][WHEN expression];//类似c语言的continue
//WHILE
WHILE expression LOOP
	statements
END LOOP;
//FOR
FOR name IN [REVERSE] expression..experssion
LOOP
	statements
END LOOP;

存储过程的优缺点

优点

  • 减少网络通信量(数据库内部执行)
  • 执行速度更快
  • 降低了业务实现与应用程序的耦合
  • 降低了前端程序开发的复杂性
  • 保护数据库元信息
  • 增强了数据库的安全性

缺点

  • (1)如果存储过程的参数或返回数据发生变化,一般需要修改存储过程的代码,同时还需要更新主程序调用存储过程的代码。
  • (2)开发调试复杂,由于缺乏支持存储过程的集成开发环境,存储过程的开发调试要比一-般程序困难。
  • (3)可移植性差,不同DBMS支持的存储过程编程。

触发器(期末考编程)

  • 触发器是特殊类型的存储过程,主要由操作事件触发而被自动执行
  • 触发器可以实现比约束更复杂的数据完整性,经常用于加强数据的完整性约束和业务规则

特点

  • 与表相关联:必须定义在表或视图上
  • 事件触发
    • DML事件
    • DDL事件
  • 不能直接调用,也不能传递或接受参数

分类

  • 根据触发事件
    • INSERT,DELETE,UPDATE
  • 根据触发器执行次数
    • 语句级:由FOR EACH STATEMAENT声明,妹纸那个一条SQL语句触发依次(默认值)
    • 行级:由FOR EACH ROW标记,当表中数据发生变化,每变化一行执行依次
  • 触发时间
    • BEFORE触发器:触发事件之前执行
    • AFTER触发器
    • INSTEAD OF触发器:触发事件后,执行触发器中指定的函数

特殊变量

  • NEW:数据类型RECORD.
    • 行级,保存插入和修改产生的新数据行
    • 语句级,都为NULL
  • OLD:数据类型RECORD
    • 行级:保存修改和删除的旧数据行
    • 语句级:都为NULL
  • TG_OP:数据类型text
    • 为INSERT,UPDATE,DELETE字符串,说明触发器由哪个操作引发

基本步骤:

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

基本语法

  • 创建
CREATE TRIGGER name{BEFORE|AFTER|INSTEAD OF} ON table_name [FOR[EACH]{ROW|STATEMENT}]EXECUTE PROCEDURE 存储过程名(参数列表)

参数表

参数含义
BEFORE/AFTER/INSTEAD OF/指明触发器被触发的时间
ON表名 指明触发器所依附的表
FOR EACH{ROW/STATEMENT}指明触发器被触发的次数
EXECUTE PROCEDURE存储过程名(参数列表)指明触发时所执行的存储过程
  • 修改
ALTER TRIGGER name ON table_name RENAME TO new_name
  • 删除
DROP TRIGGER [IF EXISTS] name ON table_name [CASCADE|RESTRICT]

参数表

参数含义
IF EXISTS如果指定的触发器不存在,那么发出提示而不是抛出错误
table_name触发器定义所依附的表的表名
CASCADE级联删除依赖此触发器的对象
RESTRICT如果有依赖对象存在,那么拒绝删除.该参数缺省时拒绝删除
  • 事件触发器

事件触发器和普通触发器有何区别
靠不同的语句来触发(DML,DDL)

游标

游标(Cursor)是一种指向数据库查询结果集指针,提供了从结果集中提起并分别处理每一条记录的机制

基本语法

  • 声明游标
--有两种方式:使用refcursor定义游标变量或  游标名 CURSOR[(arguments)] FOR query语句

--举例
curStudent CURSOR FOR SELECT * FROM student;
curStudentOne CURSOR (key integer) IS SELECT * FROM student WHERE SID = key;
  • 打开游标
OPEN unbound_cursor FOR query;--打开未绑定的游标变量
OPEN unbound_cursor FOR EXECUTE query-string;--使用存储过程打开未绑定游标
OPEN bound_cursor [(argument_values)];--打开一个绑定的游标
--举例
  • 使用游标
FETCH cursor INTO target;
--从游标读取当前指针所指向记录的数据到目标中.读取成功可通过PL/pgSQL内置系统变量FOUND来判断

--举例
FETCH curStudent INTO SID,Sname,sex;
  • 关闭游标
    主要释放游标数据所占用内存资源
CLOSE cursorName;

嵌入式SQL编程

SQL语言有很强的查询处理能力,数据处理能力
高级语言有很强逻辑表达能力,实现用户界面能力强
所以在高级语言(称为宿主语言)中嵌入SQL语言(称为嵌入式SQL)进程数据库应用编程

处理过程
在这里插入图片描述

嵌入式语言和宿主语言通信

  • (1) SQL语句通过SQL通信区实现向宿主语言传递SQL语句的执行状态信息,使宿主语言程序能够根据此信息控制流程
  • (2)宿主语言通过主变量实现向SQL语句提供参数
  • (3) SQL语句通过主变量和游标实现将查询结果传回主语言处理

使用规定

  1. 区分语句
    需要在SQL语句前添加前缀标识

C语言使用EXEC SQL作为前缀,使用END_EXEC作为结束标志

  1. 处理方式协调
    使用游标机制,将集合操作转换称单记录处理方式

Java语言嵌入式SQL语句的步骤

  1. Class.forName("org.postgresql.Driver")加载PostgreSQL驱动程序
  2. 使用DriverManager. getConnection (String urI,String user,String pwd)建立与数据库的连接。
  3. 使用Connection对象的下列方法之一创建SQL语句对象:
  • Connection.createStatement()创建Statement对象,实现静态SQL语句查询;
  • Connection.prepareStatement (String sql) 创建Prepar edStatement对象,实现动态SQL语句查询;
  • Connection.prepareCall (String sql)创建CaIlableStatement对象,实现数据库存储过程调用。
  1. 执行查询
  • Statement.execute(String sql)执行各种SQL语句,返回一个boolean类型值,true表示执行的SQL语句具备查询结果,可通过Statement.getResultSet()方法获取;
  • Statement.executeUpdate(String sql)执行SQL中的insert/update/delete语句,返回一个int值,反馈受影响的记录数;
  • Statement.executeQuery (String sql)执行SQL中的select语句,返回一个表示查询结果的ResultSet对象。
  1. java语言操作数据库查询返回结果
    ResultSet接口对象用于返回查询结果集
  • ResultSet.next()将游标由当前位置移动到下一行;
  • ResultSet.getString (String columnName)获取指定字段的String类型值;
  • ResultSet.getStr ing (int columnIndex)获取指定索引的String类型值;
  • ResultSet.previous() 将游标由当前位置移动到上一行。
  1. 向SQL传递参数
    使用动态查询prepareStatement对象执行操作
  • prepareStatement.executeUpdate()执行更新;
  • prepareStatement对象使用addBatch()向批处理中加入更新语句,
  • executeBatch()方法用于成批地执行SQL语句。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值