1、什么是Mybatis?
Mybatis是一个半ORM(对象关系映射)框架,通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
2、Mybaits的优缺点:
(1)优点:
sql和代码的解耦
(2)缺点:
① SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
3、#{}和${}的区别是什么?
${}是字符串替换,#{}是预处理;
Mybatis在处理${}时,就是把${}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
使用#{}可以有效的防止SQL注入,提高系统安全性。
4、通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象proxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,然后将sql执行结果返回。
1.读取文件,使用Resource.getResourceAsStream(“文件路径”)来读取xml文件并返回inputstream类型的数据(也就是字节输入流)。底层就是用的类加载器的getResourceAsStream()方法;
2.初始化:使用SqlSessionFactoryBuilder去加载输入流:SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream)从而得到一个sqlsessionfactory对象。
注意:真正解析数据流的XmlConfigBuilder,返回对对象的parse去进行解析(这里解析的是一个个标签),得到一个configuration对象,在调用sqlsessionFactory接口的build对象,创建成功一个sqlsessionfactory对象。解析后会标记为已解析;
3.由上面的sqlsessionfactory去获取sqlsession:sqlsessionfactory.openSession(): 这个是获取sqlSession的创建,并设置事务不自动提交,以及executor执行器的创建;
4.根据statementid从上面流程中得到的configuration对象里面得到的map集合中获取mapperedStatement:sqlSession.selectList(“nameSpace.id”),并把任务交给executor执行器去执行;
5.执行器里面有一个核心的类:StatementHandler,这个类就是主要进行sql的执行的。其中oarameterHandler负责参数的设置,ResultHandler负责结果集的封装.
5、limit 10和limit 2 10
6、mybatis的缓存
一级缓存执行流程
1.第⼀次发起查询⽤户id为1的⽤户信息,先去找缓存中是否有id为1的⽤户信息,如果没有,从 数据
库查询⽤户信息。得到⽤户信息,将⽤户信息存储到⼀级缓存中。
2、 如果中间sqlSession去执⾏commit操作(执⾏插⼊、更新、删除),则会清空SqlSession中的 ⼀
级缓存,这样做的⽬的为了让缓存中存储的是最新的信息,避免脏读。
3、 第⼆次发起查询⽤户id为1的⽤户信息,先去找缓存中是否有id为1的⽤户信息,缓存中有,直 接从
缓存中获取⽤户信息。
一级缓存 mybatis自己已经完成的;缓存数据是存储在什么地方的:内存中;在数据没有修改的情况下,同一个查询条件就直接从缓存中获取了。
底层其实就是一个map,清空缓存也就是清空map,那么这个缓存是在什么地方创建的呢,是在执行器excutor创建的,也就是执行sql的时候,一级缓存是基于sqlsession的
二级缓存
二级缓存是默认不开启的,二级缓存手动开启之后 ,映射的实体类也要实现Serializable接⼝,二级缓存也是存储在map中,只是这个二级缓存也可能存储在硬盘中
