MyBatis

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註解）：

```java
package org.mybatis.example;

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

執行的示例：

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

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

```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執行語句：

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

詳細資訊可以參考MyBatis網站所提供的使用者手冊。參見外部連結。

## 與Spring集成

MyBatis與Spring Framework集成。Spring Framework允許MyBatis參與Spring事務，建立了MyBatis映射器和會話，並把他們注入到其他bean中。

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

```xml
<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:

```java
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查詢。

```xml
<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可譯作「MyBatis資料庫遷移管理工具」。是一個Java控制台應用程式，它通過管理數據定義語言（DDL）文件來跟蹤資料庫模式的變更。

Migrations可以查詢當前資料庫的狀態，應用或恢復對資料庫模式的變更。它也有助於發現和解決由多個開發人員並行修改資料庫模式的情況。

## 歷史

MyBatis項目繼承自iBATIS 3.0，其維護團隊也包含iBATIS的初創成員。

2010年5月19日項目創建。當時Apache iBATIS 3.0發布，其開發團隊宣布會在新的名字、新的站點中繼續開發。

2013年11月10日，項目遷移到了GitHub。

## 基本資料

- 開發者：MyBatis團隊
- 狀態：活躍
- 軟體版本週期：3.5.11
- 軟體版本週期：2022年9月18日
- 作業系統：跨平台
- 程式語言：Java
- 類型：持久化框架
- 許可協議：Apache許可證 2.0
- 網站：https://mybatis.org/mybatis-3/zh_CN/