# MyBatis 概述
## 什么是 MyBatis ?
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
這里相信大家都使用過原生JDBC來操作過數據庫, 你的代碼可能是下面這個樣子的:
```
Goddess g = null;
Connection con = DBUtil.getConnection();//首先拿到數據庫的連接
String sql = "" +
"select * from imooc_goddess "+
"where id=?";//參數用?表示,相當于占位符;用mysql的日期函數current_date()來獲取當前日期
//預編譯sql語句
PreparedStatement psmt = con.prepareStatement(sql);
//先對應SQL語句,給SQL語句傳遞參數
psmt.setInt(1, id);
//執行SQL語句
/*psmt.execute();*///execute()方法是執行更改數據庫操作(包括新增、修改、刪除);executeQuery()是執行查詢操作
ResultSet rs = psmt.executeQuery();//返回一個結果集
//遍歷結果集
while(rs.next()) {
g = new Goddess();
g.setId(rs.getInt("id"));
g.setUserName(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
g.setSex(rs.getInt("sex"));
//rs.getDate("birthday")獲得的是java.sql.Date類型。注意:java.sql.Date類型是java.util.Date類型的子集,所以這里不需要進行轉換了。
g.setBirthday(rs.getDate("birthday"));
g.setEmail(rs.getString("email"));
g.setMobile(rs.getString("mobile"));
g.setCreateUser(rs.getString("create_user"));
g.setCreateDate(rs.getDate("create_date"));
g.setUpdateUser(rs.getString("update_user"));
g.setUpdateDate(rs.getDate("update_date"));
g.setIsDel(rs.getInt("isdel"));
}
```
這一部分代碼就是用來根據 ```imooc_goddess``` 表的```id```進行查詢, 然后遍歷結果集, 手動封裝成 ```Goddess``` 對象.
如果我們這樣做, 那么就需要做大量的費時費力的操作, 所以MyBatis來幫我們解決了 JDBC 代碼和手動設置參數以及獲取結果集的問題.
> 上面部分代碼摘抄自 [這篇文章](https://www.cnblogs.com/Qian123/p/5339164.html#_label4)
## XML 映射文件
在這一章的最前面我們說過
> MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄.
我們已經知道了 MyBatis 框架可以將結果集自動封裝成對象, 那么 MyBatis 是怎么知道, 表中的字段是和類中的哪個屬性對應的呢?
它們的對應關系就是依靠 ```XML 映射文件```. 當然在 MyBatis 中 ```XML 映射文件``` 不只是做字段和屬性的映射, 還有做接口中方法的映射, 當你調用方法后會執行你所編寫的SQL語句.
> 注意: ```XML 映射文件``` 也被稱為元數據.
## ORM 映射
說道字段和屬性的映射就不得不說一說 ```ORM 映射```, 當然你可能在看這篇筆記之前已經在網上了解過 MyBatis, 你也可能看到過類似的文章說: MyBatis 是基于ORM 映射的框架, 有的說它不是.
那么不管它是不是基于ORM 映射的框架, 我們也應該對ORM有所了解.
ORM: (Object/Relation Mapping): 對象/關系映射, 是一種設計模式. 幾乎所有的程序里面, 都存在對象和關系數據庫. 它們的對應關系如下:
| 類 | 表 |
| --- | --- |
| 對象 | 表中的一條記錄 |
| 屬性 | 表中的字段 |
比如Hibernate, 它就是實現了ORM的框架, Hibernate完全可以通過對象關系模型實現對數據庫的操作, 擁有完整的JavaBean對象與數據庫的映射結構來自動生成sql. 而MyBatis僅有基本的字段映射, 對象數據以及對象實際關系仍然需要通過手寫sql來實現和管理.
所以有的人也說Hibernate是全自動, 而MyBatis是半自動.