Hibernate3.1.1+Struts2.0+Spring3.0+ibatis

零零碎碎整理了Hibernate+Struts+Spring+ibatis希望对大家有用

Hibernate总结

xml
hibernate的annotation 需要的jar包:
hibernate-annotation.jar ejb3-persistence.jar hibernate-commons-annotaion.jar
一对一双向外键关联
Annotaion:@oneTone @JoinColumn

hibernate原理模拟

常见的O/R Mapping映射框架:ibatis JPA JDO TopLink hibernate
hibernate配置:create||update||validate||create-drop
ID生成策略(重点) ID:generater(incremnet||Sequence||native||select||foreign||hilo||seqhilo||uuid||guid)

对象的三种持久化状态:transient(瞬时态) persistent(持久态) detached(游离态||托管态)

事物:ACID 原子性 隔离性 一致性 持久性

Hibernate核心开发接口 Configuration SessionFactory Session

Session
Load Get

区别1:

  1. load()方法从来就是假定数据在数据库中是存在的,在使用时如果不存在则会抛出ObjectNotFoundException;而get()方法不会假定数据在数据库中存在,如果不存在则返回null

  2. load()方法返回的是实体类的代理类,因此load()可以使用延迟加载策略来加载对象
    get()方法返回的不一定是实体类,可能是代理类,因为get()方法如果在session缓存(一级缓存)中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。

  3. load()方法查询数据时会先从session缓存(一级缓存)中查找,如果没有找到则会创建代理类,该代理类仅仅初始化了OID属性,当第一次访问其他属性值时,则会依次从二级缓存-->数据库查找,直到找到数据,最后将所有属性值赋给代理类。而get()方法则会直接按照一级缓存-->二级缓存-->数据库的顺序查找。

  4. 也许别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,而get则会返回最新数据。

getCurrentSession()(会从上下文获取一个Session实例) 不需关闭

openSession()每次创建Session的实例 好性能 需要关闭

transacation 由 app Driver提供
事物两种:1,依赖数据库本身 2,JTA transacation
JTA:java transacation API
JPA java Persistence API

session的三种状态 transient ---persistent ---detached
session.flush 保持session中的对象与数据库数据同步
跨session处理数据需要 session.merge()
load 懒加载 生成一个动态代理对象 [本身属于二级缓存]
get 不延迟加载,及时加载
load,get 如果使用注解在返回null都会报错
query:查询缓存必须打开和设查询缓存的权限
update 更行表中的列:如果不想更新某个列在字段上标注:@column (updateble=false)并不灵活,只有在xml中class中配置dynamic-update=true
关系映射
hibernate查询(hql+creteria)

性能优化
SchemaExport 通过配置文件自动生成见表语句并在数据库中执行

一对一单向关联
java.persistent oneToOne

一对一双向关联
只要有双向关联:@OneToOne(mappedBy="")必设 在对方(从表)中设置

联合主键
联合主键实现Serializable接口
@OneToOne
@JoinColumns({@JoinColumn(name="m_id",referencedColumnName="id"),@JoinColumn(name="m_name",referencedColumnName="name")})

a,b级联用 casecade=(CascadeType.values())

关系映射
把一个表的映射成两个或者多个类。被细化出来的类,可以称为组件(Component)(@Embedded)

二级缓存 :SessionFactory
hibernate.cfg.xml :org.hibernate.cache.EhCacheProvider org.hibernate.cache.EhCacheProvider
***************一定要在实体类中标示hibernate缓存的注解*****
缓存算法: LRU(least recently Used) LFU(least frequently used) FIFO(frist in frist out)

分布式缓存(修改数据库效率慢取数据库快)

中央缓存从另一个设备去取(效率慢,更新快,而且数据库很准确)
缓存数据库条件(1,读取数据库大于修改2,数据库量不能太大3,对数据库要有独享的控制权4,可以出现重复数据库)

