连接技术
ODBC接口技术
Open DataBase Connectivity,开放式数据库互连
定义了一套基于SQL的、公共的、与数据库无关的API
层次结构
- ODBC应用程序接口:一种使用ODBC技术实现用用程序和数据库互连的标准接口
- ODBC驱动程序管理器:管理系统中的各种驱动程序
- 驱动程序:用于支撑ODBC函数动用的模块,通常是一个动态链库DLL
- 不同的RDBMS驱动程序不同,每种数据库都要向ODBC驱动程序管理器注册它自己的驱动程序
- 作用
- 建立于数据源的连接
- 向数据源提交请求
- 在应用程序需求时,转换数据格式
- 返回结果给应用程序
- 将运行错误格式化为标准代码返回
- 需要时可声明和处理游标
- 数据源:驱动程序和数据库连接的桥梁
- 可以看作是与一个具体数据库建立的连接
步骤
配置数据源
JDBC
Java DataBase Connectivity,Java数据库连接
用于执行SQL语句的Java API
原理
步骤
- 加载驱动
Class.forName("驱动名称");
Class.forName("org.postgresql.Driver");
- 建立连接
DriverManager.getConnection(String url);
/*例*/
String URL = "jdbc:postgresql://localhost:5432/testdb";
String userName =" myuser" ;
String passWord = "sa";
connection conn = DriverManager.getConnection (URL, userName, passWord) ;
- 创建Statement对象
Statement stmt = conn.createStatement();
- 执行SQL语句
String sql = "INSERT INTO public.student (sid, sname, gender, birthday, major,
phone)" + " VALUES (2017001', '张山',' 男','1998-10-10',' 软件工程','13602810001')";
stmt.executeUpdate(sql);
- ResultSet保存
String sql ="SELECT id,name,age FROM company";
ResultSet rs = stmt.executeQuery(sql);
- 关闭连接
//需要显式地关闭
rs.close();//关闭结果集对象
stmt.close();//关闭执行对象
conn.close();//关闭连接对象
Eclipse下使用
- 下载JDBC驱动程序包:
postgresql-42.2.2.jar
- 创建工程PostgreSQL
- 创建
jdbclib
目录,并将postgresql-42.2.2.jar
拷贝到该目录 - 并做如下配置
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服务器。
基本流程
- 客户机将请求发送到服务器;
- Servlet程序是由Web服务器调用,Web服务器收到客户端的Servlet访问请求后,解析客户端的请求;
- 服务器上的Web容器转载并实例化Servlet;
- 调用Servlet实例对象的init0方法;
- 调用Servlet的service0方法并将请求和响应对象作为参数传递进去;
- Servlet创建一- 个响应,并将其返回到Web容器。
- Web容器将响应发回客户机。
- 服务器关闭或Servlet空闲时间超过一定 限度时,调用destory0方 法退出。
JSP技术
Java Server Pages,Web服务器端的开发技术 ≈ HTML + Java
服务器端动态页面开发技术
页面组成
- HTML标记
- JSP标记
- 成员变量与成员方法
<%! %>
- Java程序片
<% %>
- Java表达式
<%= %>
- 注释
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语句通过主变量和游标实现将查询结果传回主语言处理
使用规定
- 区分语句
需要在SQL语句前添加前缀标识
C语言使用
EXEC SQL
作为前缀,使用END_EXEC
作为结束标志
- 处理方式协调
使用游标机制,将集合操作转换称单记录处理方式
Java语言嵌入式SQL语句的步骤
Class.forName("org.postgresql.Driver")
加载PostgreSQL驱动程序- 使用
DriverManager. getConnection (String urI,String user,String pwd)
建立与数据库的连接。 - 使用Connection对象的下列方法之一创建SQL语句对象:
Connection.createStatement()
创建Statement对象,实现静态SQL语句查询;Connection.prepareStatement (String sql)
创建Prepar edStatement对象,实现动态SQL语句查询;Connection.prepareCall (String sql)
创建CaIlableStatement对象,实现数据库存储过程调用。
- 执行查询
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对象。
- java语言操作数据库查询返回结果
ResultSet
接口对象用于返回查询结果集
ResultSet.next()
将游标由当前位置移动到下一行;ResultSet.getString (String columnName)
获取指定字段的String类型值;ResultSet.getStr ing (int columnIndex)
获取指定索引的String类型值;ResultSet.previous()
将游标由当前位置移动到上一行。
- 向SQL传递参数
使用动态查询prepareStatement
对象执行操作
prepareStatement.executeUpdate()
执行更新;prepareStatement
对象使用addBatch()
向批处理中加入更新语句,executeBatch()
方法用于成批地执行SQL语句。