黑马程序员技术交流社区
标题: 【石家庄校区】Struts2到hibernate课上笔记 [打印本页]
作者: 后街姚姑娘 时间: 2018-6-27 16:07
标题: 【石家庄校区】Struts2到hibernate课上笔记
一.框架概述框架(framework)是一个基本概念上的结构,用于去解决或者处理复杂的问题
二,开发中常用的框架
SSH (SSM SSI)
SSH struts2 spring hibernate
SSM(SSI) springmvc spring mybatis(ibatis)
SSH 它是企业开发中比较主流的一套架构。
SSH框架在开发中所处的位置:
三 struts.xml的配置
action配置1. name属性 作用:定义一个包的名称,它必须唯一。
2.namespace属性 作用:主要是与action标签的name属性联合使用来确定一个action 的访问路径
3.extends属性 作用:指定继承自哪个包。一般值是strtus-default
strtus-default包是在strtus-default.xml文件中声明的。
abstract属性 它代表当前包是一个抽象的,主要是用于被继承
action配置name属性 作用:主要是与package的namespace联合使用来确定一个action的访问路 径
1.class属性 作用:用于指示当前的action类
2.method属性 作用:用于指示当前的action类中的哪个方法执行
result配置它主要是用于指示结果视图
1.name属性 作用是与action类的method方法的返回值进行匹配,来确定跳转路径
2.type属性 作用是用于指定跳转方式
OGNL表达式OGNL是Object-Graph Navigation Language(对象图导航语言)
的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性 Strtus2框架中如何使用ognl表达式在struts2框架中我们使用ognl表达式的作用是从valueStack中获取数据。
我们在struts2框架中可以使用ognl+valueStack达到在页面(jsp)上来获取相关的数据。
要想在jsp页面上使用ognl表达式,就需要结合struts2框架的标签
<s:property value=”表达式”>来使用
valueStack介绍我们使用valueStack的主要目的是为我将我们action中产生的数据携带到页面上,也就是说valueStack它就是一个容器
ActionContext是什么ActionContext它是action上下文,strtus2框架它使用actionContext来保存Action在执行过程中所需要的一些对象
action
struts2引入步骤
a)导入jar
b)在web.xml配置过滤器(非常重要/复制粘贴)
c)配置struts.xml(struts2核心配置文件)
d)在action中写逻辑
jsp 和StrutsAction的关系
jsp:一个连接 url
StrutsAction:定义一个方法
约束
dtd约束
schema约束
区别
1. .dtd /.xsd
2. schema约束支持命名空间(名称空间)
5.流程:(面试)
1.前端页面发起请求
2.struts2的过滤器
一堆拦截器
3.struts.xml---->找到类的具体方法
4.获取方法的返回值--->struts.xml中的具体action--->result(决定页面的跳转)
6.struts2配置文件加载顺序(面试)
1.default.properties(常量)
2.struts-default.xml(默认配置)
3.struts-plugin(struts插件的配置)
4.struts.xml(自定义配置)
Struts文件上传
文件上传介绍浏览器端注意事项:
表单提交方式method=post
表单中必须有一个<input type=”file”>组件
表单中必须设置enctype=”multipart/form-data”
服务器端
Commons-fileupoad.jar包完成。
Struts2框架本身支持文件上传
Struts2框架可以使用HttpServletResponse来处理ajax请求
Strtus2y用json的插件来完成ajax操作
***注解开发
注解必须要单独导入一个jar包
@Namespace来代替<package namespace=””>
@ParentPackage来代替<package extends=””>
@Action来描述关于<action>配置
value属性<action name=””>
使用@Action的results来描述关于结果类型的配置<result>
<result name=”” type=””>
@Action(results={@Result(name=””,type=””,location=””)})
可以通过多个映射访问同一个action
Hibernate什么是hibernateHibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用
为什么使用hibernate框架n Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
n Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作
创建映射文件映射配置文件主要是用于描述实体类与数据表之间的映射关系。
位置:要与实体类在同一个包下.
名称:类名.hbm.xml
约束:hibernate核心jar包下的org.hibernate包下hibernate-mapping-3.0.dtd文件中查找
配置可以参考 hibernate-release-5.0.7.Final\project\etc\hibernate.properties文件
Hibernate 核心组件
在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层。
它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(***.hbm.xml)把JAVA对象或PO(Persistent Object,持久化对象)映射到数据库中的数据库,然后通过操作PO,对数据表中的数据进行增,删,改,查等操作。
Hibernate核心组件:
Configuration类: 用来读取Hibernate配置文件,并产生SessionFactory对象
SessionFactory接口: 产生Session实例工厂
Session接口: 用来操作PO,它有get(),load(),save(事务提交),update(),delete()等方法来对Po进行加载,保存,更新,删除等操作,是Hibernate的核心接口。
Query接口:用来对PO进行查询操作,它可以从Session的 createQuery()方法生成
Transaction接口: 用来管理Hibernate事务,它主要方法有commit()和rollback(),可以从Session的beginTrancation()方法生成。
Persistent Object
持久化对象可以是普通的Javabean,唯一特殊的是它们与(仅一个)Session相关联。JavaBeans在Hibernate中存在三种状态:
1. 临时状态(transient):当一个JavaBean对象在内存中孤立存在,不与数据库中的数据有任何关联时,那么这个Javabeans对象就称为临时对象(Transient Object)
2. 持久化状态(persistent):当一个JavaBean对象与一个Session相关联时,就变成持久化对象(Persistent Object)
3. 托管状态(detached): 在这个Session被关闭的同时,这个对象也会脱离持久化状态,就变成托管状态(Detached Object),可以被应用程序的任何自由层使用,列入可以做与表示层 打交道的据舆对象(Data Transfer Object)。
Hibernate的运行过程
A:应用程序先调用Configeration类,该类读取Hibernate的配置文件及映射文件中的信息,并用这些信息生成一个SessionFactpy对象
B:然后从SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象;可通过Session对象的get(),load()
Save(),update(),delete()和saveQrUpdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可以通过Session对象生成一个Query对象,然后利用Query对象执行查询操作,如果没有异常,Transaction对象将提交这些操作结果到数据库中
流程:
应用程序
配置文件
Hibernate.cfg.xml Configration
SessionFactory
映射文件 查询
Xxx.hbm.xml Session ——> Query
异常 正常
回滚<———— Transaction ————>提交数据库
持久化类设计:
持久化类通常建议有一个持久化标识符(ID)
持久化标识符通常建议使用封装类(基本类型有默认值)
持久化类通常建议手动给定一个无参数的构造器(因为有一些操作,是反射进行的)
属性通常建议提供getting、setting方法
持久化类不能是final
持久化类中如果使用了集合类型属性,只能使用接口类型进行声明(List,Set,Map)
注解开发:
PO类注解开发
@Entity 定义了一个实体
@Table (name=“表名”)
@ID 定义主键
@GeneratedValue(strategy=GenerationType.IDENTITY) 相当于主键生成策略
@Column(name=“表名”,length=“默认长度255,占用空间大建议修改” nullable=true/false(是否为空))
@Temporal(TemporalType.TIMESTAMP 包含年月日时分秒 ) 定义日期类型
@Type() 不用写也可以,允许制定HiBernate里面的一些类型,类型格 式必须是和类型表一致
然后在配置文件 HIBERNATE.CFG.XML中 配置
<mapping class=“类的全路径”>
主键生成策略 UUID类型
@GenericGenerator(name=“myuuid”,strategy=“uuid”)
@GeneratedValue(generator=“myuuid”)
Hibernate检索方式概述Hibernate提供以下几种检索对象方式:
1导航对象图检索方式,根据已加载的对象导航到其它对象
2.OID检索方式,按照对象的OID来检索对象
3.HQL检索方式,使用面向对象的HQL查询语言
4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口
5.本地SQL检索方式,使用本地数据库的SQL查询语句
多表操作 迫切内连接
迫切内连接得到的结果是直接封装到PO类中,而内连接得到的是Object[]数组,数组中封装的是PO类对象
Hibernate事务管理事务就是逻辑上的一组操作,组成这组操作的各个单元要么全部成功,要么全都失败
Hibernate事务的四个特性原子性:不可分割
一致性:事务在执行前后,要保证数据的一致。
隔离性:一个事务在执行的过程中,不应该受到其它事务的干扰。
持久性:事务一旦结束,数据持久化到数据库。
READ_UNCOMMITED 读取未提交,它引发所有的隔离问题
READ_COMMITTED 读已提交,阻止脏读,可能发生不可重复读与虚读.
REPEATABLE_READ 重复读 阻止脏读,不可重复读 可能发生虚读
SERIALIZABLE 串行化 解决所有问题 不允许两个事务,同时操作一个目标数据。(效率低下)
ORACLE 默认的是事务隔离级别 READ_COMMITTED
MYSQL 默认的事务隔离级别 REPEATABLE_READ
Hibernate中session管理 Hibernate提供了三种管理session的方式:
1. Session对象的生命周期与本地线程绑定(ThreadLocal)
2. Session对象的生命周期与JTA事务绑定(分布式事务管理)
3. Hibernate委托程序来管理Session的生命周期
Hiberante优化方案HQL优化1.使用参数绑定 1.使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用用生成好的执行计划,这样做节省CPU时间和内存。
2.避免SQL注入
2.尽量少全长NOT 如果where子句中包含not关键字,那么执行时该字段的索引失效。
3.尽量使用where来替换havingHaving在检索出所有记录后才对结果集进行过滤,这个处理需要一定的开销,而where子句限制记录的数目,能减少这方面的开销
4.减少对表的查询 在含有子查询的HQL中,尽量减少对表的查询,降低开销
5.使用表的别名当在HQL语句中连接多个表时,使用别名,提高程序阅读性,并把别名前缀与每个列上,这样一来,可以减少解析时间并减少列歧义引起的语法错误。
6.实体的更新与删除 在hibernate3以后支持hql的update与delete操作
延迟加载延迟加载 是hibernate为提高程序执行的效率而提供的一种机制,即只有真正使用该对象的数据时才会创建。
load方法采用的策略延迟加载.
get方法采用的策略立即加载。
set上的fetch与lazyset上的fetch与lazy它主要是用于设置关联的集合信息的抓取策略。
Fetch可取值有:
1. SELECT 多条简单的sql (默认值)
2. JOIN 采用迫切左外连接
3. SUBSELECT 将生成子查询的SQL
lazy可取值有:
1. TURE 延迟检索 (默认值)
2. FALSE 立即检索
3. EXTRA 加强延迟检索(及其懒惰)
这两个一共有7种组合方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |