MyBatis、Mybatis Plus(面试常问)

MyBatis概述

持久层解决方案(DAO),半自动化的ORM框架,SQL mapper.
MyBatis是一个ORM框架,底层封装了JDBC,简化对数据库的增删改查操作

啥是SqlSession及其作用?

sqlSession是mybatis框架中的一个对象,类似JDBC的Connection对象,是java程序端和数据库之间的会话
框架底层通过sqlSession对象,去执行sql语句,帮助我们实现增删改查操作

Mybatis中取值方式有几种?各自区别是什么?

Mybatis取值方式就是在Mapper文件中获取service传过来的值的方法,总共有两种方式,通过 $ 和 #

#{}只能绑定数据,底层采用的是?占位符赋值的方式,可以对SQL语句预编译,执行同构SQL效率高

${}可以绑定SQL语句中的任意内容,底层采用的是字符串拼接sql的方式,容易产生sql注入,如果需要一些字段名或者关键字(比如order by)需要用$

注意:排序字段若是动态字段需要用${}如:

order by ${sortField} ${sortRule}
limit #{startNo},#{pageSize}

MyBatis的缓存机制?

作用:

减少web应用和数据库(磁盘)访问次数,提高查询效率,减轻数据库访问压力。
减轻数据库压力的思路:内存中数据的获取速度大于物理磁盘,可以将数据存到缓存中。

缓存的数据结构:

Mybatis的缓存实际上就是一个HashMap,key是真正执行的sql语句,value是缓存的结果。

一级缓存:

SqlSession级别的缓存,作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个 sqlSession结束后该sqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存

二级缓存:

mapper级别的缓存(也称之为SqlSessionFactory级别的缓存 对应一个mapper文件),其作用域是mapper的同一个namespace,两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的 数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存,mapper文件中增加标签,实体类实现序列化
当执行了增删改操作清空当前sql所对应的namespace的缓存

1、mybatis-config.xml配置全局变量开启二级缓存

<settings>
    <setting name="cacheEnabled" value="true"/>默认是false:关闭二级缓存
<settings>

2、在​ userMapper.xml ​中配置

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>当前mapper下所有语句开启二级缓存

这里配置了一个 ​FIFO ​缓存,并每隔60秒刷新,最大存储512个对象,而返回的对象是只读的,因此在不同线程中的调用者之间修改它们会导致冲突。可用的收回策略有,默认的是​LRU​:

​LRU ​- 最近最少使用的;移除最长时间不被使用的对象。
​FIFO ​- 先进先出;按对象进入缓存的顺序来移除它们。
​SOFT​- 软引用;移除基于垃圾回收器状态和软引用规则的对象
​WEAK ​- 弱引用;更积极地移除基干垃圾收集器状态和弱引用规则的对象
若想禁用当前​select​语句的二级缓存,添加 ​useCache="false"​修改如下:

<select id="getCountByName" parameterType="java.util.Map" resultType="INTEGER" statementType="CALLABLE" useCache="false">

自定义缓存:自己写一个类,必须实现mybatis提供的cache接口,可以自定义为redis

机制:

web应用执行sql获取数据,mybatis会先从缓存中获取,如果没有,则发送sql查询数据库,返回结果,同时将结果放入缓存中。

MyBatis的重要标签?

<Mapper>标签的Namespace,此处和DAO接口的全类名应保持一致

<Select>标签的id和DAO接口的方法名一致,resultType为查询结果的返回类型(全类名)

<resultMap>标签,当表中的列名和实体类的属性名不一致,查询的结果中属性不能被自动赋值,使用<resultMap><result>标签来映射
将查询select标签的resultType改成resultMap

<association>标签
多表连接:外键的使用,引入此表中不存在的列数据(将一个类作为另一个类中的属性(对象类属性))
在mapper中编写多表查询 以及 查询结果的映射关系
对象属性的属性和对应的列写到association标签中

条件查询 <where> <if>标签
< 这个符号在xml文件中是一个特殊符号 需要使用<![CDATA[ ]]> 特殊处理

<foreach>标签应用场景:批量删除 批量添加
collection:需做foreach(遍历)的对象,作为入参时,list、array对象时,collection属性值分别默认用"list"、"array"代替,Map对象没有默认的属性值。但是,在作为入参时可以使用@Param(“keyName”)注解来设置自定义collection属性值,设置keyName后,list、array会失效;
Item:循环遍历元素的变量名
separator:除了最后一次都拼接一个“,”
可参考:https://www.cnblogs.com/sgw1018/p/mybatis-foreach.html?ivk_sa=1024320u

