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

一隻胡說八道的猴子發表於2020-10-31

Mybatis入門 Mybatis的作用 解決的問題 基本操作

在這裡插入圖片描述

為什麼要學MyBatis

我們連結運算元據庫需要做的步驟

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都幫我們實現好了,站在前人的肩膀上幹活總是省力

在這裡插入圖片描述

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會幫助我們把實體的變化對映到資料庫表。

在這裡插入圖片描述

作用

ORM框架自動實現Entity實體的屬性與關係型資料庫欄位的對映。CRUD的工作則可以交給ORM來自動生成程式碼方式實現。隱藏了資料訪問細節,“封閉”的通用資料庫互動,他使得我們的通用資料庫互動變得簡單易行,並且完全不用考慮SQL語句。大大提高我們開發效率, 這樣一來也減少我們維護一個複雜 缺乏靈活性資料訪問層的成本。

下面我們用一個簡單的案例來給大家操作一下Myabatis的基本實現

1.所需的jar座標

 <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.32</version>
    </dependency>

2.建立一個簡單的表
在這裡插入圖片描述

3.在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

<?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="UserAction">
    <select id="selectId" resultType="int">
        select id from Test
    </select>
</mapper>

5.編寫核心檔案SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="username" value="root"/>
                <property name="password" value="1234"/>
                <property name="url" value="jdbc:mysql://localhost:3309/test"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

6.測試類

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<Integer> id = sqlSession.selectList("UserAction.selectId");
    System.out.println(id);
    //釋放資源
    sqlSession.close();
    }
}

結果

在這裡插入圖片描述

在這裡插入圖片描述

1.插入操作

 <insert id="add" parameterType="domain.User">
       insert into test values(#{id},#{name})
    </insert>

括號裡的名字要與傳入的物件中的變數名一致

2.修改操作

 <update id="update" parameterType="domain.User">
        update test set username=#{name} where id=#{id}
    </update>

括號裡的名字要與傳入引數一致
3.刪除操作

 <!--刪除操作-->
    <delete id="delete" parameterType="int">
        delete * from test where id=#{id}
    </delete>

在這裡插入圖片描述
括號裡的名字要與傳入引數一致

Mybatis核心配置檔案的配置項概述

在這裡插入圖片描述在這裡插入圖片描述
1.environments標籤

事務管理器
其中,事務管理器(transactionManager)型別有兩種:
JDBC:這個配置就是直接使用了JDBC 的提交和回滾設定,它依賴於從資料來源得到的連線來管理事務作用域。
MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線,而是讓容器來管理事務的整個生命週期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連線,然而一些容器並不希望這樣,因此需要將 closeConnection 屬性設定為 false 來阻止它預設的關閉行為。
資料來源
其中,資料來源(dataSource)型別有三種:
UNPOOLED:這個資料來源的實現只是每次被請求時開啟和關閉連線。
POOLED:這種資料來源的實現利用“池”的概念將 JDBC 連線物件組織起來。
JNDI:這個資料來源的實現是為了能在如 EJB 或應用伺服器這類容器中使用,容器可以集中或在外部配置資料來源,然後放置一個 JNDI 上下文的引用。

2.mapper標籤

該標籤的作用是載入對映的,載入方式有如下幾種:
使用相對於類路徑的資源引用,例如:
使用完全限定資源定位符(URL),例如:
使用對映器介面實現類的完全限定類名,例如:
將包內的對映器介面實現全部註冊為對映器,例如:

3.properties標籤
和spring框架中的配置沒區別
在這裡插入圖片描述4. typeAliases標籤
一個用於取別名的標籤
本來的配置

**使用別名後** ```java ```
<select id="findAll" resultType=“user">  
  select * from User
  </select>

許多別名mybatis已經幫我們配置好了

在這裡插入圖片描述

一些對應的API

常用API:SqlSessionFactory build(InputStream inputStream)
通過載入mybatis的核心檔案的輸入流的形式構建一個SqlSessionFactory物件

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 例項。常用的有如下兩個:

在這裡插入圖片描述

SqlSession 例項在 MyBatis 中是非常強大的一個類。在這裡你會看到所有執行語句、提交或回滾事務和獲取對映器例項的方法。

主要執行語句

<T> T selectOne(String statement, Object parameter) 
<E> List<E> selectList(String statement, Object parameter) 
int insert(String statement, Object parameter) 
int update(String statement, Object parameter) 
int delete(String statement, Object parameter)

操作事務的方法

void commit()  
void rollback() 

以上就是Mybatis的一些基礎操作,如有幫助還請點贊關注支援,如有疑問評論私信都可,看到後可幫助解答本部落格主要側重於資料結構於演算法和java開發,作業系統,計算機網路,覺得我的文章有幫助的小夥伴可以關注我,有疑問可評論私信,相逢即是緣,大家高處見

在這裡插入圖片描述

相關文章