Mybatis面试题

1、#{}和${}的区别

#{}是sql的占位符,预编译处理时MyBatis 会将 sql 中的#{}替换为号,使用 PreparedStatement 的set方法设置参数值

${}是字符串替换,直接将这部分用括号内的实际内容代替

#{}和${}都是为了动态传递参数而存在的,是MyBatis实现动态sql的基础
 

2、xml 映射文件中有哪些标签

select、insert、update、delete

resultMap(结果映射)、parameterMap(参数映射)、sql(通用sql片段)、include(引入通用sql片段)

where、if、choose|when|otherwise(类似java中的swtich语句)、set(update操作时动态set字段)、foreach(遍历)、trim(修剪sql)、bind(在sql上创建变量并且绑定在sql上,可用作sql拼接)
 

3、DAO层java的mapper文件与xml文件的映射关系

1、mapper文件的接口名与xml文件中的namespace命名空间对应

2、接口中的方法名与xml文件中的标签id值对应

3、方法的返回值类型与xml文件对应标签中的返回值类型对应
 

4、实体类字段与查询结果字段不一致怎么解决

1、sql中给字段去别名

2、使用resultMap标签进行结果的字段映射
 

5、延迟加载(懒加载)

分为局部延迟加载(在curd标签返回结果的resultMap标签中设定)和全局延迟加载(配置文件中setting标签修改),一般优先使用局部延迟加载,用在一对多,多对多的查询

比如a.getB().getName(),进入拦截器的invoke(…) 方法,发现a.getB()需要延迟加载,先查询B并且给a赋值,之后再调用.getName();
 

6、xml文件中CURD标签中的id是否可以重复

我们一般每个xml文件会配置一个命名空间,命名空间+id组成key,不同的xml文件中一般可以使用相同的id为标签命名
 

7、mybatis的缓存实现逻辑

一级缓存:sqlsession对象的缓存,查询时结果存入SqlSession为我们提供的一块结构为map的区域中,作用域为session,默认是开启的,存储的时对象

二级缓存:SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存,作用域为namespace命名空间,默认是不开启的,需要要mybatis配置文件中配置开启,存储的是数据

查询数据的时候,优先级是二级缓存>一级缓存>数据库,当有C/U/D操作时缓存清除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值