
什么是ORM? (引荐进修:java口试题目)
对象关联映照(Object-Relational Mapping,简称ORM)是一种为了处理顺序的面向对象模子与数据库的关联模子互不婚配问题的手艺;
简朴的说,ORM是经由历程运用形貌对象和数据库之间映照的元数据(在Java中能够用XML或许是注解),将顺序中的对象自动耐久化到关联数据库中或许将关联数据库表中的行转换成Java对象,其本质上就是将数据从一种情势转换到别的一种情势。
Hibernate中SessionFactory是线程平安的吗?Session是线程平安的吗(两个线程能够同享同一个Session吗)?
SessionFactory对应Hibernate的一个数据存储的观点,它是线程平安的,能够被多个线程并发接见。SessionFactory平常只会在启动的时刻构建。关于运用顺序,最好将SessionFactory经由历程单例形式举行封装以便于接见。
Session是一个轻量级非线程平安的对象(线程间不能同享session),它示意与数据库举行交互的一个事情单位。Session是由SessionFactory建立的,在使命完成以后它会被封闭。Session是耐久层效劳对外供应的重要接口。
Session会耽误猎取数据库衔接(也就是在须要的时刻才会猎取)。为了防止建立太多的session,能够运用ThreadLocal将session和当前线程绑定在一起,如许能够让同一个线程取得的老是同一个session。
Hibernate 3中SessionFactory的getCurrentSession()要领就能够做到。
Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()要领分别是做什么的?有什么区分?
Hibernate的对象有三种状况:瞬时态(transient)、耐久态(persistent)和游离态(detached)。
瞬时态的实例能够经由历程挪用save()、persist()或许saveOrUpdate()要领变成耐久态;
游离态的实例能够经由历程挪用 update()、saveOrUpdate()、lock()或许replicate()变成耐久态。save()和persist()将会激发SQL的INSERT语句,而update()或merge()会激发UPDATE语句。
save()和update()的区分在于一个是将瞬时态对象变成耐久态,一个是将游离态对象变成耐久态。merge()要领能够完成save()和update()要领的功用,它的企图是将新的状况合并到已有的耐久化对象上或建立新的耐久化对象。
关于persist()要领,依据官方文档的申明:
1、persist()要领把一个瞬时态的实例耐久化,然则并不保证标识符被马上填入到耐久化实例中,标识符的填入大概被推晚到flush的时候;
2、persist()要领保证当它在一个事件外部被挪用的时刻并不触发一个INSERT语句,当须要封装一个长会话流程的时刻,persist()要领是很有必要的;
3、save()要领不保证第2条,它要返回标识符,所以它会马上实行INSERT语句,不管是在事件内部照样外部。
至于lock()要领和update()要领的区分,update()要领是把一个已更悛改的脱管状况的对象变成耐久状况;lock()要领是把一个没有更悛改的脱管状况的对象变成耐久状况。
论述Session加载实体对象的历程。
1、Session在挪用数据库查询功用之前,起首会在一级缓存中经由历程实体范例和主键举行查找,假如一级缓存查找掷中且数据状况正当,则直接返回;
2、假如一级缓存没有掷中,接下来Session会在当前NonExists纪录(相当于一个查询黑名单,假如涌现反复的无效查询能够敏捷做出推断,从而提拔机能)中举行查找,假如NonExists中存在一样的查询条件,则返回null;
3、假如一级缓存查询失利查询二级缓存,假如二级缓存掷中直接返回;
4、假如之前的查询都未掷中,则发出SQL语句,假如查询未发明对应纪录则将此次查询添加到Session的NonExists中加以纪录,并返回null;
5、依据映照设置和SQL语句获得ResultSet,并建立对应的实体对象;
6、将对象归入Session(一级缓存)的治理;
7、假如有对应的拦截器,则实行拦截器的onLoad要领;
8、假如开启并设置了要运用二级缓存,则将数据对象归入二级缓存;
9、返回数据对象。
#将传入的数据都当做一个字符串,会对传入的数据自动加上引号;
$将传入的数据直接显现生成在SQL中。
注重:运用$占位符大概会致使SQL打针进击,能用#的处所就不要运用$,写order by子句的时刻应该用$而不是#。
解释一下MyBatis中定名空间(namespace)的作用。
在大型项目中,大概存在大批的SQL语句,这时刻为每一个SQL语句起一个唯一的标识(ID)就变得并不轻易了。
为了处理这个问题,在MyBatis中,能够为每一个映照文件起一个唯一的定名空间,如许定义在这个映照文件中的每一个SQL语句就成了定义在这个定名空间中的一个ID。
只需我们能够保证每一个定名空间中这个ID是唯一的,纵然在差别映照文件中的语句ID雷同,也不会再发生争执了。
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>
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对象。
MyBatis与Hibernate有哪些差别?
1、Mybatis和hibernate差别,它不完全是一个ORM框架,由于MyBatis须要顺序员本身编写Sql语句,不过mybatis能够经由历程XML或注解体式格局天真设置要运转的sql语句,并将java对象和sql语句映照生成终究实行的sql,末了将sql实行的效果再映照生成java对象。
2、Mybatis进修门坎低,简朴易学,顺序员直接编写原生态sql,可严格控制sql实行机能,天真度高,异常合适对关联数据模子请求不高的软件开发,比方互联网软件、企业运营类软件等,由于这类软件需求变化频仍,一但需求变化请求效果输出敏捷。
然则天真的条件是mybatis没法做到数据库无关性,假如须要完成支撑多种数据库的软件则须要自定义多套sql映照文件,事情量大。
3、Hibernate对象/关联映照才能强,数据库无关性好,关于关联模子请求高的软件(比方需求牢固的定制化软件)假如用hibernate开发能够节约许多代码,进步效力。
然则Hibernate的瑕玷是进修门坎高,要通晓门坎更高,而且如何设想O/R映照,在机能和对象模子之间如何衡量,以及如何用好Hibernate须要具有很强的履历和才能才行。
总之,依据用户的需求在有限的资本环境下只需能做出保护性、扩展性优越的软件架构都是好架构,所以框架只要合适才是最好。
(这里也能够连系本身的理说明注解,别说的收不住)
简朴的说一下MyBatis的一级缓存和二级缓存?
Mybatis起首去缓存中查询效果集,假如没有则查询数据库,假如有则从缓存掏出返回效果集就不走数据库。Mybatis内部存储缓存运用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映照生成的java对象
Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql能够从缓存中猎取数据。二级缓存是能够跨SqlSession的。
以上就是Java耐久层口试题目标细致内容,更多请关注ki4网别的相干文章!