2019独角兽企业重金招聘Python工程师标准>>>

什么是Mybatis?

1. mybatis是一个半ORM框架,它内部封装了JDBC,开发时只需要关乎sql语句本身,不需要花费精力去处理驱动,创建连接,创建1statement等繁复过程。 2. mybatis可以使用xml或注解来配置和映射原生信息。将pijo映射成数据库中的记录,避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。 3. 通过xm文件或注解的方式将要执行的各种statement配置起来,并通java对象和statement中sql的动态参数进行映射生成最终的sql语句,最后由mybatis框架执行sql并将结果映射java对象返回.

Mybatis的优缺点?

优点:

1. 基于sql语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,sql写在xml里,解除了sql与程序代码的耦合, 2. 能够与spring很好的集成, 3. 消除了JDBC的大量冗余代码,不需要手动开关连接,很好的与各种数据库兼容

缺点:

1. sql语句编写量偏多, 2. sql'语句依赖于数据库,倒追数据库移植性差,不能随意更换数据库.

Mybatis使用场合?

专注于sql本身,是一个足够灵活的dao层解决方案.,对性能的要求很高,或者需求多变的项目,

#{}和${}的区别是什么?

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

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理${}时,就是把${}替换成变量的值。

使用#{}可以有效的防止SQL注入,提高系统安全性。

当实体类的属性名和表种字段名不一致怎么办?

有两种解决方案:可以在sql语句给字段名取别名,别名于实体类属性名同名,也可以用<resultMap>来映射字段名和实体类属性名一一对应.

模糊查询like语句该怎么写?

第一种:在java代码添加sql通配符

    <select id=”selectlike”>select * from foo where bar like #{value}</select>

第二种:在sql语句中拼接通配符,会引起sql注入

    <select id=”selectlike”>select * from foo where bar like "%"#{value}"%"</select>

通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。 mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MapperStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MapperStatement对象。

mapper接口里的方法是不能被重载的,因为是使用 全限名+方法名 的保存和寻找策略

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

第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映射关系。

第二种是使用sql列的别名功能,将列的别名书写为对象属性名。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

如何执行批量插入?

