1、为什么通过命名空间+id 这两个坐标就可以唯一的定位一条sql 语句 在mybatis中是怎么实现的?看源码
几个核心的类:
SqlSessionFactoryBuilder 通过建造者模式 实例化SqlSessionFactory 建造的过程是一个很复杂的过程 对外是透明的
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory
SqlSession sqlsession是线程不安全的 所以要保证线程独享
Mapper
这四个关键类完成一次数据库的访问
resultType还是resultMap?
数据库查询出来的字段和pojo映射
resultMap元素是mybatis中最重要最强大的一个元素
<resultMap id ="" type="" autoMapping=""></resultMap> 有三个属性 id type autoMapping
怎么传递多个参数:1、使用map传递参数 2、使用注解传递参数 3、使用javaBean的方式传递参数
怎么样获取主键?
预编译 给传入参数加单引号 prepareStatement
动态sql元素:
<if></if>
<choose> <when> <otherwise>
<trim> <where> <set>
<foreach>
其中if和foreach是最主要的 其他的标签都是辅助作用
<where></where> -------> 如果<where>标签内的<if>条件成立的话 去除里面的and 或者 or 如果不成立的话 不会加where
<set></set> 标签作用:把set块中的逗号去掉 再update的时候常用
<insert>是最难的 需要两个代码块去填充
<where><set>标签是<trim>标签的一种简写 <trim prefix= "where" prefixOverrides="and | or">
高频面试题:
通过mybatis怎么样进行批量的操作?
1、通过foreach动态拼装sql语句
2、使用BATCH类型的excutor
mybatis 代码生成器:
为什么超过三个表禁止join?
1、字段允许适当冗余,以提高查询性能
2、分两次 select,第一次 select 取得主表数据,第二次查从表数据
3、将热点数据存缓存,提高数据的读取效率
关联元素:
association 用于表示一对一关系
collection 用于一对多关系
mybatis中的缓存:
一级缓存:一级缓存默认是开启的 想要关闭一级缓存可以在select标签上配置 flushCache="true" ;一级缓存存在于sqlsession的生命周期中 在同一个sqlsession中查询时mybatis会把执行的方法和参数 通过算法生成缓存的键值 将键值和查询结果存入一个map对象中 如果同一个sqlsession中执行的方法和参数完全一致 那么通过算法会生成相同的键值 当map中已经存在该键值 就会返回缓存中的对象 ;任何的insert update delete操作都会清空一级缓存
二级缓存:二级缓存也叫应用缓存 二级缓存存在于sqlsessionfactory的生命周期中;可以理解为跨sqlsession 缓存是以namespace为单位 不同namespace下的操作 互不影响。
二级缓存会造成脏读 不建议开启