1) SQL 注入 2) 跨站脚本攻击XSS (Cross Site Scripting) 3) 遭破坏的认证和会话管理 4) 不安全的对象直接引用 5) 伪造跨站请求(CSRF)
6) 安全误配置(Security Misconfiguration) 7) 限制远程访问失败(Failure to Restrict URL Access) 8) 未验证的重定向和传递
9) 不安全的加密存储 10) 不足的传输层保护
事务临时表:
Create global temporary table Temp_user
(ID NUMBER(12) Primary key,name varchar2(10))
ON COMMIT DELETE ROWS ;
会话临时表:
CREATE GLOBAL TEMPOPARY TABLE TEMP_USER
(ID NUMBER(12) Primary key,name varchar2(10))
ON COMMIT PRESERVE ROWS ;
区别:
事务临时表,在提交事务后,表中的数据就消失了,但是会话临时表不会!~
会话临时表,提交事务后,依旧能查询,但是关闭数据后,重新连接时,表中的数据才会消失!~
create table tmp_test
(id int not null primary key,
username varchar2(30),
nickname varchar2(50),
address varchar2(300)
);
commit;
insert into tmp_test
values (1,‘1001‘,‘jack‘,‘shenzhen‘);
insert into tmp_test
values (2,‘1002‘,null,‘shanghai‘);
insert into tmp_test
values (3,‘1003‘,‘‘,‘wuhan‘);
commit;
select * from tmp_test
where nickname not in (‘jack‘);
select * from tmp_test
where nvl(nickname,‘#‘) not in (‘jack‘);
IOC:控制反转也叫依赖注入。利用了工厂模式
将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。
AOP:面向切面编程
OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。
将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。
声明式事务(基于AOP,TransactionManager),编程式事务
http://lzh166.iteye.com/blog/1134146
http://blog.csdn.net/java_min/article/details/4427523
过滤器:Filter对在web.xml中该filter配置的路径进行单向拦截, request匹配Filter的路径时做一次拦截,单向拦截
拦截器:Interceptor是不对request进行处理的, 它只是对action起作用,双向拦截
Filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于java本身的反射机制。
Filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调doFilter方法。而interceptor与servlet容器无关。
Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,而Interceptor只能过滤请求。
Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还是user请求来辨别是否过滤
http://blog.csdn.net/x_yp/article/details/6358630
select level, count(level)
from employee_lamar e
start with (e.dept_id = ‘101‘ and e.manager_emp_id is null)
connect by prior e.emp_id = e.manager_emp_id
group by level
order by level;
1) type类型 v_name table_name.column_name%type
v_ename emp.ename%type
select ename into v_ename from emp where empno=7900;
2) rowtype类型 v_name table_name%rowtype
v_row emp%rowtype
select * into v_row from emp where empno=7900;
dbms_output.put_line(‘ename=‘ || v_row.ename);
3) record类型
自定义类型通常会放到在包中
create or replace package my_package
as
--自定义一个类型
type myType is record(
xm emp.ename%type, --姓名
gzuo emp.job%type, --工作
gzi emp.sal%type --工资
);
end;
然后就可以在程序块中直接使用该类型
declare
--使用包中的自定义类型来定义变量
myValue my_bao.myType;
begin
select ename,job,sal into myValue from emp where empno=7844;
dbms_output.put_line(‘ename=‘||myValue.xm);
dbms_output.put_line(‘job=‘||myValue.gzuo);
dbms_output.put_line(‘sal=‘||myValue.gzi);
end;
4) table类型
语法: type 类型名 is table of 值类型 index by 键类型
值类型:指实际保存的数据的类型 键类型:类型有两种:binary_integer 或者 pls_integer
示例:用字符串做索引
declare
--定义表结构
type myTabType is table of char(2) index by varchar2(5);
sexTab myTabType;
v_sex_code varchar2(5);
v_sex_name char(2);
begin
--往表中添加内容
sexTab(‘nan‘):=‘男‘;
sexTab(‘nv‘):=‘女‘;
--用户输入
v_sex_code:=‘&性别编号‘;
v_sex_name:=sexTab(v_sex_code);
dbms_output.put_line(‘您的性别是 = ‘||v_sex_name);
end;
原文地址:http://blog.csdn.net/lamar511/article/details/39320071