1.企业对开发者mybatis的要求是怎样的

作为一名java开发工程师,对我而言,最简略的了解技能发展趋势的办法是没事儿多看看招聘需求。
结业后做了几年开发,到了需求记笔记,写博客的时分了,由于总结关于做技能的真的很重要;所以看了看招聘需求,并在网上查了查一些抢手的面试题,并结合了本身的面试阅历,做了一些关于学习mybatis关键的总结。

企业要求:

mybatis有深化的运用和优化经历,把握它的原理机制,有结构开发或重构经历者优先考虑。(这应该便是所谓通晓)

面试常问的技能点:

什么是orm,说说你对mybatis的了解?
在联系型数据库中,将表与java目标做了一个映射,经过操作java目标来完结对表的操作,使java开发者愈加专心于java代码与流程的开发,更靠近面向目标的开发思维。而mybatis是一个半主动的orm结构,内部对jdbc进行了多层的封装与扩展,经过xml或许注解将接口与sql进行相关与定位,所以需求开发者编写原生sql,而且灵敏度更高,更合适灵敏开发与产品的快速迭代。
jdbc的缺陷是什么,mybatis是怎样处理mybatis缺陷的?
jdbc需求手动创立和封闭数据库的衔接,手动解析成果集,简直全都需求手动处理,冗余代码极多;mybatis经过xml映射,使开发者重视于接口的规划与sql的编写,至于数据库的驱动和衔接的创立毁掉以及衔接池的运用,都交给结构自己完结。
有哪些动态sql标签,动态sql的原理是什么?
mybatis供给了9种动态标签:trim,where,set,foreach,if,choose,when,otherwise,bind;
经过这些标签能够使编写的sql能够做一些简略的判别,本质上是一种sql的拼接。
含糊查询 like 句子该怎样写?
将%写在java程序的参数中参数上,然后xml文件中运用#{}做sql拼接;
固定写法,写在xml中:%${value}%。
#{}和${}的差异是什么?
看运行日志文件能够发现:
#代表preparestatement,生成?占位符;
$代表statement,传递的便是参数,拼接的sql;
说说mybatis的接口绑定?
将接口与sql进行绑定,运用的时分,只需调用接口的办法就能够了;
能够在办法上运用select,update等注解,运用起来比较便利,但合适表简略,事务简略的状况;
也能够运用xml装备的办法,dao的xml装备文件要与dao文件在同一个目录,而且xml文件中要运用<mapper namespace="">来指定dao文件,id要对应接口的办法名,适用于sql杂乱的状况。
dao接口的作业原理是什么,里边的办法能够重载吗?
不能重载,由于是依据全类名+办法名进行sql定位的,办法重载会使xml呈现判别过错;
dao的作业原理是jdk的动态署理,sqlSession经过getMapper()办法生成接口的署理目标,署理目标里的办法运用sqlsession里经过全类名+办法名和办法定位到xml中的sql句子,依据xml的select,update标签,判别运用jdbc里的execute办法履行。
刺进数据时,怎样获取主动生成的id值?
原理:在履行insert后,履行一个select last_insert()句子;
<insert><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"></></>;
怎样才能让接口中的办法传递多个参数?
1.接口办法中直接传,在xml中运用#{0},#{1},#{2}来代表参数的下标;
2.接口中运用@param注解,然后在xml顶用#{}来正常表明;
3.封装成一个map;
假如实体类特色与sql的字段名不同,有哪些处理办法?
1.编写sql时,查询的字段运用别号;
2.<resultMap>标签做映射;
3.sql查询的成果集为设置为map,然后在java中设置值;
4.当运用注解时,能够运用@Results和@Result标签设置对应联系;
5.设置Configuration目标的setMapUnderscoreToCamelCase办法:当特色遵从驼峰命名法而且字段运用下划线,经过修正装备能够做到特色的主动映射;

mybatis都有哪些Executor履行器?它们之间的差异是什么?

mybatis有三种根本的Executor履行器,SimpleExecutor、ReuseExecutor、BatchExecutor;
SimpleExecutor:每履行一次update或select,就敞开一个statement目标,用完马上封闭statement目标;
ReuseExecutor:履行update或select,以sql作为key查找statement目标,存在就运用,不存在就创立,用完后,不封闭statement目标,而是放置于Map<String, Statement>内,供下一次运用。简言之,便是重复运用statement目标;
BatchExecutor:履行update(没有select,JDBC批处理不支持select),将一切sql都增加到批处理中(addBatch()),等候一致履行(executeBatch()),它缓存了多个statement目标,每个statement目标都是addBatch()结束后,等候逐个履行executeBatch()批处理。与JDBC批处理相同;
Executor的这些特色,都严厉约束在sqlSession生命周期范围内,能够在xml中装备sqlsession的ExecutorType。

怎样批量刺进,能回来生成的主键列表吗?

 能回来,连jdbc都能;
1.for循环insert
2.sqlsession设置ExecutorType.BATCH,然后正常运用for循环insert
3.for循环生成一个list,然后调用insertBatch(),在xml<insert><foreach collection ="list" item="目标" separator =","></></>
完结一对多有哪几种办法,完结一对一又有哪几种办法?
一对一:
从表包括主表的实体目标的引证,在<resultMap>中设置association;
默许是当即加载;
一对多:
主表设置一个从表的list特色,然后在<resultMap>中设置collection;
一般设置为推迟加载,原理是用cglib生成成果的署理目标,然后当调用署理目标的list特色时,判别署理目标的list是否为null,假如为null就查询list调集,推迟加载的特色为lazyLoadingEnabled=true
了解mybatis的缓存机制吗?
一级缓存:
sqlsession的缓存,存入的是目标
接连两次查询,成果为同一个目标,由于只恳求了一次数据库,将查询成果存入到sqlsession的map区域中,查询时先查询缓存
清空缓存的办法:sqlsession.clearCache()
当调用了sqlsession的删去修正增加,close,commit等办法,主动删去缓存
二级缓存:
sqlFactory的缓存,存的是相似json的数据,不是目标
创立新目标,将数据写进目标中,所以目标要完结序列化接口
由同一个sqlsessionfactory创立的sqlsession目标同享