面试之Java持久层(十)

91,什么是ORM? 
        对象关联映射(Object-Relational
Mapping,简称OCR-VM)是一种为了化解程序的面向对象模型与数据库的关系模型互不匹配难题的技艺;

        一句话来说,O汉兰达M是通过使用描述对象和数据库之间映射的元数据(在Java中得以用XML可能是注明),将顺序中的对象活动持久化到关全面据库中要么将关周密据库表中的行转换成Java对象,其本质上就是将数据从一种样式转换来其它一种形式。

 

92,Hibernate中SessionFactory是线程安全的呢?Session是线程安全的吧(多个线程可以共享同一个Session吗)? 
        SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被三个线程并发访问。SessionFactory一般只会在起步的时候构建。对于应用程序,最好将SessionFactory通过单例情势展娄底装以便于访问。

        Session是一个轻量级非线程安全的目的(线程间不可以共享session),它表示与数据库进行互动的一个做事单元。Session是由SessionFactory成立的,在任务成功以往它会被关门。Session是持久层服务对外提供的重大接口。

        Session会延迟获取数据库连接(相当于在急需的时候才会得到)。为了防止创立太多的session,可以拔取ThreadLocal将session和当前线程绑定在一道,那样可以让同一个线程拿到的连年同一个session。Hibernate
3中SessionFactory的getCurrentSession()方法就能够形成。

 

93,Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有怎样界别?
        Hibernate的靶子有两种情景:刹那时态(transient)、持久态(persistent)和游离态(detached)。

        瞬时态的实例可以通过调用save()、persist()只怕saveOrUpdate()方法成为持久态;

        游离态的实例可以经过调用
update()、saveOrUpdate()、lock()大概replicate()变成持久态。save()和persist()将会引发SQL的INSE昂科拉T语句,而update()或merge()会吸引UPDATE语句。

        save()和update()的差异在于一个是将须臾时态对象变成持久态,一个是将游离态对象变成持久态。merge()方法可以做到save()和update()方法的效益,它的用意是将新的场合合并到已有的持久化对象上或创办新的持久化对象。

        对于persist()方法,依照合法文档的验证:

        1、persist()方法把一个弹指时态的实例持久化,不过并不保障标识符被及时填入到持久化实例中,标识符的填充可能被推迟到flush的时光;

        2、persist()方法保险当它在一个事务外部被调用的时候并不接触一个INSE奥迪Q5T语句,当需求封装一个长会话流程的时候,persist()方法是很有必要的;

        3、save()方法不保障第2条,它要重返标识符,所以它会立马施行INSEEnclaveT语句,不管是在事情内部依然外部。至于lock()方法和update()方法的分化,update()方法是把一个早已转移过的脱管状态的目的变成持久状态;lock()方法是把一个平昔不改变过的脱管状态的对象变成持久状态。

 

94,讲演Session加载实体对象的进度。 
        1、Session在调用数据库查询功用以前,首先会在超级缓存中经过实体类型和主键举行查找,要是超级缓存查找命中且数据状态合法,则一向回到; 
        2、要是顶尖缓存没有命中,接下去Session会在时下NonExists记录(也等于一个查询黑名单,即使出现重复的不算查询可以便捷做出判断,从而升级品质)中展开搜索,即便NonExists中存在一样的询问条件,则赶回null; 
        3、如果顶级缓存查询失利查询二级缓存,若是二级缓存命中直接重临; 
        4、即使之前的查询都未命中,则发出SQL语句,若是查询未发现对应记录则将这次查询添加到Session的NonExists中加以记录,并回到null; 
        5、依照映射配置和SQL语句得到ResultSet,并成立对应的实业对象; 
        6、将对象纳入Session(一流缓存)的军事管制; 
        7、即使有相应的拦截器,则执行拦截器的onLoad方法; 
        8、假如翻开并设置了要利用二级缓存,则将数据对象纳入二级缓存; 
        9、重回数据对象。

 

95,MyBatis中使用#和$书写占位符有何分化? 
        #将盛传的数据都不失为一个字符串,会对传播的数量自动抬高引号;

    $将盛传的数码直接体现生成在SQL中。

        注意:使用$占位符恐怕会导致SQL注射攻击,能用#的地方就绝不接纳$,写order
