1.MyBatis的持久化解决方案将用户从原始的JDBC访问中解放出来,用户只需要定义需要的操作的sql语句,无需关注底层的JDBC,就可以面向对象的方式进行持久层操作。
2.SqlSessionFactory是MyBatis的关键对象,它是单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder来获得,而SqlSessionFactoryBuilder则可以从xml配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。其也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在,在应用运行期间不要重复创建多次,建议使用单例。
3.SqlSession是MyBatis的关键对象,是执行持久化操作的对象,类似于JDBC中的Connection。它是应用程序与持久存储层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。使用玩SqlSession之后关闭Session很重要,应该确保使用finally块来关闭它。
4.配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = ssf.openSession();
typeAliases类型命名
<typeAliases>
<typeAlisa alias="user" type="com.pojo.User">
</typeAliases>
也可以指定包名
<typeAliases>
<typeAlisa name="com.pojo">
</typeAliases>
mapper映射器
MyBatis需要自己写sql语句,mapper映射器告诉MyBatis到哪里去找映射文件
使用类路径
<mappers>
<mapper resource="com.mapper.User.xml">
</mappers>
使用本地文件
<mappers>
<mapper url="file:///c:mapper/User.xml">
</mappers>
使用类接口
<mappers>
<mapper class="com.mapper.IUser">
</mappers>
使用包名
<mappers>
<package name="com.mapper">
</mappers>
MapperXML映射文件
select查询
insert插入
update更新
delete删除
sql可被其它语句引用的可重用语句块
cache给定命名空间的缓存配置
cache-ref其它命名空间缓存配置的引用
resultMap描述如何从数据库结果集中加载对象
5.动态sql
if
choose
where
set
foreach
bind
<mapper namespace="com.mapper.User">
<select id="selectUserByIdLike">
select * from user where state=‘ACTIVE‘
<if test="id != null">
and id = #{id}
</select>
</mapper>
6.事务管理
事务具备的四个特性:原子性(事务是应用中不可再分的最小逻辑执行体),一致性(事务执行的结果,必须从一种一致性到另一种一致性,一致性是通过原子性来保证的),隔离性(各个事务的执行互补干扰,并发执行的事务之间也不能相互影响),持续性(事务一旦提交,对数据所做的任何改变都要记录到永久存储器中,保存到物理数据库中)
MyBatis的事务管理分为两种
JDBC的事务管理机制:利用java.sql.Connection完成事务的提交,回滚,关闭
MANAGED事务管理机制:MyBatis自身不会去实现事务管理,而是交给WebLogic,JBOSS来实现事务的管理
事务的配置在xml中
<environment id="mysql">
<transactionManager type="JDBC"/>
</environment>
JdbcTranction使用java.sql.Connection来完成事务操作
ManagedTranction让容器来管理的
7.缓存机制
一级缓存是SqlSession级别的缓存,二级缓存是mapper级别的缓存,二级缓存是多个SqlSession共享的
一级缓存在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储数据,不同的SqlSession之间的缓存数据区域互不影响
当同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询时会从缓存中获取数据,不再去底层数据库中查询,从而提高查询效率。如果SqlSession执行了DML操作,insert,update,delete,并提交到了数据哭,MyBatis则会清空SqlSession中的一级缓存。当一个SqlSession结束后它的以及缓存也就不存在了,默认开启一级缓存
不同的SqlSession两次执行相同的namaespace下的sql语句,第一次执行完毕会将数据中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询。需要在setting全局参数配置开启二级缓存
<settings>
<setting name="cacheEnabled" value="true">
</settings>
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>开启mapper的namespace下的二级缓存
eviction回收策略
LRU最近最少使用的策略,移除最长时间不被使用的对象
FIFO先进先出策略,安对象进入缓存的顺序来移除它们
SOFT软引用策略,移除基于垃圾回收状态和软引用规则的对象
WEAK弱引用策略。更积极地移除基于垃圾回收状态和弱引用规则的对象
使用二级缓存时,与查询结果映射的java对象必须实现java.io.Serializable接口的序列化操作和反序列化操作,因为二级缓存数据存储介质多种多样,不一定在内存,有可能在硬盘或远程服务器