登陆

24道Mybatis常见面试题总结及答案!

admin 2019-05-18 168人围观 ,发现0个评论

1、什么是Mybatis?

1.Mybatis是一个半ORM(方针联系映射)结构,它内部封装了JDBC,开发时只需求重视SQL句子自身,不需求花费精力去处理加载驱动、创立衔接、创立statement等冗杂的进程。程序员直接编写原生态sql,能够严格控制sql履行功用,灵敏度高。

2.MyBatis 能够运用 XML 或注解来装备和映射原生信息,将 POJO映射成数据库中的记载,避免了简直一切的 JDBC 代码和手动设置参数以及获取效果集。

3.经过xml 文件或注解的办法即将履行的各种 statement 装备起来,并经过java方针和 statement中sql的动态参数进行映射生成终究履行的sql句子,最后由mybatis结构履行sql并将效果映射为java方针并回来。(从履行sql到回来result的进程)。

2、Mybaits的长处:

1.依据SQL句子编程,适当灵敏,不会对应用程序或许数据库的现有规划形成任何影响,SQL写在XML里,免除sql与程序代码的耦合,便于统一管理;供给XML标签,支撑编写动态SQL句子,并可重用。

2.与JDBC比较,减少了50%以上的代码量,消除了JDBC许多冗余的代码,不需求手动开关衔接;

3.很好的与各种数据库兼容(由于MyBatis运用JDBC来衔接数据库,所以只需JDBC支撑的数据库MyBatis都支撑)。

4.能够与Spring很好的集成;

5.供给映射标签,支撑方针与数据库的ORM字段联系映射;供给方针联系映射标签,支撑方针联系组件保护。

3.MyBatis结构的缺陷:

1.SQL句子的编写作业量较大,特别当字段多、相关表多时,对开发人员编写SQL句子的功底有必定要求。

2.SQL句子依赖于数据库,导致数据库移植性差,不能随意替换数据库。

4、MyBatis结构适用场合:

1.MyBatis专心于SQL自身,是一个满足灵敏的DAO层解决方案。

2.对功用的要求很高,或许需求改变较多的项目,如互联网项目,MyBatis将是不错的挑选。

5、MyBatis与Hibernate有哪些不同?

1.Mybatis和hibernate不同,它不完全是一个ORM结构,由于MyBatis需求程序员自己编写Sql句子。

2.Mybatis直接编写原生态sql,能够严格控制sql履行功用,灵敏度高,十分合适对联系数据模型要求不高的软件开发,由于这类软件需求改变频频,一但需求改变要求敏捷输出效果。可是灵敏的条件是mybatis无法做到数据库无关性,假如需求完结支撑多种数据库的软件,则需求自界说多套sql映射文件,作业量大。

3.Hibernate方针/联系映射能力强,数据库无关性好,关于联系模型要求高的软件,假如用hibernate开发能够节约许多代码,进步功率。

6、#{}和${}的差异是什么?

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

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

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

运用#{}能够有用的避免SQL注入,进步体系安全性。

7、当实体类中的特点名和表中的字段名不相同 ,怎样办 ?

第1种: 经过在查询的sql句子中界说字段名的别号,让字段名的别号和实体类的特点名共同。

第2种: 经过 来映射字段名和实体类特点名的一一对应的联系。

8、 含糊查询like句子该怎样写?

第1种:在Java代码中增加sql通配符。

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

9、一般一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的作业原理是什么?Dao接口里的办法,参数不一起,办法能重载吗?

Dao接口即Mapper接口。接口的全限名,便是映射文件中的namespace的值;接口的办法名,便是映射文件中Mapper的Statement的id值;接口办法内的参数,便是传递给sql的参数。

Mapper接口是没有完结类的,当调用接口办法时,接口全限名+办法名拼接字符串作为key值,可唯必定位一个MapperStatement。在Mybatis中,每一个 标签,都会被解析为一个MapperStatement方针。

