零零碎碎整理了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:
-
load()方法从来就是假定数据在数据库中是存在的,在使用时如果不存在则会抛出ObjectNotFoundException;而get()方法不会假定数据在数据库中存在,如果不存在则返回null
-
load()方法返回的是实体类的代理类,因此load()可以使用延迟加载策略来加载对象
get()方法返回的不一定是实体类,可能是代理类,因为get()方法如果在session缓存(一级缓存)中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。 -
load()方法查询数据时会先从session缓存(一级缓存)中查找,如果没有找到则会创建代理类,该代理类仅仅初始化了OID属性,当第一次访问其他属性值时,则会依次从二级缓存-->数据库查找,直到找到数据,最后将所有属性值赋给代理类。而get()方法则会直接按照一级缓存-->二级缓存-->数据库的顺序查找。
-
也许别人把数据库中的数据修改了,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区别
-
在Action实现类方面的对比:Struts 1要求Action类继承一个抽象基类;
Struts 1的一个具体问题是使用抽象类编程而不是接口。
Struts 2 Action类可以实现一个Action接口,也可以实现其他接口
,使可选和定制的服务成为可能。Struts 2提供一个ActionSupport基类去实现常用的接口。
即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts 2的Action。 -
线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的
,因为仅有Action的一个实例来处理所有的请求。
单例策略限制了Struts 1 Action能做的事,并且要在开发时特别小心。
Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。 -
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,从而给开发者更多灵活的选择。 -
类型转换的对比: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的一些优点
-
ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大便
利。 -
ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了Java数
据库编程的重复工作。 -
简单易于学习,易于使用, 非常实用。
-
因为Ibatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。
-
阿里巴巴、慧点科技等多家知名软件公司都使用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;
网友评论