一:Mybatis

1:什么是mybatis?

(吧从 从从 1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发者只需要关注sql语句的编写即可。
(2)mybatis可以使用xml或者注解方式来配置映射和原生信息,避免了JDBC大量原生代码的编写。
(3)mybatis关注于sql语句本身,灵活性很高,适用于对于性能要求比较高的项目。

2:mybatis优缺点?

优点:
(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
(2)与JDBC相比,减少大约50%的代码。
(3)能够很高的与各种数据库兼容。
(4)能够与spring很好的集成。
缺点:
(1)由于只关注与sql语句的编写,会有大量的sql语句。
(2)依赖与数据库,可移植性差。

3:MyBatis 与 Hibernate 有哪些不同?

(1):mybatis是一个半ORM框架,需要程序员自己编写sql语句
(2):mybatis直接编写原生sql,可以严格控制sql的性能,适用于对关系数据模型要求不高的软件。
(3):Hibernate 适用于对关系数据模型要求比较高的软件,可以节省大量的代码,所以说效率高。

4: #{}和${}的区别是什么?

Mybatis 在处理#{}时,编译时候会将sql语句的格式固定下来,并且会将 sql 中的#{}替换为?号,调用PreparedStatement的 set 方法来赋值,这样可以防止sql注入,提高系统安全性;
Mybatis 在处理${}时,就是把${}替换成变量的值。

5:Mybatis是如何进行分页的?分页插件的原理是什么?(有时间可以看)

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

6:Mybatis 动态 SQL 有什么用?执行原理?有哪些动态 sql 标签?(必会)

用处:可以在xml配置文件中以标签的形式编写动态sql
执行原理:根据表达式的值,判断逻辑结果,并且拼写动态sql
九个标签:trim | where | set | foreach | if | choose| when | otherwise | bind
举例::条件标签。如果有动态条件,则使用该标签代替 where 关键字。
:条件判断标签。

查询条件拼接

:循环遍历标签。适用于多个参数或者的关系。

获取参数

7:Xml 映射文件中,除了 select|insert|updae|delete 标签之外,还有哪些标签?(有时间可以看)


8:MyBatis 实现一对一有几种方式?具体怎么操作的?

联合查询(一次查询):是几个表联合查询,只查询一次, 通过在resultMap 里面配置 association 节点配置一对一的类就可以完成;
嵌套查询(多次查询):是先查一个表,根据这个表里面的结果的 外键 id,去再另外一个表里面查询数据,也是通过 association 配置,但另外一个表的查询通过 select 属性配置。

9:mybatis是否支持懒加载?如果支持,原理是什么?

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

10:一二级缓存?

一级缓存:作用域为session,默认情况下打开且不能关闭;
二级缓存:作用域为mapper(namespace),默认情况为不带开,可以手动打开。手动打开时,二级缓存类需要实现Serialiable序列化接口。
总的来说,意思时在同一个作用域下,执行两个相同的操作,第一次查询数据库,第二次使用缓存,不查询数据库。

11:当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

(1):通过在自定义sql语句中起别名,可以让实体类中的属性名和表中的字段名一样;
(2):通过Id来映射主键字段;result映射非主键字段。(property(属性名),column(字段名))

12:如果我们想要知道刚刚插入的数据的主键是多少

select last-insert-id();

13:mybatis在mapper中如何传递多个参数?

(1):param参数
image.png
方法中使用@param(“userName”),@param(“password”)接受参数,
mapper文件中使用占位符#{userName},#{password}接受
(2):按照传入参数的顺序
image.png
方法中使用(userName,password)接受参数,
mapper文件中使用占位符#{0},#{1}(按照顺序接受,即userName为0,password为1)
(3):map
image.png
方法中传递进来一个map集合,put(”username”,”password”)
mapper文件中使用占位符#{},#{usernmae},#{password}

14:Mybatis如何确定映射类?

nameSpace名称空间——》接口的全限定名
id——》方法名一致
resultType(resultMap)——》返回值类型一致
parameterType——》参数类型一致

15Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

如果配置了nameSpace(名称空间),id可以重复,statement实际上就是nameSpace+id;
如果没有配置nameSpace,id重复时会覆盖。

16:Mybatis如何操作一对一,一对多,多对多?

一对一:association
一对多:collection
多对多:collection
:配置字段和对象属性的映射关系标签。
id** 属性:唯一标识
**type 属性:实体对象类型
:配置主键映射关系标签。
:配置非主键映射关系标签。
column 属性:表中字段名称
property 属性: 实体对象变量名称
:配置被包含对象的映射关系标签。—-》一对一
property 属性:被包含对象的变量名
javaType 属性:被包含对象的数据类型
:配置被包含集合对象的映射关系标签。—-》一对多,多对多
property 属性:被包含集合对象的变量名
ofType 属性:集合中保存的对象数据类型

17:mybatis如何实现分页?

mybatis使用第三方插件对功能进行扩展,分页助手pa’geHelper将复杂的操作进行了封装,使用简答的方式即可获得分页相关的参数。



通过startPage设置分页参数

18、既然有了#{}为什么还需要${}

{}并不适用一些其他场景,比如要根据参数名动态排序,需要传入的参数是字段名,使用#{} 被解析成order by ‘age’ ,显然达不到排序目的。而此时就用到了${}进行字符串替换操作,即sql解析成 order by age

二:Mybatis-Plus