Mybatis

"Mybatis是一个轻量级的ORM框架,简化了JDBC操作,提供动态SQL和事务管理。其优点在于灵活性高,适合业务多变、性能要求高的系统。但需要手动编写SQL,依赖特定数据库,不便于移植。Mybatis与Hibernate的主要区别在于,前者是半自动ORM,后者全自动,支持不同数据库方言。#{}
摘要由CSDN通过智能技术生成

1. Mybatis优缺点和适用场景
Mybatis是个轻量级的ORM框架,内部封装了JDBC操作,为我们省去了打开事务,提交,关闭事务等操作,简化开发。
优点:轻量级,简单易学;提供了JDBC操作,事务管理,插件接口等,简化开发;动态SQL的编写,灵活度高;sql语句在xml中,与业务代码解耦,方便复用。
缺点:需要手动写sql,对sql能力有一定要求;sql的编写依赖于数据库,不方便移植,不能随意切换数据库。
Mybatis其灵活的Dao层解决方案,非常适合业务灵活,需求多变,性能要求高的系统。
2. Mybatis和Hibernate的区别
Mybatis:半自动ORM框架,需要手动写SQL;灵活性高;sql编写依赖于数据库,不方便移植;
Hibernate:全自动ORM框架,可以自动通过关系映射生成SQL;Hibernate可根据不同的数据库方言生成对应的sql,可移植性强;
3. #{}和${}的区别
#{}是预编译处理,Mybatis在处理#{}时会替换成占位符?,然后在通过PreparedStatement的set方法来赋值,可以防止sql注入;
${}的字符串替换,Mybatis在处理时会直接替换为变量的值,无法防止sql注入;但是在特殊情况下,比如根据规则查询不同的数据库表,需要拼接到sql语句中,需要开发人员在业务代码中严格校验,避免sql注入。
4. Dao接口的工作原理是什么?Dao接口里面的方法,参数不同时,可以被重载吗?
每个Dao接口的全限名对应一个xml映射文件中的namespace命名空间的值;
接口的方法名,对应xml映射文件中的MappedStatement的id,方法内的参数就是传递给sql的参数;
通过全限名+方法名拼接字符串能够唯一定位到一个MappedStatement,所以方法不能被重载;
Mybatis中每个标签会被解析成一个MappedStatement对象,Dao接口的工作原理就是JDK动态代理,Mybatis在工作时会通过JDK动态代理为每个Dao接口生成对应的代理对象,拦截其接口方法,转而执行对应的MappedStatement所对应的sql,并将sql执行结果返回。
5. Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
通过列名和属性名的映射关系,用反射机制生成对象,并对其属性进行赋值,如果没有对应的映射关系,就没法赋值;
映射形式:通过resultMap,配置列名和属性名的关系;或者通过sql查询出的列,设置别名,与对象属性值对应。
6. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
支持
mybatis仅支持对association关联对象和collection关联集合对象的延迟加载,通过配置文件里的lazyLoadingEnabled进行设置是否开启。
它的原理是通过Cglib生成代理对象,当调用到里面的获取属性的方法时,进行拦截判断是否为null,如果为null,就去执行事先存好的查询关联对象的sql去查询加载,返回对应的对象属性。
7. Mybatis的一级、二级缓存
Mybatis默认开启一级缓存,已HashMap的结构,存放在内存中,作用域为sqlSession级别的,当调用sqlSession的flush和close方法时,会清空缓存;
二级缓存需要手动开启,默认在configuration的配置中是开启的,需要在相应的mapper映射文件中通过cache标签来开启。作用域为同一个namespace,可以配置缓存的存储位置,如redis,ehcache等;
8. 简述Mybatis的插件运行原理,以及如何编写一个插件。
Mybatis插件仅支持编写StatementHandler,ResultHandler,ParameterHandler和Executor这4个接口的插件,通过JDK的动态代理,为需要拦截的接口生成代理对象,每当执行到该接口的方法时,就会进入拦截方法,执行增强逻辑。
编写一个插件,首先实现Mybatis的Intercept接口,实现intercept()方法,在里面获取到要执行的sql,实现我们自定义的逻辑。在插件上面配置注解,注明拦截哪个接口的哪些方法。最后把插件配到配置文件中。
9. Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
Mybatis动态sql可以让我们在xml文件中,已标签的方式动态编写sql,通过标签里逻辑判断来动态拼接sql;
动态sql标签有:if、where、set、foreach、trim、choose、when、otherwise、bind
其执行原理是,mybatis通过OGNL计算sql标签中表达式的值,通过对值的判断动态拼接sql。
10. Mybatis都有哪些Executor执行器?它们之间的区别是什么?
SimpaleExecutor:默认的执行器。每次update或者select都会开启一个Statement对象,使用完后就关闭;
ReuseExecutor:执行update或select,会以sql作为key去查找Statement对象,有就使用,没有再创建,用完后不关闭,而是放入map中,缓存下来。可重复使用;
BatchExecutor:批处理执行器,缓存多个statement对象,将多个sql添加到批处理中,统一执行。
11. MyBatis实现一对一、一对多有几种方式?具体怎么操作的?
通过resultMap中的association、collection节点配置来完成。
12. Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis通过RowRounds对象分页,对ResultSet结果集进行内存分页,而非物理分页。可以通过sql里面加物理分页参数,或者通过插件拦截修改sql进行物理分页。
分页插件通过实现插件接口,在插件的拦截方法内拦截需要执行的sql,拼接分页参数,进行物理分页。
13. Mybatis框架源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值