MyBatis(一)-入門

来源:https://www.cnblogs.com/xiaoqigui/archive/2022/08/21/16602906.html
-Advertisement-
Play Games

==>>MyBatis中文網 1、第一個 mybastis程式 1.1 導入jar包 <mybatis.version>3.4.1</mybatis.version> <mysql.version>5.1.47</mysql.version> <!-- mybatis begin --> <depe ...


==>>MyBatis中文網

1、第一個 mybastis程式

1.1 導入jar包

<mybatis.version>3.4.1</mybatis.version>
<mysql.version>5.1.47</mysql.version>

<!--  mybatis  begin -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
</dependency>
<!--  mybatis  end -->
<!--  mysql  begin -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.version}</version>
</dependency>
<!--  mysql  end -->

1.2 jdcb.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/animedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2b8
username=root
password=root

1.3 mybatis-config.xml

數據配置信息可以直接在mybatis-config.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>
    <!-- 外部引入的資料庫配置文件 -->
    <properties resource="jdbc.properties"></properties>

    <typeAliases>
        <!-- 給所有的實體類 批量取別名 -->
        <package name="com.kgc.mybatis.bean"/>
    </typeAliases>

    <!-- 是指資料庫配置環境,可以直接寫值也可以引入外部配置文件 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name="com.kgc.mybatis.mapper"/>
    </mappers>

</configuration>

1.4 xxxMapper.xml

SQL映射文件;

<?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">
<!--
SQl語句映射文件:
   namespace :名稱空間
      1.單獨使用SqlSession的方法,可以隨意的定義,僅限於全限定名的方式,指定sql語句唯一標識字元串使用
      2.再面向介面開發時,不可以隨便寫了,必須時某個介面的全類名(全路徑名:包名+類名)
 -->
<!-- <mapper namespace="huayu">  隨意定義命名空間  -->    
<mapper namespace="com.kgc.mybatis.mapper.AnimeMapper">  <!-- 介面開發 -->
    
 <!--
    select標簽:查詢標簽
    id屬性:select標簽的唯一標識,再面向開發時,對應的時namespace指定介面的某個方法名
    resultType 屬性: 返回值類型
    #{id} :獲取調用介面,獲取參數值
-->
  <select id="selectAnime" parameterType="int" resultType="com.kgc.mybatis.bean.Anime">
    select * from animes where id = #{id}
  </select>
    
</mapper>

1.5 獲取 SqlSession 並執行SQL

1.5.1 獲取 SqlSessionFactory

  1. 指定mybatis的核心配置文件 “mybatis-config.xml”
  2. 使用mybatis提供Resources 工具類讀取核心配置文件,轉為輸入流對象
  3. 使用SqlSessionFactoryBuilder對象的build方法,獲取到DefaultSqlSessionFactory
//指定mybatis的核心配置文件路徑
String resource = "mybatis-config.xml";

//使用mybatis提供的Resources 工具類讀取核心配置文件,轉為輸入流對象
InputStream inputStream = Resources.getResourceAsStream(resource);

//使用SqlSessionFactoryBuilder對象的build方法,基於上一步的輸入流對象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

//獲取到的是 DefaultSqlSessionFactory
System.out.println(sqlSessionFactory);
//org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@45c8e616

1.5.2 sqlSessionFactory 獲取 SqlSession 實例

SqlSession 提供了在資料庫執行 SQL 命令所需的所有方法,拿到SqlSession 就可以執行;

session.selectOne(statement,parameter); 方法參數分析

參數 說明
statement 準備要執行的SQL語句的唯一標識符(mybatis可以識別,目的是可以通過此標識,查找到要執行的SQL語句)
parameter 準備要執行的SQL語句的參數值
//將實例化SqlSession放在 try()中,會自動關閉資源
try (SqlSession session  = sqlSessionFactory.openSession()) {
//通過獲取的SqlSession的實例,執行查詢操作
//根據動漫編號,查詢動漫詳情
//<mapper namespace="huayu">單獨使用SqlSession的方法,namespace可以隨意的定義
//namespace.方法名,通過sql語句唯一標識字元串,找到執行SQL
 Anime anime = (Anime) session.selectOne("huayu.selectAnime", 101);
    
 System.out.println(anime);
    
}

