本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。Mybaits封装了对SQL的crud的接口操作,是一款优秀的ORM框架。

-
- configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <properties>
- <property>property>
- ...
- properties>
-
- <settings>
- <setting>setting>
- ...
- settings>
-
- <typeAliases>
- <package>package>
- ...
- <typeAlias>typeAlias>
- ...
- typeAliases>
-
- <typeHandlers>
- <package>package>
- ...
- <typeHandler>typeHandler>
- ...
- typeHandlers>
-
- <objectFactory>
- <property>property>
- ...
- objectFactory>
-
- <objectWrapperFactory>
- <property>property>
- ...
- objectWrapperFactory>
-
- <reflectorFactory>reflectorFactory>
-
- <plugins>
- <plugin>
- <property>property>
- ...
- plugin>
- ...
- plugins>
-
- <environments>
- <environment>
- <transactionManager>
- <property>property>
- ...
- transactionManager>
-
- <dataSource>
- <property>property>
- ...
- dataSource>
- environment>
- ...
- environments>
-
- <databaseIdProvider>
- <property>property>
- ...
- databaseIdProvider>
-
- <mappers>
- <package>package>
- ...
- <mapper>mapper>
- ...
- mappers>
-
- configuration>
-
- <package name="com.mybatis.xxx"/>
-
- <mapper resource="xxx.xml"/>
3)构造SqlSessionFactory.
-
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
-
- <property name="dataSource" ref="datasource">property>
-
- <property name="typeAliasesPackage" value="com.zhangguo.bookstore.entities">property>
-
- <property name="mapperLocations" value="classpath*:com/zhangguo/bookstore/mapper/*Mapper.xml">property>
- bean>
4)创建SqlSession。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。SqlSession sqlSession = builder.openSession();
5)Executor执行器,是MyBatis的核心,负责SQL语句的生成和查询缓存的维护,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护
6)MappedStatement对象,是对解析的SQL的语句封装,一个MappedStatement代表了一个sql语句标签,如下:
- <select id="selectUserList" resultType="com.mybatis.User">
- select * from t_user
- select>
7)输入参数映射,参数类型可以是基本数据类型,也可以是Map、List、POJO类型复杂数据类型,有两个属性 parameterType和parameterMap
8)封装结果集,对返回结果处理映射,也有两个常用的属性resultType和resultMap。
Mybatis设计缓存的主要目的是减少对DB的可能性操作,减少资源浪费。Mybatis提供两级缓存设计,一级缓存在 Executor 执行器(SimpleExecutor)中有一个 Cache 对象中,默认就是一个 HashMap,执行数据库查询操作前,如果在一级缓存中有对应的缓存数据,则直接返回;
一级缓存的key是函数id+包名,所以在mybaits中不允许有方法重载。
二级缓存在Mapper scope,同一个mapper在不同的sqlsession种共享缓存。因为SqlSessio非线程安全,在多个 SqlSession 会话时,可能导致数据的不一致性,所以二级缓存默认关闭。
延迟加载就是在需要⽤到数据时才进⾏加载,不需要⽤到数据时就不加载数据。延迟加载也称懒加载。延迟加载是基于嵌套查询来实现的,优点是优先嵌套外层查询,减少DB操作,提高性能;缺点是使用到数据时临时查询,有一定的时延,用户体验有delay。
局部延迟加载:在association和collection标签中都有⼀个fetchType属性,通过修改它的值,可以修改局部的加载策略。
延迟加载原理:主要是通过动态代理的形式实现,代理拦截到指定⽅法,执⾏数据加载。