首页 > 其他分享 >mybatis面试题

mybatis面试题

时间:2023-03-27 20:44:36浏览次数:40  
标签:面试题 缓存 对象 查询 sql mybatis select

1.Mybatis中${} 和#{}有什么区别? 

#{}是预编译处理,${}是字符串替换

Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;

Mybatis 在处理${}时,就是把${}替换成变量的值

使用#{}可以有效的防止 SQL 注入,提高系统安全性

在低版本的mybatis中,如果方法的形参是简单类型(基本数据类型,包装类型,String,Date...) #{}获取参数值#{}中可以随便写。${}只能写value

2.Mybatis如何执行批量插入?

1.批量插入的sql语句

insert into table ([列名],[列名])
VALUES
([列值],[列值]),
([列值],[列值]),
([列值],[列值]);

2.MyBatis 层面批量插入数据到数据库

interface PersonMapper {
public void insertBatch(@Param("list")List<Person> persion);
}

<insert id="insertBatch" parameterType="java.util.List">
insert into person ( <include refid="Base_Column_List" /> )
values
<foreach collection="list" item="item" index="index" separator=",">
(null,#{item.name},#{item.sex},#{item.address})
</foreach>
</insert>

3.Mybatis如何在插⼊后获得主键 ?

在insert标签中设置三个属性

useGeneratedKeys="true" keyProperty="id" keyColumn="id"

插入完毕后,从插入的对象中就可以获取

4.Mybatis中resultmap是做什么的?

对查询的结果进行自定义映射

主要解决2方面问题:1:1和1:m查询   查询的结果集字段名称和类中属性名称不一致

5.Mybatis中resulttype和resultmap区别?

resultType主要针对的场景:

如果查询结果只是返回一个简单类型,比如返回String或int,那么可以使用resultType

如果数据库表的字段名和实体对象的属性名一样时,那么也可以直接使用resultType返回结果。

resultmap主要针对的场景

1:1 1:m多表关联查询结果封装

如果数据库表的字段名和实体对象的属性名不一样时,可可以使用resultmap;
如果使用resultType,需要给表字段起别名

6.mybatis都有哪些 Executor 执行器?它们之间的区别是什么?

SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。

BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同

7.mybatis⼀级缓存和二级缓存? 

为了提升查询效率,提高用户体验,MyBatis提供了数据缓存支持,依据数据缓存的有效范围默认定义了一级缓存和二级缓存

一级缓存:

该级缓存默认开启,不能关闭;

该级缓存为SqlSession级别的缓存

以下情况将会导致该级缓存失效:

在不同SqlSession中查询数据

相同SqlSession中查询数据,但查询条件不同

相同SqlSession中查询数据,但两次查询之间执行了增删改操作

同SqlSession中查询数据,但第二次查询前,程序调用SqlSession对象clearCache()方法手动清除了一级缓存

二级缓存:

该级缓存默认不开启,但如果使用二级缓存需要在每个XML映射文件中添加<cache></cache>以配置该级缓存(相应实体类要序列化)。

二级缓存可以通过在全局配置文件配置setting标签来关闭该级缓存

通过SqlSession查询数据,这些数据将会放到当前会话的一级缓存中;如果当前会话关闭,则一级缓存中的数据会被保存到二级缓存中,此后新的SqlSession将从二级缓存中查找数据;

select标签的useCache属性用于设置是否使用二级缓存,默认是true;
insert、update、delete或select标签均有flushCache属性,其中增删改默认true,即sql执行以后,会同时清空一级和二级缓存,查询默认false

8.mybatis怎么调用【存储过程】?

1.在mysql中创建存储过程

DROP PROCEDURE IF EXISTS add;
DELIMITER $
CREATE PROCEDURE add(IN a INT,IN b INT,OUT c INT)
BEGIN
SELECT a+b INTO c;
END;
$

2.在mybatis中调用

@Select("call add(#{map.a,mode=IN,jdbcType=INTEGER},#{map.b,mode=IN,jdbcType=INTEGER},#{map.d,mode=OUT,jdbcType=INTEGER})")
@Options(statementType=StatementType.CALLABLE)
void callProcedure(@Param("map")Map map);

void callProcedure2(Map map);

<mapper namespace="com.example.demo.dao.CallMapper" >
<select id="callProcedure2" statementType="CALLABLE" parameterMap="paraMap" resultType="java.lang.Integer">
call add(?,?,?)
</select>

<parameterMap type="java.util.Map" id="paraMap">
<parameter property="a" mode="IN" jdbcType="INTEGER"/>
<parameter property="b" mode="IN" jdbcType="INTEGER"/>
<parameter property="c" mode="OUT" jdbcType="INTEGER"/>
</parameterMap>

</mapper>

9.动态sql的常⽤标签,动态sql的执⾏原理 ?

常用的动态sql标签

if  ,where  , set  ,choose(when,otherwise) ,sql  + include ,foreach 

10.Mybatis是否支持延迟加载,延迟加载的原理是什么?

支持:mybatis中的延迟加载,也称为懒加载,是指在进行关联查询的时候,按照设置的延迟规则推迟关联对象的select查询. 

mybatis延迟加载,需要借助resultMap标签中的association和collection子标签实现

延迟加载规则:侵入式懒加载:执行对主数据的查询时,不会查询关联的对象,当访问主数据的某个属性是,就会马上执行关联对象的select查询

非入式懒加载:执行对主数据的查询时,不会查询关联的对象,当访问主数据的某个属性是,不会查询关联的对象。只有真正访问关联对象的属性时,才会执行关联对象的select查询

原理:动态代理:通过延迟加载的方式查询的对象是代理对象,并且对对象中的方法进行增强

当我们调用代理对象的方法时候,发送sql查询关联对象

 

标签:面试题,缓存,对象,查询,sql,mybatis,select
From: https://www.cnblogs.com/carney/p/17262799.html

相关文章

  • vue2+element-ui+springboot+mybatis-plus获取当前账户进行修改密码详细教程
    以下内容仅供学习使用新建一个dto类,用于专门修改当前账户的使用importlombok.Data;@DatapublicclassUserPasswordDTO{privateStringusername;priva......
  • MyBatisPlus快速上手
    ORM介绍ORM(ObjectRelationalMapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。ORM通过使用描述对象和数据库之间映射的元数据将程......
  • Java面试题(三)
    List接口有什么特点?顺序存储、可以有重复值 Set接口有什么特点?无需存储、不能有重复值 ArrayList与LinkedList有什么区别?ArrayList与LinkedList都实现了List接口......
  • 一套sql面试题的mysql解法
    1.表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sqlselect*fromTorderbyc[desc]limit20,102.表T(a,b,c,d)和表T1(a1,b1,c1,d1),表T中a字段是T1中......
  • Spring整合Mybatis出线的小问题
    Causedby:java.sql.SQLException:${jdbc.driver}这个问题出现一部分的原因,使用DruidDataSource获取数据库连接池的时候设置属性的时候直接加载了配置文件当中的属性如......
  • 关于mybatis创建的mapper映射路径不对导致的系列报错
    今天在写mybatis项目的时候,使用注解发现无法使用别名,添加ResultMap的时候直接报错显示无法解析。经过百度了好久也是成功的发现了问题的所在,就是这个:这个路径创建的时候......
  • Java面试题(二)
    JDK和JRE有什么区别?JDK:JavaDevelopmentKit的简称,java开发工具包,提供了java的开发环境和运行环境。JRE:JavaRuntimeEnvironment的简称,java运行环境,为java的运行提供......
  • 某大厂面试题:说一说Java、Spring、Dubbo三者SPI机制的原理和区别
    大家好,我是三友~~今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是......
  • TCP/IP面试题
    1.OSI七层模型与TCP/IP四层模型OSI七层模型描述TCP/IP四层模型协议应用层为应用程序提供服务的,使各个应用程序能够访问网络应用层HTTP、TFTP,FTP,NFS,WAI......
  • 常见java面试题以及对代码的理解
    1、Students=newStudent();做了哪些事情A:加载Student.class文件进内存B:在栈中为s开辟空间C:在堆中为学生对象开辟空间D:为学生对象的成员变量赋默认值......