Mybatis入門 Mybatis存在的意義 解決的問題 基本操作
阿新 • • 發佈:2020-10-31
## Mybatis入門 Mybatis的作用 解決的問題 基本操作
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020103022221353.png#pic_center)
## 為什麼要學MyBatis
## 我們連結操作資料庫需要做的步驟
```java
package Test;
import java.sql.*;
public class test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//註冊驅動
Class.forName("com.mysql.jdbc.Driver");
//獲取連結
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3309/test", "root", "1234");
//獲取statement
PreparedStatement statement = connection.prepareStatement("select id from user");
//執行
ResultSet resultSet = statement.executeQuery();
//遍歷結果集
while(resultSet.next()){
}
//釋放資源
resultSet.close();
statement.close();
connection.close();
}
}
```
**缺點:**
原始jdbc開發存在的問題如下:
1.資料庫建立及頻繁釋放造成系統資源浪費
2.sql語句在程式碼中硬編碼,實際運用中sql的變化較大,sql變動需要改變java程式碼
3.查詢操作,需要手動將結果集裡的資料封裝到實體中,插入操作時,需要手動將實體的資料設定到sql語句的佔位符
**解決方案:**
1.使用資料庫連線池技術
2.使用xml配置的方式配置sql語句
3.使用反射內省的技術自動將實體和表進行屬性與欄位的自動對映
**這個解決方案不用我們去實現,因為mybatis都幫我們實現好了,站在前人的肩膀上幹活總是省力**
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201030225124903.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)
## Mybatis是什麼:
一個優秀的基於java的持久層框架,內部封裝了jdbc,使開發者只需要關心sql語句本身,而不需要花費經歷在如何載入驅動,建立連結,建立statement等繁雜的過程
mybatis通過註解和xml配置的方式將要執行各種statement配置起來。並通過java物件和statement中的動態引數進行對映生成最終執行的sql語句
最後mybatis框架執行sql語句並將其封裝為java物件返回採用ORM思想解決了實體與資料庫對映的問題,遮蔽了jdbc api 底層訪問細節,使我們不用與jdbc api 打交道,就可以完成對資料庫的持久化操作。
## ORM簡介:
ORM(Object Relational Mapping)物件關係對映,它的作用是在關係型資料庫和物件之間作一個對映,這樣,我們在具體的操作資料庫的時候,就不需要再去和複雜的SQL語句打交道,只要像平時操作物件一樣操作它就可以了 ,即將程式中的物件自動的持久化到關係資料庫中
**O(物件模型)**:
實體物件,即我們在程式中根據資料庫表結構建立的一個個實體Entity。
**R(關係型資料庫的資料結構):**
即我們建立的資料庫表。
**M(對映)**:
從R(資料庫)到O(物件模型)的對映,可通過XML檔案對映。
如圖:當表實體傳送變化時,ORM會幫助我們把實體的變化對映到資料庫表。
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201030223631286.png#pic_center)
**作用**
ORM框架自動實現Entity實體的屬性與關係型資料庫欄位的對映。CRUD的工作則可以交給ORM來自動生成程式碼方式實現。隱藏了資料訪問細節,“封閉”的通用資料庫互動,他使得我們的通用資料庫互動變得簡單易行,並且完全不用考慮SQL語句。大大提高我們開發效率, 這樣一來也減少我們維護一個複雜 缺乏靈活性資料訪問層的成本。
## 下面我們用一個簡單的案例來給大家操作一下Myabatis的基本實現
**1.所需的jar座標**
```java
org.mybatis
mybatis
3.4.5
mysql
mysql-connector-java
5.1.32
```
**2.建立一個簡單的表**
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201031085540741.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)
**3.在java中寫一個對應的類**
```java
package domain;
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
```
**4.編寫對映檔案UserMapper.xml**
```java
```
**5.編寫核心檔案SqlMapConfig.xml**
```java
```
**6.測試類**
```java
package Test;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class test2 {
@Test
public void test1() throws IOException {
//載入核心配置檔案
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//獲取sqlsession工廠物件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//獲取session物件
SqlSession sqlSession = sqlSessionFactory.openSession();
//執行sql語句
List id = sqlSession.selectList("UserAction.selectId");
System.out.println(id);
//釋放資源
sqlSession.close();
}
}
```
**結果**
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201031093510932.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201031093823954.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)
**1.插入操作**
```java
insert into test values(#{id},#{name})
```
**括號裡的名字要與傳入的物件中的變數名一致**
**2.修改操作**
```java
update test set username=#{name} where id=#{id}
```
**括號裡的名字要與傳入引數一致**
**3.刪除操作**
```java
delete * from test where id=#{id}
```
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020103110215292.png#pic_center)
**括號裡的名字要與傳入引數一致**
## Mybatis核心配置檔案的配置項概述
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201031094951681.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201031095119950.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)
**1.environments標籤**
**事務管理器**
其中,事務管理器(transactionManager)型別有兩種:
JDBC:這個配置就是直接使用了JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。
MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。
**資料來源**
其中,資料來源(dataSource)型別有三種:
UNPOOLED:這個資料來源的實現只是每次被請求時開啟和關閉連線。
POOLED:這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來。
JNDI:這個資料來源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置資料來源,然後放置一個 JNDI 上下文的引用。
**2.mapper標籤**
該標籤的作用是載入對映的,載入方式有如下幾種:
使用相對於類路徑的資源引用,例如:
使用完全限定資源定位符(URL),例如:
使用對映器介面實現類的完全限定類名,例如:
將包內的對映器介面實現全部註冊為對映器,例如:
**3.properties標籤**
和spring框架中的配置沒區別
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201031095523709.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)**4. typeAliases標籤**
**一個用於取別名的標籤**
**本來的配置**
**使用別名後**
```java
```
```java
```
**許多別名mybatis已經幫我們配置好了**
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201031101213959.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_center)
## 一些對應的API
**常用API**:SqlSessionFactory build(InputStream inputStream)
通過載入mybatis的核心檔案的輸入流的形式構建一個SqlSessionFactory物件
```java
String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
```
其中, Resources 工具類,這個類在 org.apache.ibatis.io 包中。Resources 類幫助你從類路徑下、檔案系統或一個 web URL 中載入資原始檔。
SqlSessionFactory 有多個個方法建立 SqlSession 例項。常用的有如下兩個:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201031101445262.png#pic_center)
SqlSession 例項在 MyBatis 中是非常強大的一個類。在這裡你會看到所有執行語句、提交或回滾事務和獲取對映器例項的方法。
**主要執行語句**
```java
T selectOne(String statement, Object parameter)
List selectList(String statement, Object parameter)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
```
**操作事務的方法**
```java
void commit()
void rollback()
```
## 以上就是Mybatis的一些基礎操作,如有幫助還請點贊關注支援,如有疑問評論私信都可,看到後可幫助解答本部落格主要側重於資料結構於演算法和java開發,作業系統,計算機網路,覺得我的文章有幫助的小夥伴可以關注我,有疑問可評論私信,相逢即是緣,大家高處見
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201031101835920.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3BqaDg4,size_16,color_FFFFFF,t_70#pic_