1.什么是Mybatis?
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
2.Mybatis需要的包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.6</version>
</dependency>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
3. 获取 SqlSession
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置加载资源文件更加容易。
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
sqlSession = factory.openSession(true); // true 参数代表自动提交事务,否则需要手动管理事务,不然更改数据库的操作不能COMMIT
mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/db_nba?allowMultiQueries=true" /><!-- allowMultiQueries 允许一次性执行多个SQL,否则在一个映射文件中执行多个条SQL时会报格式错误 -->
<property name="username" value="root" />
<property name="password" value="123456" />
<property name="defaultAutoCommit" value="true"/> <!-- 配置事务自动提交,但是没有用 -->
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="resources/mybatis/PlayerMapper.xml" />
</mappers>
</configuration>
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。默认情况下是没有开启缓存的,除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的。要开启二级缓存,你需要在你的SQL 映射文件中添加一行
<cache/>
MyBatis支持二级缓存:
一级缓存:基于porpetualCache的HashMap本地缓存,存储作用域为session,当session被close或者flush后会被清空。
二级缓存:基于porpetualCache的HashMap本地缓存,存储作用域为Mapper(文件域),可自定义存储源。
当一个作用域(session,Mapper)内进行了CUD操作后,作用域下所有select缓存将被update。
三种情况下不能使用一级缓存:
1.执行了session.clearCache()
2.执行了CUD操作
3.不是同一个session
4.当不是一个session时只要使用同一个mapper文件中的select,使用二级缓存。
关于缓存的其他知识点:
1.映射语句文件中的所有 select 语句将会被缓存。
2.映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
3.缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
4.根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
5.缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
6.缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
参考文献:
http://www.yiibai.com/mybatis/
http://www.mybatis.org/mybatis-3/zh/index.html