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操作时缓存清除