A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈文老师 于 2017-11-22 11:20 编辑

要毕业了?要找工作啦?开不开心?紧不紧张?回首黑马这半年,感觉自己是不是被自己的努力所感动,然而仔细想想学了很多,马上要出去找工作了却脑子一片空白。重庆JavaEE就业2期龙师兄毕业后在寝室闭关修炼半个月(当然不建议大家这样做,一定要趁着你刚毕业,什么都知道赶紧出去找工作,越到后面越忘得多)个人总结了咱们6个月以来所学的一些基础框架和淘淘项目的一些核心技能点,要复习的,赶紧看看吧!但是答应我,看完后赶紧出去面试哟~~~不要怂,就是干!!!


【基础框架篇】-【Hibernate
1    Hibernate
1.1      什么是hibernate?
1.    Hibernate是一个开源的对象关系映射框架,它对jdbc进行了非常轻量级的对象封装,它将破基于数据库建立映射关系,是一个全自动orm框架,hibernate开源自动生成sql语句,自动执行,使得java程序员开源随心所欲的使用面向对象思维来操作数据库,
2.    Hibernate中常用api
a)      Configuration,它主要是用于加载hibernate配置
b)      SessionFactory,sessionFactory接口负责初始化hibernate,它充当数据存储源的代理,并负责创建session对象,一般情况下一个项目只有一个sessionFactory就够,
c)       Session,session接口负责执行被持久化对象的crud操作,但是需要注意session对象时线程不安全的。一般在方法内部使用session,获取session的方法:
A.    SessionFactory.openSession();相当于直接通过sessionFactory创建一个新的session,使用完成后需要手动关闭
B.    SessionFactory.getCurrentSession(),获取一个与当前线程绑定的session,当我们提交或者事务回滚后会自动关闭。
d)      Transaction,主要用于管理事务,它是hibernate的事务接口,对底层的事务进行了封装,其中的事务操作有:
A.    Commit事务提交
B.    Rollback事务回滚
C.    获取transaction:session.beginTransaction()
D.   程序中没有开启事务也是存在事务的,session的每一个操作就会开启一个事务,默认情况下事务是不自动提交,可以配置自动提交<property name =”hibernate.connection.autocommit”>true</>
e)      Query,它作用是让你方便对数据库及持久化对象进行查询,它可以有两种表达方式:
A.    Hql
B.    Sql
f)       SQLQuery,想要执行本地sql,session.createSqlQuery(String sql),使用addEntity()方法来将结果封装到指定的对象中,吴国不封装得到的是一个list<>集合,如果sql中有参数,我们使用setParamerter()方法完成参数传递
g)      Criteria,Criteria接口与query接口非常类似,允许创建并执行面向对象的标准化查询,Criteria是一个轻量级的,它不能在session之外使用。通过session.createCriteria()获取criteria。
3.    Hibernate持久化对象是那种状态
a)      瞬时态:它一般指我们new出来的对象,它不存在oid,与session无关联,在数据库中无记录,它使用完成后就会被jvm统一回收,它只是用于信息携带
b)      持久态:在session管理范围内,它具有持久化标识oid它的特点,在事务未提交之间一直保持持久太,当它发生 改变时,hibernate时可以检测到的
c)       托管态:它是指持久态对象失去了与session的关联,托管态对象存在oid,在数据库中有可能存在,也有可能不存在。它发生改变,hibernate检测不到。
4.    Hibernate的一级缓存(session缓存)
a)      存在的目的是为了减少对数据库的访问
b)      ActionQueue是一个行列队列,它主要记录crud操作的相关信息
c)       PersistenceContext是持久化上下文,它其实是真正的缓存。
d)      一级缓存的特点:
A.    当我们通过session的save,update,saveOrUpdate进行操作时,如果一级缓存中没有对象,会将这些对象从数据库中查询到,存储在一级缓存中
B.    当我们通过session的load,get,query的list等方法进行操作时,会先判断一级缓存中是否存在,如果没有才会从数据库获取,并且将查询的数据存储到一级缓存中
C.    当调用session的close方法时,session缓存清空
5.    Hibernate的二级缓存(sessionFactory级别的缓存)
6.    Hibernate关联映射-数据对象三种关系
a)      一对一
A.    唯一外键对应:在任意一方添加外键来描述对应关系
B.    主键对应:一方的主键作为另一方的主键
b)      多对一:建表原则,在多的一方添加外键来描述关联关系
c)       多对多:建表原则,通过一张中间表来描述对应关系
7.    检索策略
a)      延迟加载:是hibernate为提高程序执行的效率而提供的一种机制,即只有真正使用该对象的数据时才会创建
A.    Load方法采用的策略延迟加载
B.    Get方法采用的策略立即加载
b)      检索策略分为两种
A.    类级别检索
                                                 i.      类级别检索是通过session直接检索某一类对应的数据,如:XXX xxx=session.load(xxx.class,1);session.createQuery(“from Order”)
                                               ii.      类级别检索策略分为立即检索和延迟检索,默认是延迟检索,类级别的检索策略可以通过<class>元素的lazy属性来设置,默认为true,即在hbm配置文件中设置: 在类中使用注解@Proxy(lazy=true),如果配置为false时,代表类级别检索页使用立即检索,赭石load和get就一样了。
B.    关联级别检索
                                                 i.      查询到某个对象,获得其关联的对象或属性,这种称为关联级别检索,如:xxx.getX().size()
C.    配置文件抓取策略:指的是查询到某个对象后,通过这个对象去查询关联对象的信息时的一种策略。
                                                 i.      一对一、一对多、多对多分别在<set>元素下设置他们的属性fetch、lazy。Fetch主要描述的是sql语句的格式(子查询、多表联合查询等),Lazy用于控制语句何时发送。如:<set fetch=”” lazy=””>或者<many-to-onefetch=”” lazy=””>