1.5.3 面向介面開發

註意在resource下建立文件夾的時候需要 com/kcg/mybatis ,中間的分隔符要使用反斜杠,不能用點;

  1. 創建介面xxxMapper.java(註意路徑要與xxxMapper.xml的包名結構一致;)
  2. 通過session.getMapper(xxxMapper.class); 獲取介面代理類
  3. 使用介面代理類,調用介面方法
try (SqlSession session  = sqlSessionFactory.openSession()) {
    //面向介面開發
    //推薦的方式
    AnimeMapper animeMapper = session.getMapper(AnimeMapper.class);
    System.out.println(animeMapper);
    //代理對象  org.apache.ibatis.binding.MapperProxy@4cc0edeb

    //直接就可以通過調用介面的方法,執行對象的SQl語句,並返回介面,不需要關心mybatis底層是調用那個方法
    Anime anime = animeMapper.selectAnime(101);
    System.out.println(anime);
    
}

try()中實例化對象報錯問題

https://www.cnblogs.com/xiaoqigui/p/16598100.html

指定maven版本就可以

<plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-compiler-plugin</artifactId>
     <configuration>
         <source>8</source>
         <target>8</target>
     </configuration>
</plugin>

2、配置

2.1 所有配置 和 順序

註意配置的順序不能錯,可以少寫,但是不能順序錯

2.2 properties 屬性

1、properties 屬性:自定義核心屬性配置,也可以引入外部的屬性文件,比如jdbc.properties;

  • resource 屬性指定外部配置文件,優先順序高於property子標簽屬性配置,可以以單獨使用,如果二者同時存在,優先以外部為主
//resource屬性引入的外部配置文件,優先順序高於property子標簽屬性
<properties resource="jdbc.properties">
<!-- <property name="driver" value="com.mysql.jdbc.Driver"/>-->
<!--  <property name="url" value="jdbc:mysql://localhost:3306/animedb?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=GMT%2b8"/>-->
<!--  <property name="username" value="root"/>-->
<!--  <property name="password" value="17585273765"/>-->
</properties>

2.3 settings 設置

一些設置的開啟;

下麵是簡單舉例,設置用很多,可以直接看官網;

<settings>
    <!-- 開啟駝峰自動映射 -->
   <setting name="mapUnderscoreToCamelCase" value="true" />
    <!-- mybatis自帶日誌 -->
<!--  <setting name="logImpl" value="STDOUT_LOGGING"/>   -->
    <!-- LOG4J日誌 -->
<!--  <setting name="logImpl" value="LOG4J"/>   -->
</settings>

2.4 typeAliases 類型別名

在SQL的xml文件中,resultType 可以使用 別名,不區分大小寫;

  • 單個取別名,在SQL的xml文件中,resultType 可以使用 別名,不區分大小寫
  • 批量取別名 :指定實體所在的父包路徑,自動指定包及子包中所有的實體批量取別名,預設的類名是首字母小寫,不區分大小寫;
  • 建議,如果沒有安裝插件,從SQL映射xml文件中無法自動定位到目標實體,不利於代碼的可讀性;
  • mybatis對 Java 的基本數據類型 有 內建的類型別名;
<typeAliases>
    <!-- 單個實體類設置別名 -->
<!-- <typeAlias type="com.kgc.mybatis.bean.Anime" alias="Anime"></typeAlias>-->
    <!-- 對整個個實體包下的實體類設置別名 -->
  <package name="com.kgc.mybatis.bean"/>
</typeAliases>

2.5 environments 環境配置

MyBatis 可以配置成適應多種環境;

不過要記住:儘管可以配置多個環境,但每個 SqlSessionFactory 實例只能選擇一種環境。

