MyBatis Java API
(本文作为学习笔记,了解更多请参考:MyBatis参考文档)
应用目录结构
- 典型的应用目录结构
/my_application
/bin
/devlib
/lib <-- MyBatis *.jar 文件在这里。
/src
/org/myapp/
/action
/data <-- MyBatis 配置文件在这里, 包括映射器类, XML 配置, XML 映射文件。
/mybatis-config.xml
/BlogMapper.java
/BlogMapper.xml
/model
/service
/view
/properties <-- 在你 XML 中配置的属性文件在这里。
/test
/org/myapp/
/action
/data
/model
/service
/view
/properties
/web
/WEB-INF
/web.xml
SqlSessions
- 使用MyBatis的主要Java接口就是SqlSession。而SqlSession是通过SqlSessionFactory创建得到,SqlSessionFactory又是由SqlSessionFactoryBuilder得到,它可以从XML,注解或手动配置Java代码来创建SqlSessionFactory。
- 当MyBatis和一些依赖注入框架(如Spring或Guice)同时使用时,SqlSession将被依赖注入框架所创建,因此不需要使用SqlSessionFatoryBuilder或者SqlSessionFactory。
SqlSessionFactoryBuilder
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)
SqlSessionFactoryBuilder一共有5个build()方法,其中最常用的是第一种,当然也可以传入environment和properties。environment 决定加载哪种环境,包括数据源和事务管理器。比如:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
...
<dataSource type="POOLED">
...
</environment>
<environment id="production">
<transactionManager type="MANAGED">
...
<dataSource type="JNDI">
...
</environment>
</environments>
如果一个属性存在于多个位置,那么 MyBatis 将会按照下面的顺序来加载它们:
首先读取在 properties 元素体中指定的属性;
其次,读取从 properties 元素的类路径 resource 或 url 指定的属性,且会覆盖已经指定了的重复属性;
最后,读取作为方法参数传递的属性,且会覆盖已经从 properties 元素体和 resource 或 url 属性中加载了的重复属性。
代码示例:
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
SqlSessionFactory
SqlSessionFactory 有六个方法创建 SqlSession 实例。通常来说,当你选择这些方法时你需要考虑以下几点:
事务处理:我需要在 session 使用事务或者使用自动提交功能(auto-commit)吗?(通常意味着很多数据库和/或 JDBC 驱动没有事务)
连接:我需要依赖 MyBatis 获得来自数据源的配置吗?还是使用自己提供的配置?
执行语句:我需要 MyBatis 复用预处理语句和/或批量更新语句(包括插入和删除)吗?
SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType,TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();
默认的openSession()方法没有参数,他会创建如下特性的SqlSession:
会开启一个事务(也就是不自动提交)。
将从由当前环境配置的 DataSource 实例中获取 Connection 对象。
事务隔离级别将会使用驱动或数据源的默认设置。预处理语句不会被复用,也不会批量处理更新。
ExecutorType是一个枚举类型,定义了三个值:
ExecutorType.SIMPLE:这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。
ExecutorType.REUSE:这个执行器类型会复用预处理语句。
ExecutorType.BATCH:这个执行器会批量执行所有更新语句,如果 SELECT 在它们中间执行,必要时请把它们区分开来以保证行为的易读性。
getConfiguration()。这 个方法会返回一个 Configuration 实例,在运行时你可以使用它来自检 MyBatis 的配置。
SqlSession
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
<T> T selectOne(String statement)
<E> List<E> selectList(String statement)
<K,V> Map<K,V> selectMap(String statement, String mapKey)
int insert(String statement)
int update(String statement)
int delete(String statement)
<E> List<E> selectList (String statement, Object parameter, RowBounds rowBounds)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowbounds)
void select (String statement, Object parameter, ResultHandler<T> handler)
void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler<T> handler)
RowBounds 参数会告诉 MyBatis 略过指定数量的记录,还有限制返回结果的数量。RowBounds 类有一个构造方法来接收 offset 和 limit,另外,它们是不可二次赋值的。
int offset = 100;
int limit = 25;
RowBounds rowBounds = new RowBounds(offset, limit);
本地缓存
MyBatis使用到两种缓存:本地缓存和二级缓存
每当创建一个session,MyBatis就会创建一个与之相关联的本地缓存,任何在session中执行过的查询语句都会保存在本地缓存中,本地缓存会被增删改,提交事务,关闭事物以及关闭session清空。默认情况本地缓存可在整个session的周期内使用,
localCacheScope=STATEMENT 表示缓存仅在语句执行时有效清空本地缓存:
void clearCache()
确保SqlSession被关闭
为了确保SqlSession被关闭,最好是把session.close();
放在finally中
SqlSession session = sqlSessionFactory.openSession();
try {
// following 3 lines pseudocod for "doing some work"
session.insert(...);
session.update(...);
session.delete(...);
session.commit();
} finally {
session.close();
}
如使用的是jdk1.7以上和MyBatis3.2以上的版本,可以使用try-with-resources语句:
try (SqlSession session = sqlSessionFactory.openSession()) {
// following 3 lines pseudocode for "doing some work"
session.insert(...);
session.update(...);
session.delete(...);
session.commit();
}
Java注解
虽然可以通过Java注解实现数据的访问,但是依然离不开XML文件,更多Java注解请浏览 MyBatis Java API