208面试题 Mybatis

十三、Mybatis

125.mybatis 中 #{}和 ${}的区别是什么?
  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
  2. $将传入的数据直接显示生成在sql中。
  3. #方式能够很大程度防止sql注入。
  4. $方式无法防止Sql注入。
  5. $方式一般用于传入数据库对象,例如传入表名.
  6. 一般能用#的就别用$.
    MyBatis排序时使用order by 动态参数时需要注意,用 $而不是#
126.mybatis 有几种分页方式?

Mybatis四种分页方式:
数组分页
sql分页
拦截器分页
RowBounds分页
具体参考博客:https://www.cnblogs.com/aeolian/p/9229149.html

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

oracle 数据库,查询增加RowBounds限制查询条数,默认是0到1000条

private final static int rowLimit = 1000;
	//限制查询条数
	private final static RowBounds QUERY_LIMIT=new RowBounds(0,rowLimit);	
	
		public List<T> select(String sqlID, T t) throws DBException,
			RecordNotFoundException {
		List<T> ret;
		try {
			if ("".equals(sqlID) || (null == sqlID)) {
				ret = getSqlSession().selectList(t.getMapperName() + SELECT, t,QUERY_LIMIT);
			} else {
				ret = getSqlSession().selectList(t.getMapperName() + MAPPER + sqlID,
						t,QUERY_LIMIT);
			}   			
		} catch (Exception e) {
			LOGGER.error(e.getMessage(), e);
			LOGGER.debug(t.toString());
			throw new DBException(e);
		}
		if (ret == null && checkNull) {
			throw new RecordNotFoundException(t.getTableName());
		}
		return ret;
	}
128.mybatis 逻辑分页和物理分页的区别是什么?
  1. 逻辑分页 内存开销比较大,在数据量比较小的情况下效率比物理分页高;在数据量很大的情况下,内存开销过大,容易内存溢出,不建议使用
  2. 物理分页 内存开销比较小,在数据量比较小的情况下效率比逻辑分页还是低,在数据量很大的情况下,建议使用物理分页
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()方法的调用。这就是延迟加载的基本原理。

不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。

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

一级缓存是sqlsession级别的缓存,是基于HashMap的本地缓存,不同的sqlsession之间的缓存数据区域互不影响,一级缓存的作用域是sqlsession范围,当同一个sqlsession执行两次相同的SQL语句时,第一次执行完后会将数据库中插叙到的数据写到缓存,第二次查询从缓存中获取,不用去查询数据库。当sqlsession执行insert,update,delete操作并提交到数据库时,会先清空缓存,保证缓存中的数据是最新数据。mybatis默认开启的是一级缓存。
二级缓存是mapper级别的缓存,同样是基于HashMap进行存储,多个sqlsession可以共用二级缓存,其作用域是mapper的同一个namespace。不同sqlsession两次执行相同的namespace下的相同的SQL语句时,会执行相同的SQL,第二次查询只会查询第一次查询时读取数据库后写到缓存的数据,下会再去数据库查询。

131.mybatis 和 hibernate 的区别有哪些?
  • Mybatis轻量级封装jdbc。 hibernate是重量级封装jdbc
  • mybatis开发效率慢,运行效率快。 hibernate开发效率快,运行效率慢
  • mybatis使用的事sql。 hibernate使用的是hql
  • mybatis需要程序员对sql熟练掌握。 hibernate使用起来方便,对程序要得sql没要过多的要求
  • mybatis更加灵活。 hibernate如果碰见复杂的查询,不是很灵活
132.mybatis 有哪些执行器(Executor)?

SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。

BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。

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

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

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

参考博客:https://www.cnblogs.com/gougouyangzi/articles/9993353.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值