<environments default="development_test">
    <!--   開發環境     -->
    <environment id="development_dev">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
    <!--   測試環境     -->
    <environment id="development_test">
        ......
    </environment>
    <!--    生產環境    -->
    <environment id="development_prod">
        .......
    </environment>
</environments>

2.5.1 transactionManager 事務管理

environment 標簽的子標簽 transactionManager;

  • transactionManager:事務管理,使用的是jdbc的數據管理,以後框架整合會個Spring處理;
  • MyBatis 中有兩種類型的事務管理器(也就是 type="[JDBC|MANAGED]");
    JDBC – 這個配置直接使用了 JDBC 的提交和回滾設施,它依賴從數據源獲得的連接來管理事務作用域。
  • MANAGED – 這個配置幾乎沒做什麼。它從不提交或回滾一個連接,而是讓容器來管理事務的整個生命周期(比如 JEE 應用伺服器的上下文)。 預設情況下它會關閉連接。然而一些容器並不希望連接被關閉,因此需要將 closeConnection 屬性設置為 false 來阻止預設的關閉行為
  • 如果使用Spring + mybatis :事務管理,交給Spring處理;
<transactionManager type="JDBC"/>

2.5.2 dataSource 數據源

  • 數據源配置:有三種內建的數據源類型(也就是 type="[UNPOOLED|POOLED|JNDI]")
    以後由Spring處理;
<dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</dataSource>

2.6 mappers 映射器

  • 用於指定SQL文件的載入,作用:告訴MySql 到哪裡去找 映射文件

2.6.1 單個SQL映射文件的載入

  • resource
<mappers>
	<mapper resource="com/kgc/mybatis/AnimeMapper.xml"></mapper>
</mappers>
  • 通過介面
<mappers>
	<mapper class="com.kgc.mybatis.mapper.AnimeMapper"></mapper>
</mappers>

2.6.2 批量SQL映射文件載入

只需要指定mapper介面的所在包;

<mappers>
	<package name="com.kgc.mybatis.mapper"/>
</mappers>

3、MyBatis 執行過程

3.1 代碼分析執行過程

//1、載入全局配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

//2、實例化 SqlSessionFactoryBuilder 構建器
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

//3、解析 配置信息文件流,並返回  defaultSessionFactory
SqlSessionFactory defaultSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

//4、實例化 SqlSession
SqlSession sqlSession = defaultSessionFactory.openSession();
System.out.println(sqlSession);
//org.apache.ibatis.session.defaults.DefaultSqlSession@20398b7c

//5、獲取介面的代理實現類
AnimeMapper animeMapper = sqlSession.getMapper(AnimeMapper.class);

//調用介面的 代理類,執行方法
Anime anime = animeMapper.selectAnimeById(101);
System.out.println(anime);
//Anime(id=101, cid=1, name=鬥破蒼穹, author=土豆, actor=蕭炎, produce=玄機科技, createDate=Sun Aug 07 00:00:00 CST 2022)

3.2 源碼分析執行過程分析

3.2.1 Resources 載入全局配置文件

//載入全局配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

3.2.2 SqlSessionFactoryBuilder 構建器

//實例化 SqlSessionFactoryBuilder 構建器
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

3.2.3 sqlSessionFactoryBuilder.build(inputStream);

解析 配置信息文件流,並返回 defaultSessionFactory;

//解析 配置信息文件流,並返回  defaultSessionFactory
SqlSessionFactory defaultSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

手動實現,體驗實例化Configuration;

//手動解析配置文件流,實例化Configuration,體驗Mybatsi自動實例化Configuration;
//實例化 XMLConfigBuilder  參數:配置文件流,環境名字,Properties實例
//XMLConfigBuilder xmlConfigBuilder = new XMLConfigBuilder(inputStream, "development_dev", new Properties());

//解析配置文件流
//Configuration configuration = xmlConfigBuilder.parse();

