首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
别问了别问了答不出来了
门头沟学院 后端工程师
发布于湖北
关注
已关注
取消关注
mark
@已删除:
火爆Github的Mybatis面试题,真的实用
1、MyBatis的工作原理 1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。 2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。 3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。 4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。 5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。 6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。 7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。 8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。 2、Mybatis 缓存 Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。 一级缓存是指 SqlSession 级别的缓存,当在同一个 SqlSession 中进行相同的 SQL 语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存 1024 条 SQL。 二级缓存是指可以跨 SqlSession 的缓存。是 mapper 级别的缓存,对于mapper 级别的缓存不同的sqlsession 是可以共享的。 3、Mybatis 的一级缓存原理 ( sqlsession 级别 ) 第一次发出一个查询 sql,sql 查询结果写入 sqlsession 的一级缓存中,缓存使用的数据结构是一个 map。 key:MapperID+offset+limit+Sql+所有的入参 value:用户信息 同一个 sqlsession 再次发出相同的 sql,就从缓存中取出数据。如果两次中间出现 commit 操作 (修改、添加、删除),本 sqlsession 中的一级缓存区域全部清空,下次再去缓存中查询不到所 以要从数据库查询,从数据库查询到再写入缓存。 4、二级缓存原理 ( mapper 级别) 二级缓存的范围是 mapper 级别(mapper同一个命名空间,Namespace),mapper 以命名空间为单位创建缓存数据结构,结构是 map。mybatis 的二级缓存是通过 CacheExecutor 实现的。CacheExecutor其实是 Executor 的代理对象。所有的查询操作,在 CacheExecutor 中都会先匹配缓存中是否存在,不存在则查询数据库。 key:MapperID+offset+limit+Sql+所有的入参 具体使用需要配置: Mybatis 全局配置中启用二级缓存配置 在对应的 Mapper.xml 中配置 cache 节点 在对应的 select 查询节点中添加 useCache=true 5、#{}和${}的区别是什么 #{}是预编译处理,${}是字符串替换。 Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; Mybatis在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止SQL注入,提高系统安全性。 预编译语句的优势在于归纳 为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql注入。 6、什么是MyBatis的接口绑定?有哪些实现方式? 接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。 接口绑定有两种实现方式: 通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定; 通过xml里面写SQL来绑定, 在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多。 7、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式? 第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。 第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。 有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。 8、Mybatis一对一、一对多的查询 MyBatis 中使用collection标签来解决一对多的关联查询,collection标签可用的属性如下: property:指的是集合属性的值. ofType:指的是集合中元素的类型. column:所对应的外键字段名称. select:使用另一个查询封装的结果. MyBatis 中使用association标签来解决一对一的关联查询,association标签可用的属性如下: property:对象属性的名称. javaType:对象属性的类型. column:所对应的外键字段名称. select:使用另一个查询封装的结果! 如: <mapper namespace="com.lcb.mapping.userMapper"> <!--collection 一对多关联查询 --> <select id="getClass2" parameterType="int" resultMap="ClassesResultMap2"> select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#{id} </select> <resultMap type="com.lcb.user.Classes" id="ClassesResultMap2"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" javaType="com.lcb.user.Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> <collection property="student" ofType="com.lcb.user.Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> </collection> </resultMap> <!--association 一对一关联查询 --> <select id="getClass" parameterType="int" resultMap="ClassesResultMap"> select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id} </select> <resultMap type="com.lcb.user.Classes" id="ClassesResultMap"> <!-- 实体类的字段名和数据表的字段名映射 --> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" javaType="com.lcb.user.Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> </resultMap> </mapper> <!-- 参考自:https://www.cnblogs.com/xdp-gacl/p/4264440.html --> 个人觉得,发送一个sql去查询,使用List<Object> 作为回参也可以做到。 上面这段代码,也是面试经常问到的 将sql执行结果封装为目标对象并返回,其实现的过程就是通过resultMap进行封装,而property和 column 进行映射,使数据库的列名和对象的名称对应。Mybatis也会智能匹配,比如可以指定驼峰,如果找不到映射对应的关系,就是默认值。 9、Mybatis的分页原理 Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。 分页插件的原理就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的dialect(方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页。 举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10 10、什么是Mybatis的动态SQL? 1) 传统的JDBC的方法,在组合SQL语句的时候需要去拼接,稍微不注意就会少少了一个空格,标点符号,都会导致系统错误。Mybatis的动态SQL就是为了解决这种问题而产生的;Mybatis的动态SQL语句值基于OGNL表达式的,方便在SQL语句中实现某些逻辑;可以使用标签组合成灵活的sql语句,提供开发的效率。 2) Mybatis的动态SQL标签主要由以下几类: If语句(简单的条件判断) Choose(when/otherwise),相当于java语言中的switch,与jstl中choose类似 Trim(对包含的内容加上prefix,或者suffix) Where(主要是用来简化SQL语句中where条件判断,能智能的处理and/or 不用担心多余的语法导致的错误) Set(主要用于更新时候) Foreach(一般使用在mybatis in语句查询时特别有用)
点赞 4
评论 1
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
05-12 17:22
美团_测试开发
租房避坑指南
本篇文章汇集了我在北京三年的租房踩坑经验,找实习或者校招入职的小伙伴可以看一下。提前找房子的时间如果是找中介一般提前三五天或者一周左右就可以了。如果是自己找,那一般要提前一周左右就得开始看,从网上看或者找转租等等。找房子渠道自如链家等:这种属于大厂下来做租房生意,好处是有保障不会被坑的很厉害,有大问题可以直接去平台投诉。缺点只有一个那就是比较贵,想稳定那就得多给钱。小某书:小某书或者某音等等也可以找到一些资源,但是分为两种,一种是中介在上面放的房源,另外一种就是真实的转租。中介:中介的好处就是房源很多,你想找哪里的房子直接多加几个中介就行了然后房子的价格也不会太贵,因为选择多可以根据自己的情况...
打破求职信息差
点赞
评论
收藏
分享
05-10 22:29
杭州电子科技大学 大数据开发工程师
实习时候,听到这句话 我沉默了
他说他最怕听到的是mentor跟他说:"你挺适合做这行的。"不是批评,不是否定,是这句听起来像夸奖的话。因为每次听到这句,他就会多想:适合是什么意思?是真的觉得我不错,还是在安慰我?我交出去的那个东西,他是真的满意还是凑合用了?实习结束会不会留我?我是不是真的有这个能力?一句话能让他反复想三天。我后来发现,实习生最怕的往往不是被骂,被骂至少知道哪里错了,改就行。最怕的是那种模糊的、善意的、说不清好坏的反馈。让你既不能放心,也不能死心,就悬在那里。实习的时候太想证明自己了,所以对每一句话都过度解读。mentor随口一句"嗯还不错",能高兴半天。随口一句&q...
实习时最怕听到的一句话
点赞
评论
收藏
分享
不愿透露姓名的神秘牛友
昨天 14:16
双非本鼠鼠被字节回捞了,uu们接好运吧!
到现在我都觉得这事儿不!真!实!(是的,昨天知道后一宿都没咋睡我心理素质真是差)先说背景,27届双非二本,计算机,没竞赛没大厂经历,简历能写的就一个课设和一段很水的中厂实习。字节暑期实习开了,我抱着试一试的心态投了一个后端岗,连测评链接都没收到,简历池里彻底沉底。我当时还截图发了个朋友圈自嘲。后来我老老实实投中厂,面了七八家,拿了一个二线厂的暑期offer,打算认命去搬砖了。直到上周。字节HR突然加我微信,说之前那个岗有人鸽了实习,问我6月能不能到岗。简历他们重新看过,可以直接进部门面,跳过笔试。我以为是钓鱼,结果第二天真给我约了,技术面+hr面一天搞完,三天后oc电话打过来——暑期实习offer就这么下来了我跟我妈打电话报喜,我妈问我"是不是骗子啊,让你交钱没"。我爸说让我先别签协议,怕是培训贷套路。我跟他们解释了半天才信。舍友也炸了,问我咋准备的。我能咋准备,我啥也没准备,纯纯是别人鸽了捡漏。现在已经把那个二线offer推了,下周去字节报道。心情有点复杂,一边爽一边虚,怕自己干不下被开了😅但管他呢,先去了再说。学历这事儿,封死的门偶尔也会留条缝,别太早放弃自己!我是个幸运的人,希望看到我帖子的人都这么幸运!!!
战争学院:
你妈妈第一反应是骗子,我妈妈第一反应是培训贷,全国家长系统是统一的吗哈哈哈
点赞
评论
收藏
分享
05-08 19:58
南京邮电大学 Java
滴滴一面4月17号(已挂)
请先做一个简单的自我介绍。挑一个你觉得做得最好的项目,详细介绍一下。你觉得这个项目里面最有挑战性的部分是哪一块?你在参考开源/现有方案的过程中,自己做了哪些改进?在开发过程中,有遇到过上下文过大的问题吗?怎么处理?你的长期记忆和短期记忆分别是怎么做的?你提到的“强约束信息”会不会越积越多?如果越来越多,你怎么处理?你简历里写了熟悉 MySQL,MySQL 在你的项目里主要用在哪些场景?具体讲一下你项目里的数据一致性场景。你说的最终一致性,具体是怎么实现的?如果消息发送失败了,这个任务到底算成功还是失败?在发送消息之前,你是不是还做了消息持久化之类的处理?具体流程是什么?Redis 扣库存成功之...
查看28道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
我进字节她考编,明知要分手但确没人敢开口
1.8W
2
...
如何利用skill写出一份好简历
8457
3
...
全网征集:实习/春招投递进度记录,最高可得20元现金!
8332
4
...
从java跑路做ai了
8208
5
...
女朋友说先各自工作一年再决定,啥意思?
6574
6
...
双非本鼠鼠被字节回捞了,uu们接好运吧!
5905
7
...
被妈妈说的感觉自己好没用啊😭
4864
8
...
离开华为一年多,说说我的真实感受
4828
9
...
离大谱!入职第二周mentor跳槽了😭
4218
10
...
27游戏客户端暑期化蛆总结
3739
创作者周榜
更多
正在热议
更多
#
我的求职总结
#
479053次浏览
6781人参与
#
我是XXX,请攻击我最薄弱的地方
#
89599次浏览
617人参与
#
27届实习投递记录
#
73174次浏览
815人参与
#
投格力的你,拿到offer了吗?
#
187297次浏览
912人参与
#
26届春招投递记录
#
11178次浏览
84人参与
#
产品面经
#
297267次浏览
2217人参与
#
海信求职进展汇总
#
105688次浏览
424人参与
#
中电科13所进度交流
#
6767次浏览
38人参与
#
这些公司卡简历很严格
#
107127次浏览
484人参与
#
AI让海力士市值突破9000亿美元
#
8847次浏览
111人参与
#
拼多多工作体验
#
61322次浏览
431人参与
#
风评不好的公司,你会去吗?
#
155033次浏览
705人参与
#
牛油的搬砖plog
#
205642次浏览
1328人参与
#
入职第四天,心情怎么样
#
56332次浏览
474人参与
#
哪一瞬间让你觉得“这班不如不上”
#
46627次浏览
278人参与
#
什么专业适合考公
#
72266次浏览
438人参与
#
我想象的工作vs实际工作
#
710182次浏览
5053人参与
#
小厂实习有必要去吗
#
94137次浏览
447人参与
#
得物app工作体验
#
67292次浏览
119人参与
#
聊聊这家公司值得去吗
#
963929次浏览
4797人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务