mybatis

作者: 水流不流 | 来源:发表于2019-04-08 10:51 被阅读36次

    实现原理

    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

        本文链接:https://www.haomeiwen.com/subject/xxtuiqtx.html