`SqlSessionFactoryBuilder源碼分析:

sqlSessionFactoryBuilder.build(inputStream)方法,首先進入sqlSessionFactoryBuilder類

調用當前類的SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)方法;

其中,又調用當前類的一個build方法解析配置文件,並實例化DefaultSqlSessionFactory;

3.2.4 defaultSessionFactory.openSession();

//實例化 SqlSession
SqlSession sqlSession = defaultSessionFactory.openSession();
//org.apache.ibatis.session.defaults.DefaultSqlSession@20398b7c

DefaultSqlSessionFactory源碼分析:

openSession方法調用openSessionFromConnection;

openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) 方法:方法:

3.2.5 sqlSession.getMapper(xxx.class);

//獲取到介面的代理實現類
AnimeMapper animeMapper = sqlSession.getMapper(AnimeMapper.class);
//org.apache.ibatis.binding.MapperProxy@5abca1e0

//也可以通過,解析配置文件流 創建配置對象,並通過配置對象直接getMapper,前提是獲得了sqlSession
//Configuration configuration = xmlConfigBuilder.parse();
//AnimeMapper animeMapper = configuration.getMapper(AnimeMapper.class, sqlSession);

3.2.6 animeMapper.selectAnimeById(101);

//調用介面代理類,執行方法
Anime anime = animeMapper.selectAnimeById(101);
//Anime(id=101, cid=1, name=鬥破蒼穹, author=土豆, actor=蕭炎, produce=玄機科技, createDate=Sun Aug 07 00:00:00 CST 2022)

3.2.7 總結


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 什麼是HTML 點擊打開視頻講解更加詳細 Hyper Text Markup Language(超文本標記語言) 標簽控制排版 體積小,方便傳輸 編寫HTLML 推薦使用:VS Code <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
  • 迴圈列印紅綠燈 點擊打開視頻講解更加詳細 紅燈3秒後變成綠燈 綠燈5秒後變成黃燈 黃燈2秒後變成紅燈 案例: <template> <div id="app"> <div>迴圈列印紅綠燈</div> <div>紅燈3秒後變成綠燈</div> <div>綠燈5秒後變成黃燈</div> <div>黃燈2 ...
  • 在『伺服器部署 Vue 和 Django 項目的全記錄』一文中,介紹了在伺服器中使用 Nginx 部署前後端項目的過程。然而,當 Web 應用流量增多時,需要考慮負載均衡、流量分發、容災等情況,原生的部署方式通常難以滿足需求。此時,引入 Docker 部署多節點,能夠在單台高性能伺服器或伺服器集群中... ...
  • 類成員函數指針(member function pointer),是 C++ 語言的一類指針數據類型,用於存儲一個指定類具有給定的形參列表與返回值類型的成員函數的訪問信息。一般我們是不會使用的,都是直接將帶有返回值的函數作為參數或者另存後使用;像函數指針我們只會在定義包含多個函數的結構體類型時使用, ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 從發展階段來看,國內的互聯網公司大多都處於原始積累階段,大家都是 你有什麼功能,我也要有,本質上就是抄來抄去;這就導致然後大家都拼命擴軍、拼命提速,進入一種低維度的競爭狀態。 那麼這種局面應該如何打破呢? 如果發明出來更高級的“武器”,就能打破這一局面,那麼就算再快也沒用(我覺得發明更高級的武器就意 ...
  • 1. 獲取bean 在上圖的測試類中我們是通過id來獲取bean的。實際上獲取bean的方式有很多種,下麵我們就一一說明。 1.1 方式一:根據id獲取 由於 id 屬性指定了 bean 的唯一標識,所以根據 bean 標簽的 id 屬性可以精確獲取到一個組件對象。 如開頭中我們使用的就是這種方式。 ...
  • 某天,產品經理給了這麼一個需求技術小哥,能不能幫用戶添加一個搜索欄,查詢包含某個關鍵字的所有類目。技術小哥稍微想了一下,目前跟類目相關的表有兩個,一個是content_category類目表,一個是content_system內容系統表。而用戶要查找的關鍵字是存在content_system表裡面, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...