ssh

索引的优点:
1.创建唯一性索引,保证数据库表中每一行数据的唯一性
2.大大加快数据的检索速度,这也是创建索引的最主要的原因
3.减少磁盘IO


索引优点:
1、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增减
2、索引需要占用额外的物理空间
3、当对表中的数据进行增加、删除和修改的时候索引也要
动态的维护,降低数据的维护速度


create index my_index on mytable


create unique index my_index on mytable


顺序索引,散列索引,位图索引


select * 
from(select t.*,rownum m
from(select *
from menu order by id desc)t
where rownum<10

where m>=5;


mysql分页
select * from music where id limit 5,5;


复制另外一张表
1、不存在另一张表
create table 新表 as select * from 将要复制的表
2、存在另一张表
insert into 新表名 select 字段 from 将要复制的表名


select s.id,min(s.name),count(m.mid) from special s
inner join ms m on s.id=m.id group by s.id;


快速删除一张表(不可事务回滚,也没有日志记录)
truncate from 表名


inner join
select 查找信息 from 表名1 inner join 表名2 
on 表名1.列名=表名2.列名;


left join
左外连接
select 查找信息 from 表名1 left join 表名2
on 表名1.列名=表名2.列名


right join
select 查找信息 from 表名1 right join 表名2 
on 表名1.列名=表名2.列名;




oracle遍历树形结构


select * from extmenu
start with pid=1
connect by prior id=pid;


查询出来60-70,80-90,95-100学生的信息
select * from where chengji between 60 and 70
or between 80 and 90 
or between 95 and 100


关联表查询
select * from dept where exists(select * from where emp.deptno=dept.deptno);

select * from dept d inner join emp e on d.deptno=e.deptno;


删除表中重复的数据
名字相同但是ID不一样
delete from xin a where a.rowid=!(
select max(b.rowid) from xin b
where a.name=b.name;
)


delete from xin a where a.rowid=!(
select max(b.rowid) from xin b
where a.name=b.name;
)






spring是面向接口编程,降低耦合性,主要事务控制并创建bean实例对象。
在ssh整合时,充当粘合剂作用。IOC控制反转/依赖注入


Ioc的作用产生实例对象,它是基于工厂设计模式的


springIoc注入的三种方式是什么?
1、通过属性进行注入,通过构造函数注入
2、注入对象数组, 注入List集合
3、注入Map集合,注入Properties类型


SpringIOC自动绑定
可以设置autowire按以下方式进行绑定
按byType只要类型一致就会自动寻找
按byName自动按属性名称进行自动查找匹配


AOP是OOP的延续,面向切面编程
OOP主要是面向对象编程
AOP主要应用于
日志记录
性能统计
安全控制
事务处理


Spring中实现Aop技术
在Spring中可以通过代理模式实现Aop
代理模式可以分为静态代理和动态代理
静态代理:一个接口,分别有真实实现和一个代理实现
动态代理:通过代理类的代理,接口和实现类之间可以不直接发生联系
而是在运行期间动态关联。


动态代理:代理类和真实类必须实现相同的接口
代理类中持有真实类的引用
调用真实类前后添加功能


spring实现IOC
原来需要自己进行bean创建以及注入,
现在交给spring容器去完成bean的创建以及注入。
所谓控制反转就是对象控制权转移给容器。




事务是指一组逻辑操作单元即一组sql语句。当这个单元中的一部分操作失败,
整个事务回滚。只有全部正确才完成提交。


1、原子性 要不不发生 要不都发生
2、一致性 数据不被破坏
3、隔离性 一个事务执行不能被其他事务干扰
4、持久性 一个事务一旦被提交,它对数据库中数据的改变就是永久性的。
即使系统重启数据也会丢失。


JDBC中
事务默认是自动提交的,
每次执行一个sql语句时,如果执行成功
就向数据库中自动提交,而不能回滚。


为了让多条语句执行
1、取消自动提交事务
2、在所有sql语句都成功执行之后调用commit方法提交事务
3、在出现异常时,调用rollback();方法事务回滚。


什么是权限管理系统?
当用户登录时,根据用户名和密码到用户表验证信息是否合法
如果合法则获取用户信息,之后根据用户id在到用户角色关联表中国得到
相关联的角色id集合。
之后根据角色id在到角色权限关联表中获取该角色所拥有的权限id集合
然后在根据权限id集合到权限表中获取具体的菜单,展现给当前登录用户


从而到达到不同用户看到不同的菜单权限。


线程状态4种
新建状态:新创建了一个线程对象
就绪状态:线程对象创建后,其他线程调用该对象的start()方法
等待获取cpu使用权
运行状态就绪状态的线程获取cpu,执行程序代码
阻塞状态线程因为某种原因放弃cpu使用权,暂时停止运行


等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。






一个进程一个应用程序
一个进程包含多个线程
同时创建多个线程就是多线程
response.setHeader("键","值");


java线程池概述
当需要用到线程某些操作的时候,直接从线程池中获取。
不需要等到用的时候再去创建。
线程池的核心流程


构建一个ThreadPoolExecotor指定创建线程的数量
通过threadPool.execute()去添加一个个要执行的线程
即实现Runnable接口的java类。
在实现Runnable接口的java类中run()方法中写入具体的业务代码


osache是一个高性能的j2ee框架,可以和任何java代码进行集成
并且可以通过标签对页面内容进行缓存,还以缓存请求。


缓存的层次如下:jsp-action-service-dao缓存越靠前对性能的提升越大






servlet线程安全描述
servlet是单例的,对于所有请求都是用一个实例,所以如果有
全局变量被多线程使用的时候,就会出现线程安全问题。


webService是基于xml在不同平台不同项目之间进行数据传输。


用Junit测试提高代码的性能和保证逻辑的正确性。
是Java语言的单元测试框架,测试简单,不仅提高工作效率和代码质量
也提高团队的合作能力。


ant不用专门在客户那里安装eclipse
直接用ant进行项目编译,打包,部署操作。


maven是项目管理工具,核心特点就是通过maven包的依赖管理。保证jar包版本
一致性,以及可以使多个项目共享jar包。






数据库sql优化
1、避免使用select *
2、尽量使用commit对大批量的分段数据提交释放资源,减轻服务器压力
3、尽量保持每次查询的sql语句字段用大写
4、用union_all替换union,因为union_all不会过滤重复数据,
所以执行效率高一点。
union可以自动排序,性能慢一点。


delete from emp e where e.rowid>(
select min(rowid)
from empc where x.emp_on=e.emp_no
);
3
用>=替换>
那么执行A>2与A>=3的效果就有很大区别了
因为A>2时。


避免在索引列上使用计算和函数,这样索引就不能使用
低效
select from dept where sal*12>25000;
高效
select from dept where sal>25000/12;


如果批量删除多条数据,
delete from tableName where id in(1,2,3);
而不要用多条delete语句进行删除。


sql注入防护


数据库三大范式:
第一范式:数据库表中的所有字段都是不可分解的原子值
第二范式:需要确保数据库表中的每一列都和主键有关,
而不能只与主键的某一部分有关。
第三范式:需要确保数据表中的每一列数据都和主键直接相关,
而不能间接相关。




PreparedStatement和statement的区别
PreparedStatement是预编译的,
如果数据量大于1,那么每次执行sql语句statement都要重新编译
一次而Preparedstatement不用。


id、rowid、rownum
rowid物理位置的唯一标识
rownum用于标记结果集中结果顺序的一个字段


数据库连接池:
dbcp:比较稳定
c3p0:性能比较高


在tomcat启动的时候就创建了指定数量的连接,
之后我们程序使用的时候直接从连接池里取,而不需要创建






jdbc连接数据库
1、加载驱动
2、提供JDBC连接URL、创建数据库连接
3、创建一个statement
4、执行sql语句
5、关闭Jdbc对象


二十六:
Spring融入框架
通过web.xml中配置contextLoaderLister这个监听器也加载
spring的配置文件,从而融入到项目框架中。


拦截器是AOP中的概念,本身是一段代码,可以通过
植入点来指定拦截器的代码在植入点的前后执行,从而起到拦截作用


Struts2的Interceptor,其拦截的对象是Action代码,可以定义
在Action代码前或者之后执行拦截器的代码。


struts2的拦截器和servlet过滤器类似,在执行Action的execute方法
之前,struts.xml中引用的拦截器,在执行完所用引用的拦截器
的intercept方法后,会执行Action的execute()方法。


拦截器是Struts2框架的核心。
主要完成解析请求参数
将请求参数赋值给Action属性
执行数据校验
文件上传等工作


过滤器
filter是一个过滤器,用来在请求前和响应后进行数据的处理
filter的生命周期是:
实例化
初始化
进行过滤
销毁
释放资源一个filter必须实现javax.servlet.Filter接口
<filter>
  <filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>n.hzhy.oa.web.filter.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
  </filter-mapping>


JSP标签
jsp:include动作
1、<jsp:include page="Filename"/>
2、JSP指令
<%@include%>
3、<%=%>
<%=java表达式%>
<%=;%>
迭代标签
<c:foreach>
<c:foreach/>
 
el表达式${}
jsp:include动作是在运行动态包含




SSH概述
struts充当控制器,实现MVC,主要用来处理用户的请求
和跳转页面。使项目结构清晰。
开发者只需要关注业务逻辑实现即可。


spring在ssh充当粘合剂,粘合struts-spring-hibernate,
主要用来进行事务的控制,hibernate充当数据库持久层
主要用它来与数据库交互,提开发效率,减轻hql控制要求
而且hibernate通过反射机制,有灵活的映射性,还支持各种关系,
一对一,一对多,多对多。


在进行ssh整合的时候,我们应该注意
1、Action继承于ActionSupport
引入struts-spring-plugin.jar包,
从而完成struts和spring的整合
在struts2的action中注入service,保证service
的名字和配置文件一致
并生成get\set方法。


二级缓存sessionFactory即应用级别的缓存,还有查询缓存
一级缓存session
session.clear()
session.evict(object)


二级缓存的生命周期和sessionFactory的生命周期保持一致
可以跨session被多个session共享。
hibernate3默认开启二级缓存
二级缓存也只能缓存对象。


分页怎么实现?
1、前台封装一个显示分页的组件
2、查询总条数
3、后天封装分页工具类,计算开始位置、结束位置、总页数
4、后台写支持分页的sql语句
5、前台包含分页组件,实现分页效果。
--------------------------------------------------------
HIbernate事务处理
开启事务 session.beginTransaction();
执行相关操作,如果成功则session.commit();
执行操作失败:session.rollback();


Hibernate的三种状态以及状态的转化
1、new一个初始化对象,并没有在数据库中保存数据,处于临时状态
2、当执行save()方法,调用session.close()方法之前,内存
中对象与数据库有对应关系处于持久化状态。
3、当执行session.close()之后,处于托管状态


状态的转化
处于托管状态下,调用update()方法,转为持久化状态
持久太下执行delete()方法后,转换为临时状态。
在未初始化对象之前,调用get()、load()、find()、之后
直接进入持久化状态。
--------------------------------------------------
Hibernate中的两大配置文件
*.hbm.xml:主键生成策略,映射关系,一对多,一对一的关系
配置文件
Hibernate.cfg.xml:方言(用哪个数据库),数据库连接信息,
包含*.hbm.xml内容映射文件也可以配事务。
------------------------------------------------
Hiberante与JDBC的区别
hibernate先检索缓存中的映射对象(即hibernate操作的是对象)
而jdbc则是直接操作数据库。
Hibernate是JDBC的轻量级封装,它是一个独立的对象持久层框架。
JDBC使用的是sql语句,Hibernate使用的是HQL语句,但是HQL语句最终还会隐式
转换成sql语句执行。
----------------------------------------------------
HIberante五大核心
1、Configuration接口的作用是对Hibernate进行配置,以及对它启动
并创建一个SessionFactory对象。
2、SessionFactory接口
SessionFactory接口只负责初始化Hiberante,他充当数据存储源的
代理,并负责创建Session对象。SessionFactory是线程安全的。
3、Seesion接口
Seesion接口和负责执行被持久化对象的CRUD操作。
Session对象是非线程安全的。Session相当于jdbc的connection
4、Query与Criteria接口
5、Transaction接口
Transaction(事务)负责操作相关的事务。
------------------------------------------------------------
Hibernate的运行原理
首先通过configuration去加载hiberante.cfg.xml这个配置文件,
根据配置文件的信息去创建sessionFactory是线程安全的,是
一个session工厂,用来创建session,session是线程安全的,
然后通过session去进行数据库的各种操作,在进行操作的时候
通过transaction进行事务控制。
-------------------------------------------------------
Hibernate中get和load的区别
加载方式:
load为延迟加载(返回的是一个ID属性的代理,只有使用该属性时,
才发出sql语句);
get为立即加载(执行时,会立即向数据库中发出sql语句)
返回结果:
load检索不到记录时会抛出ObjectNotFoundException
get检索不到记录时会返回null;
-------------------------------------------------------
在ssh框架中是怎么整合struts2?
配置struts2的前端总控制器filterDispatcher来过滤相关的请求
并且加载struts.xml




SSH整合
1.首先在web.xml中通过ContextLoaderListener来融入spring,
并加载spring的相关配置文件
2.同样配置sturts2的前端总控制器filterDispatcher来过滤相关的
请求并且加载struts.xml
3.action继承ActionSupport,然后通过引入struts-spring-plugin.jar
包并且根据配置文件中service的id生成get,set方法来注入service层。
4.dao层继承于HibernateDaoSupport,并且在dao的配置文件中注入sessionFactory.
5.通过spring中的配置文件加载hibernate.cfg.xml文件从而融入hibernate.




Struts2标签
<%@taglib prefix="s" uri="/struts-tags"%>
<s:if></s:if>
<s:iterator></s:iterator>
<s:include></s:include>
<s:property></s:property>
<s:set></s:set>
<s:from></s:form>
<s:testarea></s:textarea>
<s:select></s:select>
<s:url></s:url>
最常用的是:
判断<s:if></s:if>
循环<s:iterator></s:iterator>
输出<s:property></s:property>


Struts2中result中的type类型
1、dispatcher:它是默认的,用来转向页面,通常用来处理JSP
2、redirect:将用户重定向到一个已配置好的URL
3、redirectAction:将用户重定向到一个已经定义好的action
4、chain:将action和另外一个action连接起来
5、freemarker:返回一个已配置好的HTTp头信息响应
6、stream:向浏览器发送InputStream对象对下载的内容和图片
非常有用。




1、客户端向Servlet容器(例如Tomcat)发送一个请求;
2、这个请求经过一系列的过滤器(Filter);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是jsp或者FreeMarker的模版。(体系结构图见下一页)




Struts2的运行原理
1、tomcat 启动的时候会加载 web.xml 、核心控制器 FilterDispatcher 会加载并解析 struts.xml 
2、客户端会发送一个请求到 action 、FilterDispatcher  会根据后缀名进行拦截
3、FilterDispatcher根据 struts.xml  的配置文件信息 找到 某个action 对应的某个类里的指定方法 
4、执行相关的业务逻辑最后返回 一个String
5、<action/> 里配置 <result/> name的属性值与返回的String 进行匹配,跳转到指定的jsp 页面






1.他们的生命周期不同,
request对应的是一次请求,
session对应的是一次会话
2.request占用资源比较少,相对来说缺乏持续性,
而session资源消耗比较大,所以通常使用request来保存信息


-----------------------------------------------------------
ession是存储在服务器端,cookie是存储在客户端的,
所以安全来讲session的安全性要比cookie高,
然后我们获取session里的信息是通过存放在会话cookie里的sessionid获取的。


又由于session是存放在服务器内存中的,所以session里的东西
不断增加会造成服务器负担,所以会把很重要的信息存储在session
中,而把一些次要东西存储在客户端cookie里。




会话cookie分为两大类
会话cookie   客户端浏览器内存中
持久化cookie 是存放在客户端硬盘中


session什么情况下丢失呢?
服务器关闭的时候。
session过期
调用invalidate()
或者调用session.removeAttribute()方法,
然后session在什么时候被创建呢?确切的说是
通过调用session.getSession()来创建。
----------------------------------------------------------
运行时异常:
RuntimeException
IndexOutOfBoundsException
ArithmeticException
NullPoointerException
ArrayOutOfBoundsException
ClassNotFoundException
ClassCastException;
-----------------------------------------------------------
Java性能优化原则:
代码运算性能,内存回收,应用配置
代码层优化:避免多循环嵌套、调用和复杂逻辑




调整JVM内存大小
JVM初始最小堆内存,默认为物理内存1/64.
涉及堆(Head)和非堆(NON-Head)内存知识。


在栈中,一个对象对应一个4byte的引用。
栈是运行时的单位,而堆是存储的单位。


TomcatSessionID持久化三种方法:
session粘性:通过浏览器Cookie绑定SessionID,
通过sticky模式将同一Session请求分配到同一Tomcat上。


Session复制:Tomcat通过广播形式将Session同步到其他Tomcat节点,并且Linux下
要手动开启开放广播地址。不易后端节点过多
Session保存数据库:将SessionID保存在共享数据当中。


经常会出现内存溢出的报错信息,原因所在?
满足这两个条件抛出内存溢出:
JVM98%的时间都花费在内存回收和每次回收的内存小于2%;
1、建立过多的对象,没有及时释放,导致堆内存不足(堆内存大小受物理内存,虚拟内存限制);


2、代理设计不合理,占用内存无法及时回收。


垃圾回收涉及知识:
1、标记-清除算法


select avg(salary) from employee group by deptid;


select employee921.id,employee921.name,employee.salary,
employee921.deptid tid from employee921 where salay>
(select avg(salary) from employee921 where
deptid=tid);




select a.ename,a.salary,a.deptid
from emp a,
(select deptd,avg(salary) avgsal from emp group by deeptid) b
where a.deptid=b.deptid and a.salary>b.avgsal;


select e.name,e.salary where e.managerid=(
select id from employee where name="zxx");


select *
from student
where id<4
union
select *
from student
where id>2 and id<6;
---------------------------------------------------------
select * from gc_dfys
union
select * from Is_jg_dfys




select * from t order by limit 30,10


select top 10 * from t where id not in
(select top 30 id from t order by id) order by id;


select *
from(
select rownum r.* from t where r<=40
)
where r>30;




select *
from  (select rownum r,* 
from(
select * from articles order by postime desc


)
where rownum<=10)
where r>5;




select distinct name
from score
where name not in(
select distinct name 
from score
where score<=80)











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值