支持定制化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()的原理,因为在配置文件中配置了 |
管理这些信息的容器:org.apache.ibatis.session.Configuration
基于XML配置文件:
当与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配置中
idea不会编译src下的java目录下的xml文件,所有mapper.xml需要放在resources下
基于java API配置:
编写与DaoMapper接口(在Controller中调用接口的增删改方法时需要session.commit()事务提交才会保存数据到DB)对应的.xml,使用#{}形式取参数值(多参数可封装为对象或集合)($配合模糊查询,纯粹的字符串显示,不能防止SQL注入,参数是单值时{}中写为value;参数为表名、列名或order by时只能用$;参数是字符串时用引号;尽量用占位的#,相当于对数据加上双引号,在动态解析/预处理时以安全值如?填充):
属性parameterType,如果值为int或integer,表示Integer即int是Integer的别名;_int表示int
数据库主键id,它是自增的,即插入bean时,数据库id自增而bean的id为null;指明主键和启用,将数据库id值映射到bean
或者在配置文件全局配置
动态SQL语句基于OGNL表达式,
嵌套/连表查询:
pojo中不再使用关联对象的属性即外键,而直接将关联对象做为属性;mapper.xml中映射
同理;但javaType=”ArrayList等”,而ofType=”关联对象”
鉴别器:父类如people,根据属性sex鉴别子类male和famale;父类分类查询时,
逻辑分页(查询所有数据,然后根据页码选出数据显示;参数currentPage和pageSize;offset和limit)和物理分页(判断出应该选的数据并查询)
最后整合SpringMVC,Controller中实例化SqlSessionFactory
Mybatis已经能操作数据库了,但与Spring整合,将类管理交给容器,管理对象,封装方法,减少new,使用AOP和DI等
两者的连接jar:mybatis-spring(除了spring和mybatis各自的jar之外还需要的)