1.什么是mybatis?

答:mybatis是一个优秀的持久层框架,底层封装了JDCB使开发者开发时只用关心sql语句的编写即可。通过简单的Xml配置来映射原生文件,使用pojo映射了数据库数据。免除了几乎所有的JDBC代码,参数设置以及处理结果集。(记忆:免除-封装-数据库)

2.mybatis的优缺点?

答:优点:(1)在xml或注解中直接编写sql代码,比较灵活,方便sql语句的优化和调整(2)免除了重复的JDBC代码(3)与spring易于集成。 缺点:(1)当字段多,涉及多表的操作时,需要编写大量的sql代码(2)sql语句依赖数据库的特性,程序移植性差,不易于切换数据库。(记忆:优(免除-集成-sql)缺:字段-切换)

3.mybatis 与 hibernate 的区别

答:(1)mybatis并不完全是ORM框架,它需要编写sql代码才能和数据库交互,而hibernate则可以做到无sql语句和数据库进行交互(2)mybatis直接编写原生的sql语句,灵活性较高,响应速度快,而hibernate依赖配置自动生成和执行sql语句,面对多变的需求是响应速度就没有那么快(3)mybatis编写大量sql代码时比较考验程序员的功底,效率相对没有那么高,而hibernate不用编写sql代码效率较高(4)mybatis依赖数据库特性,移植性差,不易于切换数据库,而hibernate则屏蔽了数据库的差异,具有较好的一致性。(记忆:有无sql-灵活性-效率-一致性)

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

答:mybatis在处理#{}时会将它替换成?来进行预编译,通过PreparedStatement中的setXXX()方法来进行参数赋值,#{}可以有效防止sql注入。mybatis在处理${}时,会直接将其替换成参数值,存在被sql注入风险。

5.mybatis 中实体类的属性名与表中的字段名不一致怎么处理?

答:(1)可以对sql语句的字段进行重命名(2)可以在xml文件中使用标签来配置数据库字段和实体类属性的关系映射。

6.用 mybatis 如何使用模糊查询?

答:(1)可以使用#{}的方式,在xml文件中将需要模糊查询的信息写在#{}里面即可,eg:select * from user where name like #{name};同时java文件里面的传入到xml文件#{}中的变量要写成"%name%"格式(用两个百分号将要模糊查询的变量包起来)(2)可以使用${}方式进行模糊查询,xml文件中的sql语句需要写成如下格式,eg:select * from user where name like “% ${name}%”,java文件的语句正常写即可。(推荐使用#{}进行模糊查询,因为 ${}会引起sql注入)

7.mybatis的使用场景

答:(1)mybatis专注于sql,提供了一个比较灵活的Dao层解决方案(2)对应性能要求高,需求多变的项目,如互联网项目,是一个不错的选择。

8.mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?

答:通过反射创建对象,同时通过反射给对象的属性进行逐一赋值,那些没有关系映射的属性则赋值失败,映射形式有(1)通过xml文件的标签来对数据库字段和实体类属性进行关系映射(2)通过sql的列功能,将列字段名写为对象的属性名。

9.分页方式有哪些?分页插件的原理?

答:(1)使用rowbounds对象进行分页,它可以通过处理结果集来进行内存分页(2)使用pagehelper插件进行分页,原理:通过mybatis提供的插件接口来对sql语句进行拦截,根据数据库类型和传入的参数生成分页sql语句。

10.mybatis的动态sql有什么用?原理?有哪些动态sql?

答:在xml配置文件中,通过标签就能生成动态sql,原理:判断表达式的值完成逻辑判断从而拼接sql语句,常见动态sql:where,if,foreach,when,otherwise。

11.在mybatis的xml配置文件中除了insert、delete、update、select标签外还有那些标签?

答:resultmap,sql,include。

12.mybatis中不同的xml映射文件的id可不可以相同?

答:若各自的xml文件都配置了namespace,则id可以相同,否则,就不可以相同。原因:namespace+id会作为map<String,mapperStatement>中的key来使用,若没配置namespace,id相同的话就会出现数据相互覆盖。

13.为什么说 mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

答:mybatis在查询关联对象或关联对象集合时,需要编写sql语句才能完成查询,所以说是半自动的ORM 映射工具,而hibernate是全自动的ORM 映射工具,它在查询关联对象或关联集合对象时会自动根据对象模型完成数据查询。

14.mybatis中实现一对多的方式有几种,具体怎么操作?

答:两种,联和查询,嵌套查询。联和查询:多个表联和同时完成查询,只查询一次,通过collection节点来配置一对多的类相关属性即可。嵌套查询:先查询一个表,然后再根据所查询表的外键id来查询其他表,通过在collection节点中设置好对应的select即可完成查询。

15.mybatis中是否支持延迟加载?如何实现?

答:mybatis仅支持association关联对象和collection关联对象查询的延迟加载,association指的是一对一,collection指的是一对多,通过在主配置文件sqlMapConfig.xml文件中配置lazyLoadindEnabled=true,aggrassiveLazyLoading=false即可。

16.关于mybatis中一级缓存和二级缓存在xml、注解中各自的使用

答:mybatis中的一级缓存都是默认开启的,而二级缓存需要手动开启。可以简单理解为一级缓存是共享sqlSession对象的,而二级缓存是共享sqlSessionFactory对象的。xml中的使用:在主配置文件sqlMapConfig.xml文件中配置如下信息

<settings>
<setting name="cacheEnabled" value="true"/>
</settings>

同时在映射配置文件中配置,以及在查询语句select中配置属性useCache="true"即可。注解的使用:主配置文件同样配置上述settings设置,然后在dao接口中配置@cacheNamespace(blocking=true)即可。

17.什么是mybatis接口绑定,有哪些实现方式,各自适合哪些场合使用?

答:指的是接口中的任意方法可以和sql语句进行绑定,接口绑定的方式比sqlSession方式提供的方法具有更加灵活的选择和设置。实现方式(1)xml配置方式:在xml文件的中配置namespace,namespace必须是接口名的全路径名称,以及配置id,即接口中具体方法的名字;(2)注解方式:直接在接口的方法上面添加@select@insert@delete@update注解。当sql语句比较简单时使用注解方式比较方便,当sql语句复杂时使用xml配置方式比较方便,使用用xml配置方式居多。

18.mybatis中使用mapper接口调用时需要注意哪些问题?

答:(1)mapper.xml中的namespace的值必须是mapper接口的全路径名(2)mapper接口中的方法名字必须和mapper.xml文件中每个sql语句的id一样(3)mapper接口中方法的传入参数类型必须和mapper.xml中每个sql语句的parameterType类型一致(4)mapper接口中方法的返回值类型必须和mapper.xml文件中每个sql语句的resultType类型一致。

更多推荐

mybatis面试题笔记