本帖最后由 朱龙华 于 2017-12-14 08:19 编辑
16.hibernate工作原理1、通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件。
2、由hibernate.cfg.xml中的<mapping resource="xx/xx/xxx.hbm.xml"/>读取解析映射信息。
3、通过config.buildSessionFactory();//得到sessionFactory。
4、sessionFactory.openSession();//得到session。
5、session.beginTransaction();//开启事务。
6、persistent operate;
7、session.getTransaction().commit();//提交事务
8、关闭session;
9、关闭sessionFactory;
17.hibernate中get/load区别get和load方法相同点是都可以从缓存乃至数据库中查询数据,但是查询的机制完全不同
1. get方法会先通过serializable序列化id从一级缓存(session级缓存)和二级缓存(内存和磁盘)中查找,如果查找不到,会直接用sql去数据库查找需要的对象,查询不到返回null
2. Load方法采用延迟加载机制,它不会直接查询数据库,他会在内存中查找只包含id信息的ciglib代理对象信息,如果存在就返回该代理对象,如果不存在就创建一个代理对象返回,只有当程序中调用查询对象的非id属性时,它才会通过session查询数据库
18.hibernate缓存面试:hibernate缓存分几级?有什么好处?
一级别缓存和二级缓存。(下面的笔记会介绍一级缓存和二级缓存)
缓存的机制就是为了减少对数据库查询的频繁访问。
又问:为什么要减少对数据库的访问
这个得从数据库底层说起,高访问的代码会造成数据库性能降低,其实我们常用得关系型数据库他是有自己运行的逻辑,当我们从java程序收到sql语句的时候他不会直接执行这条语句,而是经过编译,执行,缓存,写出这四步操作,
总的来说,数据库性能优化分为两大块,一是数据库与java的读写过程优化,另一个是数据库内部优化。
那么读写过程优化hibernate已经做了一级缓存机制来实现,他把查询到数据存储到session缓存中,在同一个事务中再次查询就不会走数据库,也就在事务级别的代码上减少了与数据库之间读写的次数,直接从缓存中查数据的效率肯定比多次查数据库要快的多,这是我们数据库优化的第一项。
其次第二项,就是数据库内部的优化,我们正常执行sql,在这几步操作中绝大多数时间是用来编译sql,编译完了才会去执行sql,执行了sql后会把结果存储到我们数据库的缓存中,缓存完了最后一步才将数据写出给java。对于程序员来说,这四步操作其实都可以优化,但是缓存机制和写出数据这两步都是数据库底层写好得,他已经做得很好了,我们需要做得就是对编译和执行进行优化,编译优化的方式其实就是存储过程,我们可以直接在数据库中写好数据库执行代码,也就是存储过程,在java中只需要调用存储过程,这样可以大大提高数据库效率,然后就是执行优化,通常的说就是sql优化,同样的需求可以有很多种sql实现,我们平时在写代码的时候需要尽量考虑sql语句的性能,比如查询所有我们都不会用select *,而是用select 各个字段名,因为*的效率没有查字段高,还比如条件查询我们很少用in,因为in这个关键字需要检索整个in里面的内容,等等等等。
综上所述,对数据库访问的次数越少越好,所以,数据库底层有了缓存机制,hibernate框架给我们提供了session缓存,这都是为了减少高访问量所造成数据库性能降低所带来的问题。
19.cascade和inverce有什么区别?cascade是用来级联的,我们可以用他来进行级联添加,修改等操作。
inverce是在双向关联中,用来指定哪一方维护外键的。
单项关联中,只用配置cascade属性,双向关联中,只要配置inverse属性
20.检索方式Hibernate中常用的检索方式有哪几种?
1. 通过OID来查询
利用get/load等方式,通过oid来进行查询
2. 导航对象图检索方式
从数据库中查询到数据之后,通过该对象查询到其对应的属性
Customer c = session.get(Customer.class,1);
C.getOrders().get(1); //这就是导航对象图
3. HQL
通过hibernate提供的面向对象的语言查询
4. QBC
Query by Criteria 通过一种更加面向对象的方式进行查询
5. 本地SQL检索
21.Spring中IOC与DI区别
他们在本质上没有任何区别
IOC(控制反转)是将创建对象的权利反转给Spring
DI(依赖注入)将我们需要的依赖对象注入给bean组件
在spring创始者的文章中提到,IOC和DI其实是同一种东西,DI实现了IOC思想,两者没有你我之分
AOP与OOP区别OOP针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分 而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有这本质的差异 换而言之,OOP面向名词领域,AOP面向动词领域
Spring采用哪种动态代理机制如果目标对象有实现接口,优先使用JDK动态代理
如果目标对象没有实现接口,使用cglib动态代理
JDK动态代理和CGLIB动态代理对象之间的区别目标对象和jdk代理对象是兄弟关系(Proxy InvocationHandler)
cglib代理对象和目标对象是父子关系(Enhancer MethodInterceptor)
差不多先说到这吧,每一个问题下都可以关联产生很多问题,具体的这些知识只是一些基础的模板式回答,重要的是它会问你如何运用,这个就看你对技术的理解了,还有,上面说的大部分是理论,实际运用性的问题,自己多想想,好了,不说了,明天还上课。
睡觉,晚安。
|