1. 程式人生 > >Mybatis入門 Mybatis存在的意義 解決的問題 基本操作

Mybatis入門 Mybatis存在的意義 解決的問題 基本操作

## 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_