mybatis面试题

1、什么是Mybatis

Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。

MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

 

2、Mybaits的优点

基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;

很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。

能够与Spring很好的集成;

提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

 

3、Mybatis的缺点

SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

 

4、Mybatis使用场景

MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。

对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

 

5、JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的

JDBC数据库连接创建和销毁很频繁,严重影响到系统性能,MyBatis支持连接池,通过连接池来管理数据库连接,还可以注入第三方的数据源:(druid、dbcp、c3p0...)。

SQL语句写在Java代码中不易维护,实际应用SQL语句变动可能比较大,MyBatis通过配置文件来松散SQL与Java代码之间的耦合度,灵活轻巧。

SQL语句传参麻烦,因为where条件可能多也可能少,占位符需要和参数一一对应,MyBatis就能够通过动态SQL解决这点。

结果集解析麻烦,JDBC需要自己遍历结果集获取数据,过程需要自己编写代码,Mybatis可以直接将SQL执行结果映射成JavaBean。

 

6、MyBatis编程步骤是什么样的

创建SqlSessionFactory获取SqlSession,通过SqlSession来执行数据库操作,通过session.commit、rollback操作事务。如果集成到Spring,这些步骤我们都不用关心,由Spring来完成Bean生命周期的管理,通过声明式事务完成事务管理。

 

7、MyBatis与Hibernate有哪些不同?

1.hibernate是一个完全的ORM框架,hibernate完全是用面向对象的方式执行数据库操作,SQL语句都不需要开发人员关心,对JDBC实现了重量级的封装。mybatis则不是完整的ORM框架,仅仅是对JDBC进行一次轻量级封装,需要开发人员自己编写SQL语句,自行管理SQL结果和JavaBean的映射。

2.就完全掌握而言:

    a. mybatis的门槛较低,开发人员直接编写原生态SQL,可以灵活控制SQL性能,很适合对关系型数据库要求不高的软件开发,但灵活的前提是mybatis做不到数据库无关性,对不同的数据库需要编写多套SQL映射文件,工作量大。

    b. hibernate数据库无关性很好,不需要开发人员关注SQL语句,更不需要关心是哪个数据库,但是没法对SQL进行优化。hibernate学习门槛高,要求熟悉O/R映射,性能和对象模型之间如何权衡,以及怎么用好hibernate都需要有很强的.经验能力才行。

 

8、使用MyBatis的mapper接口调用(接口映射)时有哪些要求

① Mapper接口方法名和mapper.xml中定义的每个sql的id相同 

②  Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同 

③  Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同 

④  Mapper.xml文件中的namespace即是mapper接口的类路径

使用注解时 只需要添加 @Select @Update @Delete @Insert标注添加sql即可 

 

9、SqlMapConfig.xml中配置有哪些内容

常见的有properties(数据库连接四要素文件),settings配置,设置二级缓存之类的,typeAliases类型别名,environment环境信息配置,transactionManager事务管理器,datasource数据源,mappers映射器等等。

 

10、简单的说一下MyBatis的一级缓存和二级缓存

一级缓存指的是基于session的缓存,同一个session中相同的查询只会执行第一次,往后都会从缓存中取,一级缓存在sqlSession关闭后失效,不能跨session,默认开启。

二级缓存是SqlSessionFactory级别的,同一个SqlSessionFactory内的相同的查询只会执行一次,默认不开启,需要在配置文件settings标签中开启,可以跨session。

 

11、spring集成MyBatis的方式

添加mybatis依赖 --> 指定配置文件位置,配置dataSource --> 配置SqlSessionFactoryBean然后注入dataSource --> 配置SqlSessionTemplate然后通过构造器注入SqlSessionFactoryBean --> 配置MapperScannerConfigurer扫描映射接口所在的包 --> 配置Spring事务管理。

 

12、#{}和${}的区别是什么

${}这种方式是静态文本替换,用在SQL语句上相当于字符串拼接,会有SQL注入的风险。

#{}这种方式就是使用?作为占位符,在执行SQL之前再按照顺序将占位符替换成参数,其实就是JDBC里的PreparedStatement,会自动给字符类型的参数加双引号,有效防止SQL注入。

 

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

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写(limit)带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

最理想的分页方案应该是逻辑分页 + 物理分页。

 

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

懒加载是结果集中对象映射的一种加载方案,用在association一对一、collection多对多映射上,是个开关。开启懒加载则意味着按需加载,访问到关联对象时才会发起SQL,关闭懒加载则是在实例化过程中就把内部的JavaBean实例化。mybatis默认没有配置懒加载,需要在全局配置中设置。 

原理:使用CGLIB动态代理实现,创建目标对象的代理,当调用目标方法时进入拦截器。比如调用a.getB().getName(),拦截器invoke()方法时发现getB是个null值,那么就会发送结果集对象映射中定义的SQL语句,将B查出来并赋值,然后B就不是null了,这就是懒加载的过程。

 

15、Mybatis中如何执行批处理

使用BatchExecutor完成批处理。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值