Mybatis

    支持定制化SQL、存储过程和高级映射的数据持久层框架(消除JDBC代码);简单灵活易学;SQL编程复杂,依赖数据库(移植性差),功能欠缺,二级缓存机制不佳;三层功能架构:

  生命周期 作用 源码
加载配置文件     InputStream configFile = new FileInputStream(filePath);
SqlSessionFactoryBuilder method级别(或叫request级别),即方法返回后消失 build()中解析配置文件;解析完会产生全局单例configretion  
SqlSessionFactory Application级别 创建会话;openSession()获取会话;过程中创建了事务工厂、执行器,最后返回DefaultSqlSession对象(核心对象,但非线程安全,整合spring后要用其代理类) SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configFile);
SqlSession method/request 封装操作数据库的方法 SqlSession sqlSession = sqlSessionFactory.openSession(true);
Mapper、MapperProxy method/request 调用MapperProxy.invoke()动态代理

Mapper mapper = sqlSession.getMapper(Mapper.class);

getMapper()的原理,因为在配置文件中配置了及属性resource值文件路径,方法实质委托了configretion通过配置文件去获取,也即通过注射器MapperRegister的addMapper()去构建mapper

 

核心配置:

  • 1、核心配置信息配置:Mybatis的初始化即Configuration对象的创建

管理这些信息的容器:org.apache.ibatis.session.Configuration

基于XML配置文件:

    属性

    全局设置如(二级或局部mapper.xml中使用且bean须被序列化)缓存和连表查询时的延迟加载lazyloadingEnable/积极的延迟加载aggresaveLazyloadingEnable,日志

    实体bean/类型命名;类型处理

   环境/环境变量

    事务管理器

    数据源

    对象工厂;插件

当与spring结合时选择使用spring的配置(数据源如dbcp,c3p0,pooledDataSource)且配置mybatis核心对象:

   

以及其他配置如<…MapperScanerConfig/MapperFactoryBean…

   

创建工具类读取mybatis配置并创建Factory工厂:xml配置或者java类

       过程:

java代码调用SqlsessionFactoryBuilder对象的build(inputStream)创建XMLConfigBuilder对象(inputStream读取配置文件作输入流);//Builder设计模式

新对象调用parse()解析xml文件(转为document对象,解析DOM节点Node即标签<...>,封装)得到Configuraion对象;

新对象创建DefaultSessionFactory/SqlSessionFactory对象;

由此Factory工厂设计模式创建SqlSession;(涉及到默认一级缓存:session级别的缓存,即在同一个session中查询,再做相同查询时从缓存中获取数据,sql仅一条;不同session中执行相同查询,则各自查询数据库即二级缓存;查询之间有增删改操作则不视为相同查询即增删改会自动flush缓存)

mybatis配置中指定mapper.xml->它的namespace指定映射到的bean

idea不会编译src下的java目录下的xml文件,所有mapper.xml需要放在resources下

基于java API配置:

  • 2、核心映射器配置

编写与DaoMapper接口(在Controller中调用接口的增删改方法时需要session.commit()事务提交才会保存数据到DB)对应的.xml,使用#{}形式取参数值(多参数可封装为对象或集合)($配合模糊查询,纯粹的字符串显示,不能防止SQL注入,参数是单值时{}中写为value;参数为表名、列名或order by时只能用$;参数是字符串时用引号;尽量用占位的#,相当于对数据加上双引号,在动态解析/预处理时以安全值如?填充):