事物控制在业务逻辑做处理
threadlocal 放在这面的数据,在通一个线成内可以使用(处理同一块数据)
opsessionview 事物问题,懒加载问题
事物(A C I D):原子性,一致性,隔离性,持久性
方式:丢失更新数据(lost update),脏读(dirty read),不能重复读,第二类不可更新,幻读(插入删除操作)
解决以上事物问题设置hibernate事物级别:hibernate.connection.isolation=2

threadload在 map (key)通过key 取到value
实现threadload 用filter过滤器rasaction
在过滤器中(doFilter)
session s=hibernate.getthreadLoad();
transacation tx;
tx=s.beginTrasacation();
pramas.doFilter();
tx.commit();

hibernate 实现乐观锁(lockMode.upgrate),用version或者时间濯(timestanp(限制为日期类型))
悲观锁是由数据库实现

struts2



 掌握session的生命周期(超时的概念)
  a) Tomcat的session默认为30分钟,我们可以自己在web.xml文件中配置
  默认情况下访问jsp自动创建session(是由jsp中page中的session属性决定的),对于每一个用户来说只创建一次
  jsp的调用过程

struts Annotaion在struts2.x.x才引入
jar包
struts-Convention-plugin-2.1.6.jar
struts2-config-browser-plugin-2.1.6.jar 在运行时查看应用配置的简单工具. 在调试一些和配置相关的问题时, 非常有用(http://localhost:8080/XXXXX/config-browser/index.action.)

1,struts2.x Annotaion实现无配置的操作
2,@Action("url") @Actions({@Action("url"),@Action("url")})
3,Convention通过如下规则确定URL的具体资源部分:去掉类名的Action部分。
然后将将每个分部的首字母转为小写,用’-’分割,设置struts.convention.action.name.separator

struts1和struts2区别

  1. 在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;
    Struts 1的一个具体问题是使用抽象类编程而不是接口。
    Struts 2 Action类可以实现一个Action接口,也可以实现其他接口
    ,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。
    即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts 2的Action。

  2. 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的
    ,因为仅有Action的一个实例来处理所有的请求。
    单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。
    Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。

  3. Servlet依赖方面的对比:Struts 1 Action依赖于Servlet API,
    因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
    Struts 2 Action不再依赖于Servlet API,从而允许Action脱离Web容器运行,
    从而降低了测试Action的难度。 当然,如果Action需要直接访问HttpServletRequest和HttpServletResponse参数,
    Struts 2 Action仍然可以访问它们。但是,大部分时候,Action都无需直接访问HttpServetRequest
    和HttpServletResponse,从而给开发者更多灵活的选择。

  4. 类型转换的对比:Struts 1 ActionForm 属性通常都是String类型。
    Struts 1使用Commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;
    Struts 2使用OGNL(Object-Graph Navigation Language)进行类型转换,支持基本数据类型和常用对象之间的转换。

struts2 action (1)继承action(2)继承actionSupport 一定要遵守<约定优于配置>的原则 struts2属于单线程

1,namespace

2,struts2 DMI 动态方法调用 配置
(DMI)动态方法调用:
1,配置参数使之支持动态方法调用

2,action的请求方式 actionName!methodName

通配符的配置(和{})决定 url:http://localhost:8080/HelloWord010/jack/indexmyJsp
例如:


/MyJsp.jsp

struts2参数调用:url:http://localhost:8080/HelloWord010/jack/indexmyJsp?name=jack2&age=120
在相应的action中对url参数进行set get 封装 调用的是相应的封装方法

Struts2_用DomainModel接收参数 [vo-view object do-data object dto data transefer object]

struts2 中文乱码问题:在web.xml 中:过滤标签2.1.6会出现乱码,用2.0不会[org.apache.struts2.dispatcher.FilterDispatcher]

struts2:访问web元素:继承actionsupport,实现 RequestAware,SessionAware,ApplicationAware

struts2:配置文件的模块嵌套[ ]

struts2:指定默认的action的xml配置文件:

stuts2:结果集:返回类型


index.jsp

设置全局的result

Dynamic Results 在 Result Types文档

package相互继承

ognl:在jsp中使用ognl时使用model的值,一是actioncontext 通过容器帮你创建构造对象,前提是model中必须有一个空的默认的构造对象
二是:在action中创建model的构造函数

通过ognl访问类的静态方法:需要在struts.xml中配置:
@+包名+类名+@+静态方法名

struts-tags :set [id,name已经废弃]

default-action-ref name=""

struts声明式异常处理 默认处理的类 actionSupport

i18n 级别 action->pakage->application

使用token避免重复提交
ServletConfigInteceptor实现注入inteceptor

数据转换
局部转换:action-conversion.properties
全局转换:xwork-conversion.properties
annotation转换

Spring

ioc inversion of control
di dependency injection

bean生命范围 默认是singleton prototype request session globalSession

自动装配集合 (spring默认是按名称装配)

@AutoWrited(类型装配) 名称 和 类型 可以设置为全局的

@Resource(名称装配)-》类型装配

@AutoWrited(required==true)@Qualifier(name)如果匹配不上会包not find AotuWrited's name

@AutoWrited(required==false)@Qualifier(name)如果匹配不上会包 return null,nullPointerException

component:组件装配

Spring的AOP->proxy技术【在处理业务时,判断用户权限,更具权限处理业务方法】

代理对象【静态代理(企业很少用)】【动态代理】

在java中如果不用spring的AOP而去实现动态代理需要用Proxy类去实现

spring AOP

配置过程:
bean.xml 三个AOP命名空间
在切面类 声明一个切入点(它无任何操作)
前置通知->最终通知->后置通知->例外通知->环绕通知

Struts

web上传文件概述
通过web上传大数据文件并不理想,一般性的网站上传大数据文件是安装了通过socket编程的插件安装在浏览器中
找到服务器端口将二进制数据写入指定文件夹中

ibatis

ibatis的一些优点

  1. ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大便
    利。

  2. ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了Java数
    据库编程的重复工作。

  3. 简单易于学习,易于使用, 非常实用。

  4. 因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。

  5. 阿里巴巴、慧点科技等多家知名软件公司都使用Ibatis。

oracle

在查看
select * from role_sys_privs where role='CONNECT';时要以sysdba身份登录

数据库字典用来查询oralce系统级别的信息

动态视图和数据字典不同是他是活动信息

数据字典:数据库系统级别的信息和动态性能的视图来组成的
作用:帮助我们查询我们获取系统级别的信息

数据字典包括三个方面:user_xx->all_xx->dba_xxx

select * from user_tables->用于显示当前用户所拥有的表

all_tables :用于当前用户所访问的所有的表

dba_tables :要求用户必须有dba的权限和select any table的系统权限,查询方案所拥有的数据库表饿信息
dba_users:显示所有数据库用户的详细信息
dba_sys_privs:显示用户所具有的权限
dba_tab_privs:显示用户具有的对象权限
dba_role_privs:显示用户所具有的角色
dba_col_privs:显示用户具有的列权限

查询一个角色包含的系统权限:select count() from system_privilege_map order by name;
查询oracle所有的对象权限:select distinct privilege from dba_tab_privs
查询oracle有多少种角色:select count(
) from dab_roles

权限分为:系统,对象

查看某个角色包含哪些系统权限
select * from dba_sys_privs where grantee='DBA'

三种验证机制:操作系统验证,密码文件验证,数据库验证

如果数据库sys密码丢掉的处理过程:
先删除PWDorcl.ora这个文件
C:\oracle\product\10.2.0\db_1\database\PWDorcl.ora
force 文件是否覆盖(y/n)
users=10,允许使用这个账户的用户数量
在Dos中输入:orapwd file=C:\oracle\product\10.2.0\db_1\database\PWDorcl.ora password=sys entries=10;
查询用户:select * from v$pwfile_users;

你可能感兴趣的:(Hibernate3.1.1+Struts2.0+Spring3.0+ibatis)