1.什么是mybatis
mybatis是持久层半自动ORM框架,底层封装了JDBC,我们做开发的可以直接使用原生sql,可以灵活地控制sql语句的执行性能。我们的项目持久层使用mybatis框架,在DAO层,我们只需创建接口和mapper文件,通过mapper中的namespace进行绑定,接口中写抽象方法,mapper中在标签中写sql语句,动态参数通过#{}进行传参。
2.为什么说mybatis是半自动ORM框架?
相比springDataJpa、hibernate等全自动框架,我们使用Mybatis的时候需要手写sql,而加载驱动、创建关闭连接、创建statement等过程,mybatis替我们做了。
3.mybatis的优点
相比使用原生JBDC操作数据库,使用Mybatis减少了大量的代码。相比全自动框架,mybatis可以更灵活编写sql。并且mybatis可以很好地兼容各种数据库,很便捷地与spring集成。
4.mybatis缺点
mybatis对开发人员的sql功底有一定要求。因为sql依赖数据库,导致数据库移植性差,不能随意切换数据库。
5.mybatis适用的场景
适用于对性能要求较高,需求灵活多变的项目。
6.Mybatis动态sql有什么用?执行原理?有哪些动态sql?
Mybatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接sql的功能
Mybatis提供了9种动态sql标签:
trim | where | set | foreach | if | choose | when | otherwise | bind
7.Mybatis的一级、二级缓存 ?
1)一级缓存: 存储作用域为 Session,自动开启。
2)二级缓存其存储作用域为 Mapper(Namespace)。默认不打开二级缓存;
8.Mybatis是如何进行分页的?分页插件的原理是什么?
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
PageHelper是一款犀利的Mybatis分页插件,使用了这个插件之后,分页开发起来更加简单容易。
9.#{}和${}的区别是什么?
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理 时 , 就 是 把 {}时,就是把 时,就是把{}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
10.如何获取自动生成的(主)键值?
insert 方法总是返回一个int值 ,这个值代表的是插入的行数。如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中。
示例:
<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>
insert into names (name) values (#{name})
</insert>
11.为什么mybatis的mapper没有实现类?底层是怎么实现的?
Mybatis 提供了 Mapper接口的代理对象,在执行 Mapper接口方法时,实际执行的是Mybatis的代理对象,代理对象在 invoke 方法内获取 Mapper接口类全名+方法全名 作为statement的ID,然后通过ID去Statement匹配注册的SQL,然后使用 SqlSession 执行这个 SQL。
所以,这也解释了为什么Mybatis映射文件需要 namespace 和 id , 前者是类全名,后者是方法名。
12.通用mapper
我们项目使用的是通用mapper,因为使用mybatis需要编写大量sql,工作量比较大,为了简化开发,我们项目使用了通用mapper,它提供的API基本上可以满足单表增删改查,对于多表查询,可以通过编写sql的方式来实现。