面试题首页 > Mybaits面试题

Mybaits常见面试题

001简单介绍下Mybatis?

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

002Mybatis编程步骤 ?

1.创建SqlSessionFactory
2.通过SqlSessionFactory创建SqlSession
3.通过SqlSession执行数据库操作
4.调用SqlSession的commit()方法提交事务
5.调用SqlSession的close()方法关闭会话

003MyBatis的优点?

1.基于SQL语句编程,相对灵活,接触sql与程序代码的藕合,便于统一管理,支持写动态sql语句并可重复使用;
2.减少代码量,消除了冗余代码;
3.数据库兼容能够与Spring集成;
4.提供映射标签支持字段关系映射;

004MyBatis的缺点?

1.SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL的功底有一定要求;
2.SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

005MyBatis中$和#的区别?

1.传入的参数在SQL中显示不同
#传入的参数在SQL中相当占位符,#方式能够很大程度防止sql注入;而$传入的参数在SQL中相当字符串,$方式无法防止Sql注入.
--------------------------------------------
例:使用以下SQL
1)select id,name,age from student where name=#{name};
2)select id,name,age from student where name =${name}:
当我们传递的参数name为 "‘zs    ' or 1=1" 时,上述 sql分别会解析为:
select id,name,age from student where id ="‘zs' or 1=1"
select id,name,age from student where id =‘zs' or 1=1
这样第二条sql语句的会查出所有学生的信息,这是非常不安全的,有sql注入的风险。所以#可以防止SQL注入的风险(语句的拼接);但$无法防止Sql注入。
------------------------------------------------------
2.$方式一般用于传入数据库对象,例如传入表名。
3.大多数情况下还是经常使用#,但有些情况下必须使用$,例:MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。

006Mybatis的一级、二级缓存?

1.一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Mabits默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。 每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。
2.二级缓存 二级缓存是mapper级别的,Mybatis默认是没有开启二级缓存的。 第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放代该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。 如果调用相同namespace下的mapepr映射文件中增删改sql,并执行了commit操作,此时会情况该

007Mybatis 是如何进行分页的?分页插件的原理是什么?

Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内 存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分 页功能,也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件 的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物 理分页语句和物理分页参数。举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

008Mapper动态代理的实现原理?

Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法。

009MyBatis是否支持延迟加载?如果支持,它的实现原理是什么?

1)在MyBatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。MyBatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。
2)它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

010MyBatis与Hibernate有哪些不同?

1.Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。
2.Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
3.Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。

011IBatis 和 MyBatis 在细节上有哪些不同?

1)在 sql 里面变量命名有原来的#变量# 变成了#{变量}
2)原来的$变量$变成了${变量}
3)原来在 sql 节点里面的 class 都换名字交 type
4)原来的 queryForObject queryForList 变成了 selectOne selectList
5)原来的别名设置在映射文件里面放在了核心配置文件里
1. IBatis 里面的核心处理类交 SqlMapClient,MyBatis 里面的核心处理类叫做 SqlSession

目录

返回顶部