<collection>标签 可以映射集合类属性,如list
DAO的方法参数类型是int 或者String 时
Mapper文件中使用#{}获取DAO传递过来的参数值:#{随便写}
DAO的方法参数类型是实体类对象时
Mapper文件中使用#{}获取DAO传递过来的参数值: #{实体类中的属性名}

DAO接口的方法中传递多个参数用@Param

Mybatis Plus

MyBatis Plus简介?

MyBatis-Plus是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。如果添加了MybatisPlus的依赖 但是不想使用MybatisPlus的类和方法 这时候仍然可以按照之前使用Mybatis的步骤做开发 几乎和之前没有任何的改变

使用

① 导入依赖,如果有注释掉之前mybatis的依赖
②如果MyBatis plus有自定义mapper文件,地址配置的由mybatis-mapper-locations改为mybatis-plus.mapper-locations
③ 给实体类加注解
@TableName(“user”) 加载类上 将该类和数据库中对应的表建立联系 注解值为表名
@TableId(value = “对应表列名”,type = IdType.AUTO) 建立主键属性和主键字段之间的联系。 value 字段名, type 定义主键自增类型 IdType.AUTO MySQL自动递增
常规属性@TableField(“name”) 将常规属性和常规字段名建立联系
连表查询 封装数据的属性 没有对应的字段 需要定义忽略
@TableField(exist = false) exist = false代表当前属性在表中没有字段名

  1. 创建实体类对应的dao接口 继承 BaseMapper 就会拥有MybatisPlus所有默认方法,需要继承BaseMapper 泛型 即当前dao对应的实体类
  2. 条件构造器,分页插件,

连表查询不使用mybatis plus

  • 11
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MybatisPlus是Mybatis的增强版,提供了更加便捷的操作和更强大的功能。以下是一些MybatisPlus的面试题及答案: 1. MybatisPlus是什么? MybatisPlus是一款基于Mybatis的增强工具,简化了Mybatis的开发流程,提供了更多的便捷功能,如自动填充、分页插件、代码生成等。 2. MybatisPlus的优点有哪些? - 简化开发:提供了更加便捷的API和操作方式,减少了开发工作量。 - 强大功能:提供了自动填充、分页插件、代码生成等功能,提升了开发效率。 - 易于集成:与Spring、Spring Boot等框架无缝集成,方便使用和管理。 - 社区活跃:拥有活跃的开源社区,提供了大量的学习资源和支持。 3. MybatisPlus的核心功能有哪些? - 自动生成代码:可以根据数据库表自动生成实体类、Mapper接口和XML映射文件。 - 自动填充:通过注解或者配置,在插入和更新时自动填充指定的字段值,如创建时间、更新时间等。 - 分页查询:提供了分页插件,可以方便地进行分页查询。 - 多表关联查询:支持多表关联查询,可以通过注解或者Wrapper来实现。 - 乐观锁:支持乐观锁机制,用于处理并发更新的场景。 4. MybatisPlus的一级缓存和二级缓存是什么? - 一级缓存:是Mybatis的默认缓存,作用范围是SqlSession级别的,当进行相同的查询时,会先从缓存中获取结果,提高查询效率。 - 二级缓存:是Mybatis的全局缓存,作用范围是Mapper级别的,可以跨SqlSession共享缓存,适用于多个SqlSession共享数据的场景。 5. MybatisPlus如何实现实体类和数据库表的映射? MybatisPlus通过注解@Table和@Column来实现实体类和数据库表的映射关系,可以通过指定注解的属性来设置表名、字段名和主键等信息。 6. MybatisPlus的自动填充功能是如何实现的? MybatisPlus的自动填充功能是通过注解@TableField和实现接口MetaObjectHandler来实现的。通过在实体类的字段上添加注解@TableField(fill = FieldFill.INSERT_UPDATE)来指定需要自动填充的字段,然后在实现接口MetaObjectHandler的方法中设置填充的值。 7. MybatisPlus的分页插件原理是什么? MybatisPlus的分页插件是通过拦截器的方式实现的,当执行分页查询时,拦截器会拦截SQL语句,根据分页参数重新构造SQL语句,然后执行查询并返回分页结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值