举例: com.mybat24道Mybatis常见面试题总结及答案!is3.mappers.StudentDao.findStudentById,能够仅有找到namespace为 com.mybatis3.mappers.StudentDao下面 id 为 findStudentById 的 MapperStatement。

Mapper接口里的办法,是不能重载的,由所以运用 全限名+办法名 的保存和寻觅战略。Mapper 接口的作业原理是JDK动态署理,Mybatis24道Mybatis常见面试题总结及答案!运转时会运用JDK动态署理为Mapper接口生成署理方针proxy,署理方针会阻拦接口办法,转而履行MapperStatement所代表的sql,然后将sql履行效果回来。

10、Mybatis是怎样进行分页的?分页插件的原理是什么?

Mybatis运用RowBounds方针进行分页,它是针对ResultSet效果集履行的内存分页,而非物理分页。能够在sql内直接书写带有物理分页的参数来完结物理分页功用,也能够运用分页插件来完结物理分页。

分页插件的基本原理是运用Mybatis供给恒的插件接口,完结自界说插件,在插件的阻拦办法内阻拦待履行的sql,然后重写sql,依据dialect方言,增加对应的物理分页句子和物理分页参数。

11、Mybatis是怎样将sql履行效果封装为方针方针并回来的?都有哪些映射办法?

第一种是运用 标签,逐必界说数据库列名和方针特点名之间的映射联系。

第二种是运用sql列的别号功用,将列的别号书写为方针特点名。

有了列名与特点名的映射联系后,Mybatis经过反射创立方针,一起运用反射给方针的特点逐个赋值并回来,那些找不到映射联系的特点,是无法完结赋值的。

12、怎样履行批量刺进?

首要,创立一个简略的insert句子:

然后在java代码中像下面这样履行批处理刺进:

13、怎样获取主动生成的(主)键值?

insert 办法总是回来一个int值 ,这个值代表的是刺进的行数。

假如选用自增加战略,主动生成的键值在 insert 办法履行完后能够被设置到传入的参数方针中。

示例:

14、Mybatis动态sql有什么用?履行原理?有哪些动态sql?

Mybatis动态sql能够在Xml映射文件内,以标签的办法编写动态sql,履行原理是依据表达式的值 完结逻辑判别并动态拼接sql的功用。

Mybatis供给了9种动态sql标签: trim|where|set|foreach|if|choose|when|otherwise|bind。

15、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

答: ,加上动态sql的9个标签,其间 为sql片段标签,经过 标签引进sql片段, 为不支撑自增的主键生成战略标签。

16、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否能够重复?

不同的Xml映射文件,假如装备了namespace,那么id能够重复;假如没有装备namespace,那么id不能重复;

原因便是namespace+id是作为Map 的key运用的,假如没有namespace,就剩余id,那么,id重复会导致数据相互掩盖。有了namespace,天然id就能够重复,namespace不同,namespace+id天然也就不同。

17、为什么说Mybatis是半主动ORM映射东西?它与全主动的差异在哪里?

Hibernate归于全主动ORM映射东西,运用Hibernate查询相关方针或许相关调集方针时,能够依据方针联系模型直接获取,所以它是全主动的。而Mybatis在查询相关方针或相关调集方针时,需求手动编写sql来完结,所以,称之为半主动ORM映射东西。

18、MyBatis完结一对一有几种办法?详细怎样操作的?

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 经过在resultMap里边装备association节点装备一对一的类就能够完结;

嵌套查询是先查一个表,依据这个表里边的效果的 外键id,去再别的一个表里边查询数据,也是经过association装备,但别的一个表的查询经过select特点装备。

19、MyBatis完结一对多有几种办法,怎样操作的?

有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,经过在resultMap里边的collection节点装备一对多的类就能够完结;嵌套查询是先查一个表,依据这个表里边的 效果的外键id,去再别的一个表里边查询数据,也是经过装备collection,但别的一个表的查询经过select节点装备。

20、Mybatis是否支撑推迟加载?假如支撑,它的完结原理是什么?

