Hibernate MySQL MyBatis

十二、Hibernate

113.为什么要使用 hibernate?

1.对jdbc 访问数据库的代码进行了封装,大大简化了数据访问层繁琐的重复性代码。

2.Hibernate 是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化dao层的编码工作。

3.Hibernate 使用Java 反射机制,而不是字节码程序来实现透明性。

4.Hibernate 的性能非常好,因为它是一个轻量级框架,映射的灵活性很出色,它支持各种关系数据库,从一对多到多对多的各种复杂关系。

详细可参考:https://www.cnblogs.com/javaNewegg/archive/2011/08/28/2156521.html

114.什么是 ORM 框架?

ORM 即对象关系映射,即通过类与数据库表的映射关系,将对象持久化到数据库中,常用的有Hibernate mybatis等等。

115.hibernate 中如何在控制台查看打印的 sql 语句?

只需要在配置文件中添加一个配置参数即可。
hibernate.show_sql=true

详细参考:https://blog.csdn.net/Randy_Wang_/article/details/79460306

116.hibernate 有几种查询方式?

hibernate总的来说有三种查询方式,HQL QBC 和SQL三种,

详细参考:https://www.cnblogs.com/jinsheng1027/p/11327159.html

117.hibernate 实体类可以被定义为 final 吗?

可以 ,Hibernate仅在需要时才使用代理类来延迟加载数据。 这是通过扩展实体bean来完成的,如果实体bean是final,那么延迟加载将是不可能的,因此性能低下。

118.在 hibernate 中使用 Integer 和 int 做映射有什么区别?

hibernate的PO类中 经常会用到int 型得变量 这个时候如果使用基本类型的变量(int ) 如果数据库中对应的存储数据是 null 时使用PO类进行获取数据 会出现类型转换异常 如果使用的是对象类型(Integer)这个时候则不会报错。

119.hibernate 是如何工作的?

文章详细地址:https://blog.csdn.net/wu1317581750/article/details/81697899

hibernate的基本工作流程可以分为7个步骤:

  • 1.通过configuration对象读取并解析配置文件
  • 2.读取并解析映射对象,创建SessionFactory对象。
  • 3.打开session
  • 4.持久化操作,对对象进行CRUD操作。
  • 5.提交事务
  • 7.关闭session和SessionFactory对象。

 

120.get()和 load()的区别?

参考文章:https://www.jianshu.com/p/f1144cd94729

1.get() 是立即加载 load() 是延时加载。

2.get会先查一级缓存,再查二级缓存,然后查数据库,而load 会先查一级缓存,若没找到,就创建代理对象,等需要的时候去查二级缓存和数据库(load 延时加载特性)

3.get 如果没有找到会返回null ,load 没有找到则会抛出异常。

4.当使用session.load 方法来加载一个对象时,此时并不会发出SQL语句,当前得到的对象是一个代理对象,该对象只保存了实体对象的id ,只有当要使用它的时候,才会发出sql语句,从数据库中去查询需要的数据,相当于load的延时加载方式,当我们使用get方法得到一个对象的时候,不管使用与否,此时都会发出sql语句去数据库中查找。

121.说一下 hibernate 的缓存机制?

https://www.jianshu.com/p/81d418e42853

hibernate缓存包括俩大类。Hibernate 一级缓存和 Hibernate二级缓存。

1) Hibernate一级缓存又称之为Session的缓存,它是内置的,不能被卸载,session对象的生命周期通常对应一个数据库事务或者一个应用事务,因为它的缓存 是事务范围的缓存。

2)Hibernate二级缓存又称之为SessionFactory 的缓存,由于SessionFactory 对象的生命周期和应用程序的整个过程对应,因此Hibernate的二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因为需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别,第二级缓存是可选的,

当Hibernate 根据id 访问数据对象的时候,首先从session一级缓存中查,查不到 ,如果配置了二级缓存那么从二级缓存中查,如果都查不到,再查询数据库,把结果按照id放入到缓存删除,更新 增加数据的时候,同时更新缓存。

122.hibernate 对象有哪些状态?

hibernate 对象有三种状态。

1. Transient 瞬时:对象刚new出来,还没设id ,设了其他值。【内存中一个对象,没id 缓存中也没有】

2.Persistent 持久 : 调用了savve() saveOrUpdate() 就变成了Persistent 有id.【内存中有对象,缓存中有,数据库中有】

3.Detached 脱管: 当session close()完后,就变成Detached.【内存有对象,缓存没有 数据库有】

https://www.cnblogs.com/lihaoyang/p/4854186.html

123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?

openSession从字面上可以看出,是打开一个新的session对象,而且每次使用都是打开一个新的session ,假如连续使用多次,则获得的session 不是同一个对象,并且使用完需要调用close 方法关闭session.

