首页 > 代码库 > MyBatis的基本用法

MyBatis的基本用法

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="http://www.mamicode.com/true">

</settings>

<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>开启mapper的namespace下的二级缓存

eviction回收策略

LRU最近最少使用的策略,移除最长时间不被使用的对象

FIFO先进先出策略,安对象进入缓存的顺序来移除它们

SOFT软引用策略,移除基于垃圾回收状态和软引用规则的对象

WEAK弱引用策略。更积极地移除基于垃圾回收状态和弱引用规则的对象

使用二级缓存时,与查询结果映射的java对象必须实现java.io.Serializable接口的序列化操作和反序列化操作,因为二级缓存数据存储介质多种多样,不一定在内存,有可能在硬盘或远程服务器

 

MyBatis的基本用法