答:Mybatis仅支撑association相关方针和collection相关调集方针的推迟加载,association指的便是一对一,collection指的便是一对多查询。在Mybatis装备文件中,能够装备是否启用推迟加载lazyLoadingEnabled=true|false。

它的原理是,运用CGLIB创立方针方针的24道Mybatis常见面试题总结及答案!署理方针,当调用方针办法时,进入阻拦器办法,比方调用a.getB().getName(),阻拦器invoke()办法发现a.getB()是null值,那么就会独自发送事前保存好的查询相关B方针的sql,把B查询上来,然后调用a.setB(b),所以a的方针b特点就有值了,接着完结a.getB().getName()办法的调用。这便是推迟加载的基本原理。

当然了,不光是Mybatis,简直一切的包括Hibernate,支撑推迟加载的24道Mybatis常见面试题总结及答案!原理都是相同的。

21、Mybatis的一级、二级缓存:

1)一级缓存: 依据 PerpetualCache 的 HashMap 本地缓存,其存储效果域为 Session,当 Session flush 或 close 之后,该 Session 中的一切 Cache 就将清空,默许翻开一级缓存。

2)二级缓存与一级缓存其机制相同,默许也是选用 PerpetualCache,HashMap 存储,不同在于其存储效果域为 Mapper(Namespace),而且可自界说存储源,如 Ehcache。默许不翻开二级缓存,要敞开二级缓存,运用二级缓存特点类需求完结Serializable序列化接口(可用来保存方针的状况),可在它的映射文件中装备

3)关于缓存数据更新机制,当某一个效果域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默许该效果域下一切 select 中的缓存将被 clear。

22、什么是MyBatis的接口绑定?有哪些完结办法?

接口绑定,便是在MyBatis中恣意界说接口,然后把接口里边的办法和SQL句子绑定, 咱们直接调用接口办法就能够,这样比起原来了SqlSession供给的办法咱们能够有愈加灵敏的挑选和设置。

接口绑定有两种完结办法,一种是经过注解绑定,便是在接口的办法上面加上 @Select、@Update等注解,里边包括Sql句子来绑定;别的一种便是经过xml里边写SQL来绑定, 在这种情况下,要指定xml映射文件里边的namespace有必要为接口的全途径名。当Sql句子比较简略时分,用注解绑定, 当SQL句子比较复杂时分,用xml绑定,一般用xml绑定的比较多。

23、运用MyBatis的mapper接口调用时有哪些要求?

1.Mapper接口办法名和mapper.xml中界说的每个sql的id相同;

2.Mapper接口办法的输入参数类型和mapper.xml中界说的每个sql 的parameterType的类型相同;

3.Mapper接口办法的输出参数类型和mapper.xml中界说的每个sql的resultType的类型相同;

4.Mapper.xml文件中的namespace便是mapper接口的类途径。

24、简述Mybatis的插件运转原理,以及怎样编写一个插件。

答:Mybatis仅能够编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis运用JDK的动态署理,为需求阻拦的接口生成署理方针以完结接口办法阻拦功用,每逢履行这4种接口方针的办法时,就会进入阻拦办法,详细便是InvocationHandler的invoke()办法,当然,只会阻拦那些你指定需求阻拦的办法。

编写插件:完结Mybatis的Interceptor接口并复写intercept()办法,然后在给插件编写注解,指定要阻拦哪一个接口的哪些办法即可,记住,别忘了在装备文件中装备你编写的插件。

共享免费学习材料

针关于还会预备免费的Java架构学习材料(里边有高可用、高并发、高功用及分布式、Jvm功用调优、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构材料)

为什么某些人会一向比你优异,是由于他自身就很优异还一向在继续尽力变得更优异,而你是不是还在满足于现状心里在窃喜!期望读到这的您能转发和重视下,今后还会更新技能干货,谢谢您的支撑!

材料免费收取办法:转发后,重视我私信关键词【架构材料】收取!

材料免费收取办法:转发后,转发后重视我后台私信关键词【架构材料】获取!

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP