mybatis面试题

mybatis面试题

1.mybatis一级缓存和二级缓存

1.一级缓存

一级缓存指的就是sqlsession缓存。一级缓存是默认开启的,它只相对于同一个SqlSession有效,所以也称之为SqlSession缓存。当参数和SQL完全相同的情况下,使用同一个SqlSession对象调用同一个Mapper方法,当第1次执行SQL语句后,MyBatis会自动将其放在缓存中,后续再次查询时,如果没有声明需要刷新,且缓存没有超时,会直接取出此前缓存的数据,而不会再次发送SQL到数据库。如果查完后,增删改操作,就会清空缓存。

2.二级缓存

与一级缓存的不同之处在于其存储作用域为 Mapper(Namespace) ,多个 SqlSession去操作同一个 Mapper的 sql 语句,多个 SqlSession可以共用二级缓存。MyBatis 二级缓存读取优先级高于 MyBatis一级缓存。关闭 sqlsession后,会把该 sqlsession一级缓存中的数据添加到 namespace 的二级缓存中。

二级缓存是默认未开启的,如果要开启,需要在mybatis配置xml文件中配置setting 和配置SQL的XML文件中配置cache节点,由于每个XML都通过根节点的namespace属性对应一个Mapper接口,所以,二级存储也称之为namespace缓存!在使用二级存储时,查询返回的结果类型必须是实现了Serializable接口的!

注意:

1.缓存有了数据后,如果执行了当前XML中配置的增、删、改操作,都刷新此前的缓存数据!

2.在一级缓存中的是对象,所以每次获取的对象都是同一个,在二级缓存中的是数据,所以每次获取都会分配一个新的对象来,但这些不同的对象是从缓存中获取的,并不是从数据库中获取!

2.mybatis 中 #{}和 ${}的区别及应用场景

1 #{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?占位符,然后传入参数赋值,传入字符串后,自动会在值两边加上引号,可以防止sql注入
2 传 入 的 参 数 直 接 生 成 在 s q l 里 , 容 易 引 发 s q l 注 入 场 景 : 1. 传入的参数直接生成在sql里,容易引发sql注入 场景: 1. sqlsql1.{} 的应用场景是需要动态传入表名或列名时使用, 如果使用#{}, 解析出来后是一个带着双引号的字符串,数据库找不到这样的列名。

3.mybatis的sql注入是什么

恶意的sql插入到被执行的字段中,比如$是直接把参数导入数据库,如果参数是用户写delete参数患者drop参数,造成数据库数据或表结构缺失。

4.mybatis分页

1.传统sql分页(mysql)

使用limit分页,参数传当前页,页大小。然后sql执行

select * fromlimit (当前页-1)*页大小, 页大小

比如:

查询第1条到第10条的数据的sql是:select * from table limit 0,10; ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

查询第11条到第20条的数据的sql是:select * from table limit 10,10; ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

查询第21条到第30条的数据的sql是:select * from table limit 20,10; ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;

2.传统sql分页(oracle)

使用ROWNUM 分页,参数传当前页,页大小,sql执行

select * (select A.*,ROWNUM RN  from (select * from 表名) A where ROWNUM<=当前页 * 页大小) 
where RN>= (当前页-1)*页大小

3.PageHelper分页(springboot方式)

1.在pom.xml配置文件中添加PageHelper依赖

2.在springboot的application.yml文件配置PageHelper相关信息

3.在业务里使用PageHelper.startPage(当前页,页大小);方法,使用PageInfo<实体类> userInfoPage = new PageInfo<实体类>(mapper方法);

如:

 //分页信息
 PageHelper.startPage(pageIndex, pageSize, orderBy);
//执行分页查询
PageInfo<UserInfo> userInfoPage = 
  new PageInfo<UserInfo>(userMapper.searchUserList(userSearchParam));

5.mybatis 的延迟加载

延迟加载就是在真正的使用数据时才发起查询,不用的时候不查,按需查。resultMap去一对一和一对多时,先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。Mybatis的延迟加载功能默认是关闭的,需要在mybatis配置文件中通过setting标签配置来开启延迟加载功能

6.mybatis流程

mybatis整个调用执行过程:

  1. 加载配置并初始化:即mybatis主配置文件,mapper配置文件及注解配置。其中将SQL配置的信息加载为一个个MapperStatement对象(传入参数映射配置、执行的SQL语句、结果映射配置)。
  2. 接收调用请求:接收到传入的参数和需要执行的SQL的ID,将请求传递给下层的数据处理层进行处理。
  3. 处理操作请求:执行器Executor处理接收到接口层传递的SQL的ID和传入参数,根据ID查找对应的MapperStatement,解析MapperStatement对象,得到需要执行的SQL语句并注入传入的参数。获取到数据库连接,将最终的SQL语句到数据库执行,并得到结果。根据MapperStatement对象中的结果映射配置对得到的结果进行转换处理,得到最终的结果。最后释放资源并返回结果到上层。

7.mybatis如何使用(springboot方式)

1.导入mybatis的起步依赖

2.建立application.yml添加数据库连接信息

3.创建Mapper接口

4.创建Mappper映射文件

5.在application.yml配置mybatis与spring整合

#spring与mybatis整合配置
mybatis:
  mapper-locations: classpath:mapper/*Dao.xml # 映射配置扫描
  type-aliases-package: com.itheima.pojo  # 扫描实体包,改为别名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值