D.   注解抓取策略
                                                 i.      在<set>里设置的fetch和lazy可以使用@Fetch(FetchMode.SUBSELECT)和@LazyCollection(LazyCollectionOption.EXTRA)注解实现
                                               ii.      在<many-to-one>或者<one-to-many>中设置的fetch和lazy可以使用注解@Fetch(FetchMode.SELECT)和@LazyToOne(LazyToOneOption.FALSE)
                                              iii.      Fetch的取值有,SELECT(多条简单的sql)默认值,JOIN采用迫切左外连接,SUBSELECT将产生子查询的sql
                                              iv.      Lazy的取值有:TRUE延迟检索,FALSE立即检索,EXTRA加强延迟检索(及其懒惰)。
E.    批量抓取
                                                 i.      可以在配置文件中batch-size属性来设置
                                               ii.      可以使用注解@BatchSize(size=x)
                                              iii.      可以采用批量抓取解决N+1问题
1.2      为什么使用hibernate?
1.    Hibernate 对jdbc访问数据库的代码做了封装,大大简化了库访问层繁琐的重复性代码
2.    Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作
3.    Hql优化
a)      使用参数绑定:使用绑定参数的原因是让数据库一次解析sql,对后续的重复请求可以使用生成号的执行计划,这样节省cpu时间和内存,也避免了sql注入
b)      尽量少全长not:如果where子句包含not关键字,name执行该字段的索引失效
c)       尽量使用where来替换having:having在检索出所有记录后才对结果集进行过滤,这个处理需要一定的开销,而where子句限制记录的数目,能减少这方面的开销
d)      减少对表的查询:在含有子查询的hql中,尽量减少对表的查询,降低开销
e)      使用表的别名:当在hql语句中连接多个表时,使用别名,提高程序阅读性,并把别名前缀与每个列上,这样可以减少解析时间并减少列歧义引起的语法错误
f)       实体的更行与删除:在hibernate3以后支持hql的update和delete操作
1.3      怎么使用hibernate?
1.    Hibernate的hbm.xml配置:主要用于描述实体类和数据库表之间的映射关系
a)      位置:加载时需要许实体类在同一个目录下,所以可以将其放在实体类的包中,也可以放在maven管理下的resource目录下与实体类包一直的目录下
b)      <hibernate-mapping package=”实体类包名”>:统一声明包名,这样在<class>下就不用写类的全限定名了
c)       <class name=”实体类” table=“表名” catalog=“数据库名”>:name属性:类的全名称,table表的名字,catalog数据库名称
d)      <id name=”对象主键名” column=“数据表中主键名” ,length=“”“”,type=“类型”><generator class=”生成策略” >,必须存在,
e)      <property name=”普通属性名” column=“数据库对应的字段名” length=“长度”>它描述类中属性与表中非主键的映射关系
f)       Hbm映射文件编写

A.

B.     

C.    级联操作:
D.   双向关联维护:我们发中要配置双向关联配置,通过任意一方来操作对方;在代码中,尽量要进行单项关联,这样可以尽量减少资源浪费;在双向关联中,会存在多余的update语句;使用inverse属性来设置,双向关联时由哪一方来维护表与表之间的关系
inverse为true表示由对方来维护外键,false表示自己来维护外键
E.    级联删除,为了维护数据的完整性
g)      hibernate注解开发
A.    @Entity声明一个实体
B.    @Table来描述与表对应
C.    @Id来声明一个逐渐
D.   @GenerateValue用它声明一个逐渐生成策略
E.    @Column来定义列
F.     @Temoral声明时间类型
G.    @OneToMany(targetEntity=xxx.class,mappedBy=”yyy”)mappedBy表示由对方来维护外键,
H.   @ManyToOne(targetEntity=xxx.class),
I.      @JionColumn(name=”xxx”)指定外键列
J.     一下表述以uuid的方式生成主键,表示外键由对方来维护
2.    Hibernate的核心配置文件:它主要是hibernate框架所使用的,它主要包含了连接出具库相关信息,hibernate相关配置等
a)      位置:在src下创建一个hibernate.cfg.xml
b)      cfg.xml配置
A.    <hibernate-configuration>
B.    <session-factory>, session工厂
C.    <property>,可以用它配置关于数据库的四项,driverClass、url、username、password。也可以用于配操作置数据库的设置,如:显示sql,格式化sql,hibernate的方言等
D.   <mapping resource=“映射文件位置”>,用于指定对象关系映射文件的位置
c)        
3.    Hibernate工作原理
a)      通过configuration().configure():读取并解析,hibernate.cfg.xml配置文件
b)      由hibernate.cfg.xml中的<mapping resource=””>读取解析映射信息
c)       通过config.buildSourceFactory();得到sessionFactory
d)      SessionFactroy.openSession()得到session
e)      Session.beginTransaction(),开启事务
f)       Persistent operate
g)      Session.getTransaction().commit()提交事务
4.    Hibernate中session管理
a)      Session对象的生命周期与本地线程绑定
A.    需要在cfg.xml配置文件中配置<property name=”hibernate.current_session_context_class”>thread</>,获取session时是调用getCurrentSession()方法获取。
b)      Session对象的生命周期与jta事务绑定(分布式事务管理)
c)       Hibernate委托程序来管理session的生命周期

3 个回复

倒序浏览
很详细全面,谢谢老师,收藏了
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
客气呢~~~~~
回复 使用道具 举报
很详细很全面,谢谢老师,收藏了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马