Mybatis常见面试题(2023最新)

目录

  • 前言
  • 1.mybatis是什么
  • 2.mybatis的优点和缺点
  • 3.mybatis和Hibernate的区别
  • 4.#{}和${}的区别
  • 5.resultType和resultMap的区别
  • 6.怎么进行批量操作
  • 7.一个xml文件对应一个dao接口,dao接口的工作原理是什么?dao接口的方法可以重载吗?
  • 8.mybatis怎么实现的分页
  • 9.mybatis支持延迟加载(懒加载)吗?原理是什么?
  • 10.mybatis的一级、二级缓存
  • 11.Xml文件中有哪些常用标签
  • 12.如何获取自动生成的(主)键值?

前言

很多不常见很难问到的我就没整理,原理我也没细写,还是一句话,背就行了。背会了让你快乐两年半
java最新面试题(java基础、集合、多线程、jvm、锁、算法、CAS、Redis、数据库、mybatis、spring、springMVC、springBoot、微服务)

1.mybatis是什么

是一个半自动ORM(对象关系映射)框架,内部封装了JDBC,开发时只需要关注SQL就可以,不需要花费精力去处理数据库驱动、数据库连接等过程。

2.mybatis的优点和缺点

优点:
①因为内置JDBC,所以减少了大量的代码冗余。
②基于SQL编程,很灵活,SQL写在xml文件里,与程序解耦,便于管理。
③兼容各种数据库。
④提供映射标签,对象和数据库字段的相互映射。
缺点:
①SQL的编写量很大的时候,对开发人员的SQL功底有要求。
②SQL依赖数据库,导致数据库移植性差,不能随意更换数据库。

3.mybatis和Hibernate的区别

①mybatis是半自动化对象关系映射框架(提供数据库和实体类的映射关系,还需要自己写sql),Hibernate是全自动化对象关系映射框架(提供数据库和实体类的映射关系,自动生成sql)。

②mybatis控制sql执行,灵活度高。Hibernate虽然灵活度没那么高,但是可以节省代码,效率高。

③mybatis数据库无关性差,移植性差,Hibernate数据库无关性好,移植性好,靠的是强大的hql语言。

④Hibernate日志更加完善,而mybatis只是基础记录功能。

4.#{}和${}的区别

SQL注入问题:
select * from user_table where username=' "+userName+" ' and password=' "+password"'

传入参数:
 username = "1' OR '1'='1";
 password = "1' OR '1'='1";
 变为:导致我们直接进入系统
 select * from t_user where (username = '1' or '1'='1') and (password = '1' or '1'='1');

#{}: 就相当于标识符 ?,可以有效解决SQL注入问题。
${}: 相当于字符串拼接,直接拼接,会有sql注入问题。

5.resultType和resultMap的区别

resultType: 返回我们的实体类、Integer、Map等。
resultMap: 返回自定义实体类。

6.怎么进行批量操作

使用foreach标签。

<foreach collection="集合名" item="自定义集合里每个元素的名字" open="(" close=")" separator=","> 
sql语句
foreach>				

7.一个xml文件对应一个dao接口,dao接口的工作原理是什么?dao接口的方法可以重载吗?

原理: dao接口就是使用JDK代理,生成一个代理对象,代理对象会拦截dao接口的方法,根据接口的全限定名+方法名 去判断是那个xml文件的sql,不能重载,因为是根据 全限定名+方法名 去判断。

8.mybatis怎么实现的分页

(1) 自己编写分页: 获取数据的list,然后编写代码进行分页。
(2) 利用sql进行分页: 比如mysql的limit。
(3) RowBounds实现分页

//service层调用dao层接口,start开始的条数,limit每页几条
public List<RoleBean> queryByPage(int start, int limit) {
	return roleDao.queryUsersByPage(new RowBounds(start, limit));
}

//dao层接口加入RowBounds参数,就可以实现分页
public List<UserBean> queryUsersByPage(RowBounds rowBounds);

9.mybatis支持延迟加载(懒加载)吗?原理是什么?

mybatis延迟加载的详解及其配置

支持的对象: Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。
概念: 延迟加载的原理是在查询时只加载部分数据,当需要访问未加载的数据时再进行加载。这样可以减少查询所需的时间和资源,提高系统性能。
原理: MyBatis实现延迟加载的方式是使用代理对象,在访问未加载的数据时触发代理对象的方法,从而进行数据的加载。延迟加载可以通过配置文件或注解来实现。

10.mybatis的一级、二级缓存

mybatis缓存详解及其配置

一级缓存: 默认开启,在同一个sqlSession会话下的操作都会存入缓存,请求查询的数据都会存入缓存。当会话,有增删改操作,并提交的时候,缓存清空,没有失效时间,会随会话结束而结束。
二级缓存: 默认关闭,会话是全局的,一个sqlSessionFactory里面可能有多个sqlSession,sqlSession之间共享数据。当一级缓存关闭或者清除的时候会存进二级缓存。当会话中,有增删改的操作,并且commit时,缓存就会清空。有失效时间,cache默认是一小时,每当有数据存进来,就会判断是否超过一小时,如果超过就释放二级缓存。实体类还需要实现反序列化(Serializable接口)。

11.Xml文件中有哪些常用标签

<select><insert><delect><update><resultMap><sql><include><where><foeach><choose><if><when><trim>等。

12.如何获取自动生成的(主)键值?

使用usegeneratedkeys=”true”,在新增成功之后,会返回id,到你的对象中。

<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>
     新增sql
insert>

你可能感兴趣的:(mybatis,java,数据库,面试,hibernate)