2020面试题

mybatis

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

1#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 21: …串替换 2mybatis在处理#̲{}时,会将SQL中的#{}替…{}时,就是把SQL中的${}替换成变量的值;
4使用#{}可以有效的防止SQL注入,提高系统安全性。

  1. mybatis有几种分页方式
  1. 数组分页
  2. SQL分页
  3. 拦截器分页
  4. RowBounds分页
  1. mybatis 逻辑分页和物理分页的区别是什么?
  1. 物理分页速度上并不一定快于逻辑分页
  2. 逻辑分页速度上并不一定快于物理分页
  3. 物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端来
  4. 就算速度上存在优势,然后其他性能上的优点足以弥补这个缺点
  1. mybatis 是否支持延迟加载?延迟加载的原理是什么?

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()方法的调用。这就是延迟加载的基本原理。

  1. mybatis 的一级缓存和二级缓存

缓存的目的是为了减少对数据库的访问次数,提升数据库的执行效率。
mybatis缓存机制包括:1.一级缓存;2.二级缓存。
1.一级缓存:一级缓存也叫sqlSession级别的缓存,也就是在同一个SQLSession内执行两次多次相同结果的查询语句,只会在第一次时发出sql查询数据库的数据,然后之后每次从一级缓存中查询数据返回。拷贝
2. 二级缓存:
是mapper级别的缓存,也就是多个SQLSession之间可以实现的数据共享。
二级缓存是默认不开启的,所以在使用二级缓存时需要再做一下配置:
1. 在mybatis-config.xml文件中开启二级缓存
<!-- 开启二级缓存--> <setting name="cacheEnabled" value="true"/>
2. 在mapper文件中开启二级缓存
<!-- 开启本mapper的二级缓存--> <cache/>
1.让entity实现Serializable接口
注意:1当执行insert、delete、update时清除二级缓存,因为一级缓存都不存在了何来的二级缓存。
2当没有session。close()时,没有二级缓存,因为压根没有写入。
3没有开启相关配置文件,么有二级缓存,二级缓存,默认是关闭的。

useCache:使用在select语句上,可取值true|false,true表示查询是使用二级缓存,false查询时不使用二级缓存,默认是true
flushCache:使用insert、update、delete语句上,可取值true|false,true表示刷新(清除二级缓存),false表示不刷新(清除)二级缓存,默认值是true。
注意:当flushCache是false时会出现数据脏读问题。
在这里插入图片描述

  1. mybatis 和 hibernate 的区别有哪些?
  1. mybatis和hibernate不同,它不完全是一个ORM框架,因为mybatis需要程序员自己编写SQL语句。
  2. mybatis直接编写原生态sql,可以严格控制SQL执行能力,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一旦需求变化要求迅速输出结果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库软件,则需要自定义多套SQL映射文件,工作量大。
  3. hibernate对象/关系映射能力强,数据库无关性好,对于关系型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
  1. mybatis 有哪些执行器(Executor)

mybatis有三种基本的执行器:
1.SimpleExecute:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
2.ReuseExecute:执行update或select,以SQL作为key查询Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置在Map内,供下一次使用,简言之就是重复使用Statement对象。
3.BatchExecute:执行update,将所有SQL都添加到批处理中(addBatch()),等待统一执行(BatchExecute()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

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

分页插件的基本原理是使用mybatis提供的插件接口,实现自定义插件,在插件拦截方法内拦截待执行的SQL,然后重写SQL,根据dialect方言,添加对应的物理分页语句和物理分页参数。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值