**MyBatis**是一个Java持久化框架，它通过XML描述符或注解把对象与存储过程或SQL语句关联起来，映射成資料庫內對應的紀錄。

MyBatis是在Apache许可证 2.0下分发的自由软件，是iBATIS 3.0的分支版本，其维护团队也包含iBATIS的初创成员。

功能概况
----

与其他对象关系映射框架不同，MyBatis没有将Java对象与数据库表关联起来，而是将Java方法与SQL语句关联。MyBatis允许用户充分利用数据库的各种功能，例如存储过程、视图、各种复杂的查询以及某数据库的专有特性。如果要对遗留数据库、不规范的数据库进行操作，或者要完全控制SQL的执行，MyBatis是一个不错的选择。

与JDBC相比，MyBatis简化了相关代码：SQL语句在一行代码中就能执行。MyBatis提供了一个映射引擎，声明式的把SQL语句执行结果与对象树映射起来。通过使用一种内建的类XML表达式语言，或者使用Apache Velocity集成的插件，SQL语句可以被动态的生成。

MyBatis与Spring Framework和Google Guice（英语：）集成，这使开发者免于依赖性问题。

MyBatis支持声明式数据缓存（declarative data caching）。当一条SQL语句被标记为"可缓存"后，首次执行它时从数据库取得的所有数据会被存储在一段高速缓存中，今后执行这条语句时就会从高速缓存中读取结果，而不是再次命中数据库。MyBatis提供了基于 Java HashMap 的默认缓存实现，以及用于与OSCache（英语：）、Ehcache（英语：）、Hazelcast（英语：）和Memcached连接的默认连接器。MyBatis还提供API供其他缓存实现使用。

用法
--

SQL语句存储在XML文件或Java 注解中。一个MyBatis映射的示例（其中用到了Java接口和MyBatis注解）：

```
package org.mybatis.example;

public interface BlogMapper {
 @Select("select \* from Blog where id = #{id}")
 Blog selectBlog(int id);
}

```

执行的示例：

```
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

```

SQL语句和映射也可以外化到一个XML文件中：

```
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="org.mybatis.example.BlogMapper">
 <select id="selectBlog" parameterType="int" resultType="Blog">
 select * from Blog where id = #{id}
 </select>
</mapper>

```

也可以使用MyBatis API执行语句：

```
Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

```

详细信息可以参考MyBatis网站所提供的用户手册。参见外部链接。

与Spring集成
---------

MyBatis与Spring Framework集成。Spring Framework允许MyBatis参与Spring事务，建立了MyBatis映射器和会话，并把他们注入到其他bean中。

如下所示是一个基本的XML配置示例：建立了映射器，并注入到"BlogService"bean中。

```
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
 <property name="dataSource" ref="dataSource" />
</bean>

<bean id="blogMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
 <property name="sqlSessionFactory" ref="sqlSessionFactory" />
 <property name="mapperInterface" value="org.mybatis.example.BlogMapper" />
</bean>

<bean id="blogService" class="org.mybatis.example.BlogServiceImpl">
 <property name="blogMapper" ref="blogMapper" />
</bean>

```

现在调用MyBatis只需要调用一个bean:

```
public class BlogServiceImpl implements BlogService {

 private BlogMapper blogMapper;

 public void setBlogMapper(BlogMapper blogMapper) {
 this.blogMapper = blogMapper;
 }

 public void doSomethingWithABlog(int blogId) {
 Blog blog = blogMapper.selectBlog(blogId);
 ...
 }
}

```

Velocity语言
----------

Velocity语言驱动程序允许用户使用Apache Velocity来快速生成动态SQL查询。

```
<select id="findPerson" lang="velocity">
 #set( $pattern = $_parameter.name + '%' )
 SELECT *
 FROM person
 WHERE name LIKE @{pattern, jdbcType=VARCHAR}
</select>

```

MyBatis生成器
----------

MyBatis提供了代码生成器。MyBatis生成器（MyBatis Generator）能对数据库表内省，生成执行的增删改查（英语：）（CRUD）时所需的MyBatis代码。有相关的Eclipse插件可供使用。

MyBatis Migrations
------------------

MyBatis Migrations是一个Java控制台应用程序，它通过管理数据定义语言（DDL）文件来跟踪数据库模式（英语：）的变更。

Migrations可以查询当前数据库的状态，应用或恢复对数据库模式（英语：）的变更。它也有助于发现和解决由多个开发人员并行修改数据库模式的情况。

历史
--

MyBatis项目继承自iBATIS 3.0，其维护团队也包含iBATIS的初创成员。

2010年5月19日项目创建。当时Apache iBATIS 3.0发布，其开发团队宣布会在新的名字、新的站点中继续开发。

2013年11月10日，项目迁移到了GitHub。

参见
--

* Hibernate
* iBATIS
* JDBC
* Java持久化API（JPA）
* EclipseLink（英语：）
* Ebean（英语：）
* 面向Java对象查询（jOOQ）
* Apache Cayenne（英语：）
* pureQuery
* NHydrate（英语：）
* Hydrate（页面存档备份，存于）
* OpenJPA（英语：）
* Spring Framework
* Google Guice（英语：）
* O/R Broker
* ObjectiveSql （页面存档备份，存于）

注脚
--

1. ↑  可译作"MyBatis数据库迁移管理工具"。
2. ↑  即模式迁移（英语：）

参考文献
----

1. ↑  .
2. ↑ . 2023年3月1日  [2023年3月23日].
3. ↑  周冠亞、黃文毅.. 清華大學出版社. 2019. ISBN 9787302531029.
4. ↑ . ibatis.apache.org.  [2020-11-11]. （原始内容存档于2020-07-11）.
5. ↑ .  [2014-04-08]. （原始内容存档于2016-03-04）.
6. ↑ .  [2014-04-08]. （原始内容存档于2013-11-10）.

外部链接
----

* 官方网站