美文网首页
Hibernate3.1.1+Struts2.0+Spring3

Hibernate3.1.1+Struts2.0+Spring3

作者: 一眼万年的星空 | 来源:发表于2021-12-29 15:28 被阅读0次

    零零碎碎整理了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配置:<property name="hbm2ddl">create||update||validate||create-drop</property>
    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 <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    ***************一定要在实体类中标示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


    <constant name="struts.devMode" value="true" />
     掌握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

    <constant name="struts.convention.action.name.separator" value="-" />

    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,配置参数使之支持动态方法调用
    <constant name="struts.enable.DaynamicMethodInvocation" value="true"></constant>
    2,action的请求方式 actionName!methodName

    通配符的配置(和{})决定 url:http://localhost:8080/HelloWord010/jack/indexmyJsp
    例如:
    <package name="jack" namespace="/jack" extends="struts-default">
    <action name="index
    " class="com.jack.strutsAction.IndexAction" method="{1}">
    <result name="success">/MyJsp.jsp</result>
    </action>
    </package>

    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:配置文件的模块嵌套[ <include file=""></include>]

    struts2:指定默认的action的xml配置文件:<default-action-ref name=""></default-action-ref>

    stuts2:结果集:返回类型<result type="dispatcher(转发)|redirect(重定向)|chain(转发到action)|redirectAction(重定向到action)"></result>

    <global-results>
    <result name="success">index.jsp</result>
    </global-results>
    设置全局的result

    Dynamic Results 在 Result Types文档

    package相互继承

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

    通过ognl访问类的静态方法:需要在struts.xml中配置: <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
    @+包名+类名+@+静态方法名

    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生命范围 <bean scope/> 默认是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

          本文链接:https://www.haomeiwen.com/subject/nmivqrtx.html