MyBatis 大幅简化你的代码并力图保持其简洁、容易理解和维护。

为了使得 SQL 映射更加优秀,MyBatis 3 引入了许多重要的改进。

1 目录结构
MyBatis 非常灵活,你可以随意安排你的文件。

但和其它框架一样,目录结构有一种最佳实践。

/example
/src/main/java
/org/mybatis/example
/action
/domain
/mapper
/service
/src/main/resources
/org/mybatis/example
/mapper

/src/test/java
/src/test/resources

/web
当然,这是推荐的目录结构,并非强制要求。

但使用一个通用的目录结构将更有利于大家沟通。

2 SqlSession
使用 MyBatis 的主要 Java 接口就是 SqlSession。

SqlSessions 是由 SqlSessionFactory 实例创建的。

而 SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的。

SqlSessionFactoryBuilder 有五个 build() 方法,每一种都允许你从不同的资源中创建一个 SqlSessionFactory 实例。

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)
第一种方法是最常用的,它接受一个指向 XML 文件(也就是之前讨论的 mybatis-config.xml 文件)的 InputStream 实例。

以下给出一个从 mybatis-config.xml 文件创建 SqlSessionFactory 的示例:

String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
Resources 会从类路径下、文件系统或一个 web URL 中加载资源文件。 在略读该类的源代码后,你会发现一整套相当实用的方法。 这里给出一个简表:

URL getResourceURL(String resource)
URL getResourceURL(ClassLoader loader, String resource)
InputStream getResourceAsStream(String resource)
InputStream getResourceAsStream(ClassLoader loader, String resource)
Properties getResourceAsProperties(String resource)
Properties getResourceAsProperties(ClassLoader loader, String resource)
Reader getResourceAsReader(String resource)
Reader getResourceAsReader(ClassLoader loader, String resource)
File getResourceAsFile(String resource)
File getResourceAsFile(ClassLoader loader, String resource)
InputStream getUrlAsStream(String urlString)
Reader getUrlAsReader(String urlString)
Properties getUrlAsProperties(String urlString)
Class classForName(String className)
SqlSessionFactory 有六个方法创建 SqlSession 实例。

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 对象。
事务隔离级别将会使用驱动或数据源的默认设置。
预处理语句不会被复用,也不会批量处理更新。
正如之前所提到的,SqlSession 在 MyBatis 中是非常强大的一个类。 它包含了所有执行语句、提交或回滚事务以及获取映射器实例的方法。 SqlSession 类的方法超过了 20 个,为了方便理解,我们将它们分成几种组别。

语句执行方法

这些方法被用来执行定义在 SQL 映射 XML 文件中的 SELECT、INSERT、UPDATE 和 DELETE 语句。

事务控制方法

有四个方法用来控制事务作用域。

void commit()
void commit(boolean force)
void rollback()
void rollback(boolean force)
确保 SqlSession 被关闭

void close()
SqlSession session = null;
try {
// 从类路径下加载资源文件mybatis-config.xml
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 由 SqlSessionFactoryBuilder创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 由 SqlSessionFactory创建SqlSession
session = sqlSessionFactory.openSession();
// ...
session.commit();
} catch (IOException e) {
e.printStackTrace();
session.rollback(true);
} finally {
session.close();
}
使用映射器

T getMapper(Class type)
上述的各个 insert、update、delete 和 select 方法都很强大,但也有些繁琐,它们并不符合类型安全,对你的 IDE 和单元测试也不是那么友好。

因此,使用映射器类来执行映射语句是更常见的做法。

下面的示例展示了一些方法签名以及它们是如何映射到 SqlSession 上的。

public interface AuthorMapper {
Author selectAuthor(int id);
List selectAuthors();
int insertAuthor(Author author);
int updateAuthor(Author author);
int deleteAuthor(int id);
}
映射器注解

设计初期的 MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,映射语句也是定义在 XML 中的。

MyBatis 3 构建在全面且强大的基于 Java 语言的配置 API 之上。它是 XML 和注解配置的基础。

注解提供了一种简单且低成本的方式来实现简单的映射语句。

@Insert("insert into author (id, username, password, email, bio, favourite_section) "
        + "values(#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection})")
int insertAuthorAnnotation(Author author);
@Update("update author set username = #{username}, password = #{password},"
        + " email = #{email}, bio = #{bio}, favourite_section = #{favouriteSection}" + " where id = #{id}")
int updateAuthorAnnotation(Author author);
@Delete("delete from author where id = #{id}")
public void deleteAuthorAnnotation(@Param("id") int id);