• hibernate面试点


    1.谈谈你对hibernate的认识和理解

      01.全自动的ORM框架

      02.子项目

      03.面向对象的思想来解决操作数据库

      

    01.hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得程序员可以按照面向对象的思想来操控数据库中的数据
    
      02.hibernate的核心接口有Configuration、SessionFactory、Session、Transaction、Query、首先由Configuration获取配置信息并做一切初始化的工作,接着通过SessionFactory创建SessionFactory,再通过SessionFactory创建Session,然后程序就可以使用Session完成增删改查操作,如果需要使用复杂一点的查询功能,则可以通过Session获取Query
    
      03.hibernate的实体存在着,瞬时状态,持久状态,托管状态,(用new创建的实体对象属于瞬时状态,一般通过save()方法,saveOrUpdate()等方法转换成持久状态,而托管状态则通过close(),evicrt()等方法转换而成。)
    
      04.hibernate的优缺点有:
    
        001.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
    
        002.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
    
        003.Hibernate使用Java反射机制而不是字节码增强程序来实现透明性。
    
        004.Hibernate的性能好,映射灵活性比较出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
    demo01
    1.面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象、建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一个结果,程序上一个时刻和下一个时刻的运行结果的差异就表现在内存中的对象状态发生了变化。
    
    2.为了在关机和内存空间不够的状况下,保持程序的运行状态,需要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,通常都是保存到关系数据库老保存大量对象信息。从Java程序的运行功能上来讲,保存对象状态的功能相比系统运行的其他功能来说,应该是一个很了不起的附属功能,java采用jdbc来实现这个功能,这个不起眼的功能却要能比系统运行的其他功能来说,应该是一个很不起眼的附属功能,java采用jdbc来实现这个功能,这个不起眼的功能却要编写大量的代码,而做的事情仅仅是保存对象和恢复对象,并且那些大量的jdbc代码并没有什么技术含量,基本上是采用一套例行公事的标准代码模板来编写,是一种苦活和重复性的工作。
    
    3.通过数据库保存java程序运行时产生的对象和恢复对象,其实就是实现了java对象与关系数据库记录的映射关系,称为ORM(即ObjectRelation Mapping),人们可以通过封装JDBC代码来实现这种功能,封装出来的产品称之为ORM框架,Hibernate就是其中的一种流行ORM框架。使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到关系数据库中,仅仅是调用一个get方法,就可以从数据库中加载出一个对象。
    
    4.使用Hivernate的基本流程是:配置Configuration对象、产生SessionFactory、创建session对象,启动事务,完成CRUD操作,提交事务,关闭session。
    
    5.使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中需要登记每个hbm.xml文件。
    
    6.在应用Hibernate时,重点要了解Session的缓存原理,级联,延迟加载和hql查询
    demo02
     说说这类问题一般要和一个东西比较,说说他们的优点和缺点,hibernate就和JDBC比较,说说JDBC的优缺点,说说hibernate的优缺点,最后对比得出hibernate更好。
    
    hiberante:
    
    1.概念:ormapping 对象关系映射
    
      01.操作数据库的框架,底层是通过jdbc操作数据库的
    
      02.用面向对象的方式操作数据库
    
     2.jdbc的缺点
    
      01.代码太繁琐了
    
      02.不是面向对象的数据库操作
    
      03.资源关闭的代码也很繁琐,每次都得打开、关闭
    
      04.没有做到数据缓存
    
      05.移植性比较差
    
      优点
    
      因为是最底层的操作,所以效率比较高
    
    3.hibernate
    
      01.代码比较精简了
    
      02.是面向对象的数据库操作
    
      03.只需要关闭一个对象就可以了session
    
      04.数据缓存,一级缓存,二级缓存,查询缓存
    
      05.移植性比较好
    
      缺点
    
      01.程序员不能控制sql语句的生成,hibernate中有一个hql
    
      02.如果一个项目对sql语句的优化要求特别高,不适合用hibernate
    
      03.如果一张表的数据量特别大,不适合用hibernate
    demo03

    对于查询数据库的sql优化问题,这里有一个面试题,给你一个学生student表,叫你用各种方式查询出指定的学生信息

    --方式一  
    select *  
    from student  
    where id in(2,3,4)  
      
    --方式二  
    select *  
    from student  
    where id =2 or id=3 or id=4  
      
    --方式三  
    select *  
    from student  
    where id between 2 and 4  
      
    --方式四  
    select *  
    from student  
    where id>=2 and id<=4  
      
    --方式五  
    select *  
    from student  
    where id=2  
    union  
    select *  
    from student  
    where id=3  
    union  
    select *  
    from student  
    where id=4  
    这里有五种方式得出指定学生2,3,4的信息
    Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库。
    
    工作原理:
    
      1.读取并解析配置文件
    
      2.读取并解析映射信息,创建SessionFactory
    
      3.打开Session
    
      4.创建事务Transation
    
      5.持久化操作
    
      6.提交事务
    
      7.关闭Session
    
      8.关闭SessionFactory
    
    是用Hibernate的优点有:
    
      1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
    
      2.Hiberante是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
    
      3.Hiberante使用Java反射机制而不是字节码增强程序来实现透明性。
    
      4.Hibernate的性能好,映射的灵活性比较出色 。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
    
    hibarnate的核心类有:
    
    Configuration、SessionFactory、Session
    Demo04
     它是ORM思想的一个实现,对JDBC进行了很好的封装,它通过配置使JavaBean对象和数据库表之间进行映射,并提供对增、删、改、查便利的操作方法,同时支持事务处理,它对数据库记录还提供了缓存机制,提高效率,它可以使程序员不用书写SQL,也不用关心数据库SQL之间的差异,它通过方言对数据库进行了很好的适配。
    
      1.Hibernate的主配置文件为hibernate.cfg.xml,其中定义了数据源、连接池、缓存、事务、表生成策略等配置
    
      2.通过*.hbm.xml映射配置文件,定义了JavaBean对象和数据库表之间的映射关系,还定了对象和对象之间的映射关系,包括:一对一、多对一、一对多、多对多
    
      3.对于复杂查询和修改,Hibernate提供了Query对象进行支持,它可以使用HQL语句处理查询、修改、删除和分页。如果需要处理针对数据库相关的SQL,可以SQLQuery对象处理。
    
      4.Hibernate可以集成到spring中,通过spring进行事务处理,事务的配置通常分两类,一种使AOP方式,一种使注释方式的声明式事务。
    
      5.Hibernate从3版本后,支持JPA规范,可以不使用映射文件配置,而全部采用JPA注解方式进行对象和数据库表的映射,Hibernate还扩容了JPA规范。
    
      6.Hibernate对常用的缓存技术做了封装,可以轻松的调用各种缓存框架。
    Demo05
    一、Hibernate使JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系。Hibernate可以用在任何JDBC可以使用的场合,例如Java应用程序访问代码,DAO接口的实现类,甚至可以使BMP里面的访问数据库的代码。从这个意义上说,Hibernate和EB不是一个范畴的东西,也不存在非此即彼的关系。
    
    二、Hibernate是一个和JDBC密切关联的框架,所以Hiberante的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。
    
    三、Hibernate不能用来直接和Entity Bean做对比,只有放在整个J2EE项目的框架中才能比较。并且及时是放在软件整体框架中来看,Hiberante也是作为JDBC的替代者出现的,而不是Entity Bean的替代者出现的,让我再列一次我已经列n次的框架结构:
    
    传统的架构:
    
      1.Session Bean  <-> Entity Bean <-> DB
    
        为了解决性能障碍的替代架构:
    
      2.Session Bean <-> DAO <-> JDBC <-> DB
    
        使用Hibernate来提高上面架构的开发效率的架构:
    
      3.Session Bean <-> DAO <-> Hibernate <-> DB
    
    
    就上面3个架构来分析:
    
      1、内存消耗:采用JDBC的架构2无疑是最省内存的,Hibernate的架构3次之,EB的架构1最差。
    
      2、运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通JDBC,运用Batch语句,调整PreparedStatement的Batch Size和Fetch Size等参数,以及在必要的情况下采用结果集cache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率。EB的架构效率会差的很远。
    
      3、开发效率:在有JBuilder的支持下以及简单的项目,EB架构开发效率最高,JDBC次之,Hiberante最差。但是在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate效率搞的惊人,JDBC次之,而EB架构很可能会失败
    
      4、分布式,安全检查,集群,负载均衡的支持
    
    由于有S做为Facade,3个架构没有区别
    Demo06

    2.主键生成策略  和  hbm2ddl

     http://www.cnblogs.com/ayhq/p/5839070.html

    http://blog.csdn.net/jndxjing/article/details/5914620

    http://www.cnblogs.com/hoobey/p/5508992.html

    http://blog.csdn.net/gongzi2311/article/details/58191208

    http://www.linuxidc.com/Linux/2011-12/49206.htm

    http://blog.csdn.net/duchao123duchao/article/details/47763491

    http://blog.csdn.net/sivyer123/article/details/9154971

    http://blog.csdn.net/duchao123duchao/article/details/47763491

    http://www.cnblogs.com/tanzy114/p/4631809.html

    3.get 和 load 的区别

    http://blog.csdn.net/tftutu/article/details/6456060

    http://blog.csdn.net/tftutu/article/details/6456060

    http://www.cnblogs.com/xiaoluo501395377/p/3371776.html

    http://blog.csdn.net/buhuikanjian/article/details/53186606

      01.立即加载和延迟加载

      02.1和2级缓存中查询

      03.如果数据库中没有数据

      04.load也可以立即加载

    4.evict() 和clear() flush()

     http://blog.csdn.net/z69183787/article/details/38403367

    http://blog.csdn.net/wkcgy/article/details/6192839

    http://www.csyor.com/703.html

    http://jaeger.blog.51cto.com/11064196/1757270/

    5.hibernate的缓存机制

      1级缓存 session

      2级缓存 sessionFactory  -----> 查询缓存

    http://jaeger.blog.51cto.com/11064196/1757270/

    http://www.csyor.com/703.html

    http://blog.csdn.net/wkcgy/article/details/6192839

    http://blog.csdn.net/z69183787/article/details/38403367

    6.hibernate三种状态,以及之间的转换

      我们创建的对象,从数据库中获取的对象!

      这些对象,在hibernate中的状态!

      01.瞬时状态,没有 oid

        Student stu = new Student();

      02.持久状态

        Student stu = (Student)session.get(Student.class,1);

      03.游离状态   有oid

        session.clear();

        session.evict();

    7.commit() 和 flush()的区别

      commit() 是提交事务  永久

      flush() 是清理缓存!  暂时

      但是两者都能把数据同步到数据库!

      01.commit执行之前,先执行flush

      02.flush执行缓存清理

      03.缓存清理,先 执行脏检查

      04.什么脏检查和脏对象!

        一个对象在被session管理的时候,会有一个快照保存在session中!

        如果后续我们对这个对象的属性进行修改,那么在脏检查的时候,会拿我们这个修改

        之后的对象和快照进行比对!我们这个对象发生了变化!那么这个对象就是脏对象!

        这个脏对象会被保存到数据库中!

    8.save() saveorupdate() update() merge()的区别

      01.三种状态

      02.状态之间的转换

      03.merge不会改变对象的状态

    9.openSession getCurrentSession 和 threadLocal<Session> 的区别

    10. sql结构化语句的分类

    11.HQL(hibernate查询语言) 不存在 表和字段! 面向对象的思想来解决数据库的问题!****

    使用hql的步骤

    12. list()和iterator()的区别


    13.hibernate参数绑定的方式 绑定对象使用的方法 ***

    动态参数绑定的理解


    14.设计模式的六大原则 约定大于配置

    15.投影查询 查询指定的字段!


    16.关联映射


    17. cascade属性 和 inverse 属性

    18.OpenSessionInView模式的理解

    19.迫切连接 (关键字)和非迫切连接的区别


    20.criteria查询 *****


    Criteria 是一个查询对象
    如果我们的查询需要条件
    那么就是需要一个Criterion对象!
    通过Criteria.add(Criterion对象) 增加条件!


    Criterion
    Restrictions
    Disjunction
    Junction

    Restrictions类中所有的方法都是 静态的!
    返回值都是Criterion或者Criterion的实现类!

    Disjunction继承了Junction!
    Junction实现了Criterion!


    所以在Criteria.add(条件)!条件可以是Restrictions
    Disjunction
    Junction中的任何一个!

    投影查询 ,聚合函数等用

    Projection 接口

    Projections工具类,是Projection的实现类

    ProjectionList中有一个add(Projection对象)
    我们传递的是Projections.一系列方法!因为这些方法的返回值是Projection或者是Projection的实现类

  • 相关阅读:
    前后端分离的思想
    原生js瀑布流
    瀑布流懒加载
    js的垃圾回收机制
    TCP三次挥手四次握手
    HTTP与HTTPS的区别
    http报文
    前后端的分离
    express中间件
    vue生命周期钩子函数解读步骤
  • 原文地址:https://www.cnblogs.com/xtdxs/p/7109599.html
Copyright © 2020-2023  润新知