by子句的时候理应用$而不是#。

 

96,解释一下MyBatis中命名空间(namespace)的功用。 
        在大型项目中,或者存在大气的SQL语句,那时候为各类SQL语句起一个唯一的标识(ID)就变得并不不难了。为了缓解那几个难点,在MyBatis中,可以为各个映射文件起一个唯一的命名空间,那样定义在这几个映射文件中的每种SQL语句就成了概念在这一个命名空间中的一个ID。只要我们可以确保每一种命名空间中这一个ID是唯一的,尽管在分歧映射文件中的语句ID相同,也不会再发生顶牛了。

 

97、MyBatis中的动态SQL是怎么着看头? 
        对于有些长短不一的询问,大家兴许会指定三个查询条件,然则那一个标准或许存在也恐怕不存在,若是不行使持久层框架大家恐怕须要自己拼装SQL语句,不过MyBatis提供了动态SQL的功用来搞定这么些题材。MyBatis中用来落到实处动态SQL的要素主要有: 
– if    – choose / when / otherwise    – trim    – where    – set     –
foreach

用法举例:

   <select id="foo" parameterType="Blog" resultType="Blog">        
   select * from t_blog where 1 = 1
        <if test="title != null">            
           and title = #{title}
        </if>
        <if test="content != null">            
           and content = #{content}
        </if>
        <if test="owner != null">            
           and owner = #{owner}
        </if>
   </select>

 

98,JDBC编程有怎么着不足之处,MyBatis是如何缓解那个难题的?

        1、JDBC:数据库链接创设、释放频仍造成系统资源浪费从而影响系统质量,固然应用数据库链接池可化解此题材。

        MyBatis:在SqlMapConfig.xml中布局数据链接池,使用连接池管理数据库链接。

   
    2、JDBC:Sql语句写在代码中导致代码不易维护,实际行使sql变化的或是较大,sql变动须求改变java代码。

        MyBatis:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
        3、JDBC:向sql语句传参数麻烦,因为sql语句的where条件不必然,大概多也可能少,占位符必要和参数一一对应。

        MyBatis: Mybatis自动将java对象映射至sql语句。
        4,JDBC:对结果集解析麻烦,sql变化导致解析代码变化,且解析前需求遍历,倘若能将数据库记录封装成pojo对象解析比较方便。

        MyBatis:Mybatis自动将sql执行结果映射至java对象。

 

99,MyBatis与Hibernate有啥差距?

   
    1、Mybatis和hibernate分裂,它不完全是一个O奥迪Q3M框架,因为MyBatis必要程序员自身编排Sql语句,不过mybatis可以透过XML或表明方式灵活陈设要运行的sql语句,并将java对象和sql语句映射生成最后实施的sql,最终将sql执行的结果再映射生成java对象。
          
   
    2、Mybatis学习窍门低,简单命理易学,程序员直接编写原生态sql,可严酷控制sql执行品质,灵活度高,非凡适合对关周全据模型须求不高的软件开发,例如互连网软件、公司营业类软件等,因为那类软件必要变动频仍,一但须求变化须求成果输出疾速。不过灵活的前提是mybatis不可以做到数据库无关性,尽管急需贯彻协助八种数据库的软件则要求自定义多套sql映射文件,工作量大。
              
3、Hibernate对象/关系映射能力强,数据库毫不相关性好,对于涉及模型须求高的软件(例如需求稳定的定制化软件)要是用hibernate开发可以节约成千上万代码,升高成效。可是Hibernate的弱项是学习窍门高,要精晓门槛更高,而且怎么设计O/Qashqai映射,在质量和目标模型之间怎么样权衡,以及哪些用好Hibernate须要具备很强的经历和力量才行。
          
        可想而知,根据用户的必要在有限的资源环境下如若能做出维护性、扩充性卓绝的软件架构都以好架构,所以框架唯有切合才是最好。

(那里也得以整合自身的知晓说,别说的收不住)

* *

 

100,一言以蔽之一下MyBatis的拔尖缓存和二级缓存?

        Mybatis首先去缓存中询问结果集,假诺没有则查询数据库,假使有则从缓存取出重回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从询问出来映射生成的java对象
        Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql能够从缓存中获取数据。二级缓存是足以跨SqlSession的。

网站地图xml地图