mybatis

实现原理

JDK动态代理,jdbc

启动流程

读取mybatis-config.xml
SqlSessionFactoryBuilder->sqlSessionFactory->openSession()->sqlSession->getMapper()->执行

sql注入

#{}是预编译处理,${}是字符串替换; 后者一般用来设置不同表名;
字符替换不能防止sql注入,所以可以自己加一些简单的判断,比如变量不能太长,或得在特定的集合里面。

Dao接口

Dao接口里的方法,是不能重载的,因为是全限名+方法名定位MappedStatement。
工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

返回结果封装

1.<resultMap>标签,逐一定义列名和对象属性名之间的映射关系
2.将列别名书写为对象属性名
Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回

缓存

分一级,二级缓存
一级缓存作用域为Session,基于 PerpetualCache 的 HashMap 本地缓存
二级缓存作用域为Mapper(Namespace),需要在sql文件指定开启,可以自定义存储源,比如用Ehcache

include使用

一般查询语句较长时,可以采用include,引入另外一个标签,也方便公用。
例如:

那会不会有标签定义的顺序问题?
不会的,Mybatis解析的时候发现没有相关引用标签会继续解析其它标签,之后再回来解析这些没完成的标签。

分页

Mybatis使用RowBounds对象对执行结果进行内存分页,也可以通过sql或插件接口来完成物理分页。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    zhihaoZzz阅读 1,304评论 0 2
  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    梦殇_fccd阅读 1,011评论 0 5
  • 1、#{}和${}的区别是什么?注:这道题是面试官面试我同事的。 答:${}是Properties文件中的变量占位...
    小沙鹰168阅读 2,246评论 2 64
  • 1、#{}和${}的区别是什么? 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql...
    壹点零阅读 328评论 0 1
  • 某天下午,当你梳妆完毕去奔赴一场并不期待的相亲,坐下来后不久,听到对方喋喋不休谈论自己过去有过何种成绩,请放下...
    飑飑阅读 442评论 0 1