getCurrentSession 从字面上可以看出,是获得当前上下文一个session对象,当第一次使用该方法时,会自动产生一个session对象,并且连续使用多次时得到的session都是同一个对象,这就是与openSession的区别之一。

https://blog.csdn.net/qq_19167629/article/details/90263663

124.hibernate 实体类必须要有无参构造函数吗?为什么?

在hibernate中的实体类实例化时,这个对象是由Hibernate框架创建的,其不会提供默认的无参构造器。

在运行的时候,jvm 会有一个对应的Class对象,该class对象中包含了该运行类中的所有信息,接着通过该class 对象调用newInstance() 和无参构造方法来构造该类的对象,同时如果你没有提供,jvm 也会给你自动提供默认的无参构造方法来完成实例化。

https://blog.csdn.net/m0_37510446/article/details/90374065


十三、Mybatis

125.mybatis 中 #{}和 ${}的区别是什么?

#{}是预编译处理,${} 是字符串的替换。

(1)myBatis 在处理#{} 时,会将sql中的#{} 替换成?号,调用PreparedStatement的set方法来赋值。

(2)mubatis 在处理${}时,会将${} 替换成变量的值。

(3)使用#{} 可以有效的防止SQL注入,提高系统安全性,原因在于预编译机制,预编译完成之后,SQL的结构已经固定,即便用户输入非法参数,也不会对SQL的结构产生影响,从而避免了潜在的安全风险。

(4)预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。

 

126.mybatis 有几种分页方式?

数组分页 sql分页 拦截器,RowBounds分页。

https://blog.csdn.net/chenbaige/article/details/70846902

127.RowBounds 是一次性查询全部结果吗?为什么?

MyBatis 逻辑分页原理解析RowBounds:https://blog.csdn.net/qq924862077/article/details/52611848

128.mybatis 逻辑分页和物理分页的区别是什么?

物理分页:就是数据库本身提供了分页方式,如MySQL的limit 好处是效率高,不好的地方是不同的数据库存在差异。

逻辑分页:利用游标分页,好处是所有数据库都统一,坏处是效率低。

结论:

物理分页和逻辑分页没有速度上的明显差别,物理分页总是优于逻辑分页,没有必要将数据库端的压力加注到应用端。

Hibernate 采用的是物理分页,MyBatis 采用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然后再根据offset 和limt 截断记录返回,(数据量大的时候会造成内存溢出),不过可以使用插件或其他方式能达到物理分页的效果。

MyBatis的物理分页插件: MyBatis-Paginator  MyBatis-PageHelper.

129.mybatis 是否支持延迟加载?延迟加载的原理是什么?

MyBatis 仅支持association关联对象和和collection关联集合对象的延迟加载,association指的是一对一,collection指的是一对多查询,在MyBatis配置文件中,可以配置是否启用延迟加载。lazyLoadingEnabled=true|false。

原理:

使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

作者:章鱼小哥946
链接:https://www.jianshu.com/p/2e7fe9e5df54
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

130.说一下 mybatis 的一级缓存和二级缓存?

https://blog.csdn.net/huangli1466384630/article/details/82432128

一级缓存:

MyBatis 的一级缓存是指session缓存,一级缓存的作用域默认是SqlSession,MyBatis默认开启一级缓存,也就是在同一个SqlSession中,执行相同的查询sql,第一次会去数据库进行查询,并写到缓存中,第二次直接从缓存中读取。

二级缓存:

MyBatis的二级缓存是指mapper映射文件,二级缓存的作用域是同一个namespace下的mapper映射文件,多个SqlSession共享。

MyBatis 需要手动设置启动二级缓存。

 

131.mybatis 和 hibernate 的区别有哪些?

https://www.cnblogs.com/lixuwu/p/10941649.html

1.hibernate开发中sql已经被封装,可以直接使用,MyBatis 属于半自动化,sql需要手动完成。

2.Hibernate是完整的对象-关系映射的框架,开发国成永恒汇总,只需管理对象即可,而MyBatis 需要自动管理映射关系。

3.缓存方面:

MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

而Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。

132.mybatis 有哪些执行器(Executor)?

mybatis的执行器有三种类型:

  • ExecutorType.SIMPLE

这个类型不做特殊的事情,它只为每个语句创建一个PreparedStatement。

  • ExecutorType.REUSE

这种类型将重复使用PreparedStatements。

  • ExecutorType.BATCH

这个类型批量更新,且必要地方别开其中的select 语句,确保动作易于理解。

133.mybatis 分页插件的实现原理是什么?

参考文章:https://www.cnblogs.com/dengpengbo/p/10579631.html

134.mybatis 如何编写一个自定义插件?

参考文章:

https://www.cnblogs.com/drafire/p/9773071.html

https://blog.csdn.net/qq_36110736/article/details/97123600

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值