先创建一个简单的插入语句

    <insert id=”insertname”>insert into names (name) values (#{value})</insert>

然后在代码执行下面的

  list<string> names = new arraylist();names.add(“fred”);names.add(“barney”);names.add(“betty”);names.add(“wilma”);// 注意这里 executortype.batchsqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);try {namemapper mapper = sqlsession.getmapper(namemapper.class);for (string name : names) {mapper.insertname(name);}sqlsession.commit();}catch(Exception e){e.printStackTrace();sqlSession.rollback(); throw e; }finally {sqlsession.close();}

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

<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>insert into names (name) values (#{name})
</insert>

在mapper中如何传递多个参数?

(1)第一种:
//DAO层的函数
Public UserselectUser(String name,String area);
//对应的xml,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。
<select id="selectUser"resultMap="BaseResultMap">  select *  fromuser_user_t   whereuser_name = #{0} anduser_area=#{1}
</select>  (2)第二种: 使用 @param 注解:
public interface usermapper {user selectuser(@param(“username”) string username,@param(“hashedpassword”) string hashedpassword);
}
然后,就可以在xml像下面这样使用(推荐封装为一个map,作为单个参数传递给mapper):
<select id=”selectuser” resulttype=”user”>select id, username, hashedpasswordfrom some_tablewhere username = #{username}and hashedpassword = #{hashedpassword}
</select>(3)第三种:多个参数封装成map
try{
//映射文件的命名空间.SQL片段的ID,就可以调用对应的映射文件中的SQL
//由于我们的参数超过了两个,而方法中只有一个Object参数收集,因此我们使用Map集合来装载我们的参数
Map<String, Object> map = new HashMap();map.put("start", start);map.put("end", end);return sqlSession.selectList("StudentID.pagination", map);}catch(Exception e){e.printStackTrace();sqlSession.rollback();throw e; }
finally{MybatisUtil.closeSqlSession();}

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复

Mybatis的一级、二级缓存:

一级缓存 事务范围:缓存只能被当前事务访问。缓存的生命周期 依赖于事务的生命周期当事务结束时,缓存也就结束生命周期。 在此范围下,缓存的介质是内存。 二级缓存 进程范围:缓存被进程内的所有事务共享。这些事务有 可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。 缓存的生命周期依赖于进程的生命周期,进程结束时, 缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据, 所以存放的介质可以是内存或硬盘。

什么是MyBatis的接口绑定?有哪些实现方式?

接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定, 我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。

接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;另外一种就是通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。

使用MyBatis的mapper接口调用时有哪些要求?

① Mapper接口方法名和mapper.xml中定义的每个sql的id相同; ② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同; ③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同; ④ Mapper.xml文件中的namespace即是mapper接口的类路径。

转载于:https://my.oschina.net/u/4116655/blog/3055230

Mybatis常见的面试题总结相关推荐

  1. 「面试必备」常见Java面试题大综合 马云见了都点赞

    一.Java基础 1.Arrays.sort实现原理和Collections.sort实现原理 答:Collections.sort方法底层会调用Arrays.sort方法,底层实现都是TimeSor ...

  2. 面试必备:《Java 最常见 200+ 面试题全面解析》

    春招在即,想让面试官在短短的几十分钟内就认可你的能力? 想在最快的时间内收获 Java 技术栈最核心的知识点? 想要更全面.更深入的了解 Java 技术? 这里能够给你想要的所有答案? 给准备面试的大 ...

  3. 2020年 Java 最常见200+ 面试题全解析:面试必备

    Java 最常见200+ 面试题全解析:面试必备 如想了解更多更全面的Java必备内容可以阅读:所有JAVA必备知识点面试题文章目录: JAVA必备知识点面试题 序 言 在本篇文章开始之前,我想先来回 ...

  4. 划重点,2021 常见的面试题和八股文都为大家总结出来了

    今年的秋招基本已经进入大规模的开奖季了,很多小伙伴收获不错,拿到了心仪的 offer. 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文,为此咱这里也统一做一次大整理和大归类,这也算是 ...

  5. 在实习面试的过程的当中,常见的面试题(自己面试一路走来,所出现的频率较高的面试题总结)

    特意提醒:该文适合有了一定面试经验的人进行查漏补缺,因为我这里知识总结了常见的问题,并没有总结的答案,而这些答案都是在我发的这些面经当中,但是还是没有将答案单独拎出来,等下次有时间,将问题下的答案也补 ...

  6. PHPer常见的面试题总结

    1.平时喜欢哪些php书籍及博客?CSDN.虎嗅.猎云  2.js闭包是什么?  3.for与foreach哪个更快?  4.php鸟哥是谁?能不能讲一下php执行原理?  5.php加速器有哪些?a ...

  7. c语言字符串操作面试题,C语言常见字符串面试题.pdf

    C语言常见字符串面试题 1. 字符串库函数的内部实现 memset库函数的实现 /* * memset - Fill a region of memory with the given value * ...

  8. Web前端人员如何面试?常见vue面试题有哪些?

    Web前端人员如何面试?常见vue面试题有哪些?vue是一套用于构建用户界面的渐进式JavaScript框架,也是初创项目的首选前端框架.很多企业在招聘前端工程师时都会考察其对vue的了解,接下来小编 ...

  9. linux修改文件句柄数生效_linux系统层面调优和常见的面试题

    linux系统层面调优和常见的面试题​mp.weixin.qq.com 无论对Spark集群,还是Hadoop集群等大数据相关的集群进行调优,对linux系统层面的调优都是必不可少的,这里主要介绍3种 ...

最新文章

  1. 【Qt】设置窗口透明度
  2. 20年研发管理经验谈(五)
  3. 完美解答35K月薪的MySQL面试题(一)MySQL是如何存储数据的
  4. c code first mysql_Code First for MySql命令操作
  5. task文件服务器无法输入,求助大神,win10的输入法无法使用,去开task sche
  6. 计算机专业要学几门课呀,计算机专业学生一定要学好这几门课!
  7. 音视频技术开发周刊 | 196
  8. SuperMap GIS查询
  9. 为什么要设置环境变量,环境变量有什么用?
  10. 不懂别瞎搞!Redis 性能优化的 13 条军规!
  11. 对于python的感受_聊聊我对python的感受
  12. ubuntu mysql开发环境_Ubuntu + Nginx/PHP/MYSQL开发环境配置图文教程
  13. Web后端学习笔记 Flask(8) WTForms 表单验证,文件上传
  14. Go语言的变量、函数、Socks5代理服务器 1
  15. pandas 删除特定行根据条件_记录21个Pandas技巧
  16. Atitit  记录方法调用参数上下文arguments
  17. 2月1日:成都力争3年建237个养老院全覆盖社区养老
  18. Ubuntu操作系统MTK刷机工具失败解决方案
  19. arduino连接ps2手柄控制智能小车实践记录-续
  20. chronyd同步windows时钟源问题

热门文章

  1. jetty安装、配置、优化
  2. (tomcat访问不了的两种解决方法)Bad Request(Invalid Hostname)
  3. #sora#celery worker guide abstract
  4. Android SystemProperties设置/取得系统属性的用法总结
  5. Source Insight 有用设置配置
  6. 看一下基于ASP.NET MVC的开源社区项目Orchard
  7. 开源Wiki系统:XWiki 2.0.2 发布
  8. 快乐的生活 2008-10-10 18:49:00
  9. Swift初探 1 helloWord
  10. redis 实现分布式锁