溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于MyBatis的數(shù)據(jù)持久化框架如何使用

發(fā)布時(shí)間:2022-08-17 10:26:34 來(lái)源:億速云 閱讀:129 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“基于MyBatis的數(shù)據(jù)持久化框架如何使用”,在日常操作中,相信很多人在基于MyBatis的數(shù)據(jù)持久化框架如何使用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”基于MyBatis的數(shù)據(jù)持久化框架如何使用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

    一、MyBatis是什么

    1.1、概述

    Mybatis是一個(gè)優(yōu)秀的開(kāi)源、輕量級(jí)持久層框架,它對(duì)JDBC操作數(shù)據(jù)庫(kù)的過(guò)程進(jìn)行封裝,簡(jiǎn)化了加載驅(qū)動(dòng)、創(chuàng)建連接、創(chuàng)建 statement 等繁雜的過(guò)程,使開(kāi)發(fā)者只需要關(guān)注sql本身。

    我們?cè)瓉?lái)使用JDBC操作數(shù)據(jù)庫(kù),需要手動(dòng)的寫(xiě)代碼去注冊(cè)驅(qū)動(dòng)、獲取connection、獲取statement等等,現(xiàn)在Mybaits幫助我們把這些事情做了,我們只需要關(guān)注我們的業(yè)務(wù)sql即可,這樣可以提高我們的開(kāi)發(fā)效率。

    MyBatis屬于半自動(dòng)的ORM框架

    MyBatis 支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射,可以在實(shí)體類和 SQL 語(yǔ)句之間建立mapping映射關(guān)系,是一種半自動(dòng)化的 ORM 實(shí)現(xiàn)。其封裝性低于 Hibernate,但性能優(yōu)秀、小巧、簡(jiǎn)單易學(xué)、應(yīng)用廣泛。

    1.2、什么是持久化

    數(shù)據(jù)持久化是將內(nèi)存中的數(shù)據(jù)模型轉(zhuǎn)換為存儲(chǔ)模型,以及將存儲(chǔ)模型轉(zhuǎn)換為內(nèi)存中數(shù)據(jù)模型的統(tǒng)稱。例如,文件的存儲(chǔ)、數(shù)據(jù)的讀取以及對(duì)數(shù)據(jù)表的增刪改查等都是數(shù)據(jù)持久化操作。

    1.3、什么是ORM

    ORM(Object Relational Mapping,對(duì)象關(guān)系映射)是一種數(shù)據(jù)持久化技術(shù),它在對(duì)象模型和關(guān)系型數(shù)據(jù)庫(kù)之間建立起對(duì)應(yīng)關(guān)系,并且提供了一種機(jī)制,通過(guò) JavaBean 對(duì)象去操作數(shù)據(jù)庫(kù)表中的數(shù)據(jù)。

    1.4、MyBatis主要內(nèi)容

    MyBatis 前身為 iBatis,2002 年由 Clinton Begin 發(fā)布。2010 年從 Apache 遷移到 Google,并改名為 MyBatis,2013 年又遷移到了 Github。

    MyBatis 的主要思想是將程序中的大量 SQL 語(yǔ)句剝離出來(lái),使用 XML 文件或注解的方式實(shí)現(xiàn) SQL 的靈活配置,將 SQL 語(yǔ)句與程序代碼分離,在不修改程序代碼的情況下,直接在配置文件中修改 SQL 語(yǔ)句。MyBatis與其它持久性框架最大的不同是,MyBatis 強(qiáng)調(diào)使用 SQL,而其它框架(例如 Hibernate)通常使用自定義查詢語(yǔ)言,即 HQL(Hibernate查詢語(yǔ)言)或EJB QL(Enterprise JavaBeans查詢語(yǔ)言)。

    1.5、優(yōu)點(diǎn)

    MyBatis是免費(fèi)且開(kāi)源的。

    與 JDBC 相比,減少了 50% 以上的代碼量。

    MyBatis是最簡(jiǎn)單的持久化框架,體積小巧并且學(xué)習(xí)門檻低。

    MyBatis相當(dāng)靈活,不會(huì)對(duì)應(yīng)用程序或者數(shù)據(jù)庫(kù)的現(xiàn)有設(shè)計(jì)強(qiáng)加任何影響,SQL 寫(xiě)在 XML 中,和程序邏輯代碼分離,降低耦合度,便于同一管理和優(yōu)化,提高了代碼的可重用性。

    提供 XML 標(biāo)簽,支持編寫(xiě)動(dòng)態(tài) SQL語(yǔ)句。

    提供映射標(biāo)簽,支持實(shí)體對(duì)象與數(shù)據(jù)庫(kù)的表字段關(guān)系映射。

    1.6、缺點(diǎn)

    編寫(xiě) SQL語(yǔ)句工作量較大,對(duì)開(kāi)發(fā)人員編寫(xiě) SQL 語(yǔ)句的功底有一定要求。

    SQL語(yǔ)句依賴于數(shù)據(jù)庫(kù),導(dǎo)致數(shù)據(jù)庫(kù)移植性差,不能隨意更換數(shù)據(jù)庫(kù)。

    二、MyBatis架構(gòu)

    2.1、mybatis所依賴的jar包

    lib 文件夾下的 jar 文件是 MyBatis的依賴包(mybatis-3.5.10.jar是MyBatis的核心包)

    基于MyBatis的數(shù)據(jù)持久化框架如何使用

    將需要的核心包全部添加進(jìn)項(xiàng)目構(gòu)建路徑中

    2.2、MyBatis準(zhǔn)備工作

    基于MyBatis的數(shù)據(jù)持久化框架如何使用

    ①創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu)

    ②創(chuàng)建實(shí)體類

    在 src 目錄下創(chuàng)建一個(gè)名為com.my.entity 的包,在該包中創(chuàng)建實(shí)體類 Website。

    package com.my.entity;
     
    import java.util.Date;
     
    //網(wǎng)站信息實(shí)體類
    public class Website {
        private int id;
        private String name;
        private String url;
        private int age;
        private String country;
        private Date createtime;
        
        @Override
        public String toString() {
            return "Website [id=" + id + ", name=" + name + ", url=" + url + ", age=" + age + ", country=" + country
                    + ", createtime=" + createtime + "]";
        }
     
        
        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;
        }
        public String getUrl() {
            return url;
        }
        public void setUrl(String url) {
            this.url = url;
        }
        public int getAge() {
            return age;
        }
     
        public void setAge(int age) {
            this.age = age;
        }
        public String getCountry() {
            return country;
        }
        public void setCountry(String country) {
            this.country = country;
        }
        public Date getCreatetime() {
            return createtime;
        }
        public void setCreatetime(Date createtime) {
            this.createtime = createtime;
        }
        
        
    }

    注意:在類中聲明的屬性名稱與數(shù)據(jù)表 website 的字段名稱,保持完全一致。

    ③ SQL映射文件(在 src 目錄下創(chuàng)建 com.my.mapper 包,在該包下創(chuàng)建映射文件 WebsiteMapper.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">
     
    <!-- SQL映射文件:配置執(zhí)行的SQL語(yǔ)句 -->
    <mapper namespace="com.my.mapper.WebsiteMapper">
            <!-- 添加操作的SQL映射 -->
            <insert id = "insertNewWebsite"  parameterType="com.my.entity.Website">
                insert into website(name,url,age,country)values(#{name},#{url},#{age},#{country})
            </insert>
              <!-- 查詢所有網(wǎng)站信息 -->
              <select id="selectWebsiteList"   resultType="com.my.entity.Website">
                      select * from website
              </select>
    </mapper>

    上述代碼中,<mapper> 元素是配置文件的根元素,它包含了 namespace屬性,該屬性值通常設(shè)置為“包名+SQL映射文件名”,用于指定唯一的命名空間。
    子元素 <select>、<insert> 中的信息用于執(zhí)行查詢、添加操作。

    在定義的 SQL語(yǔ)句中,“#{}”表示一個(gè)占位符,相當(dāng)于“?”,而“#{name}”表示該占位符用于接收參數(shù)中的名稱為 name的參數(shù)值。

    ④核心配置文件

    MyBatis 核心配置文件主要用于配置數(shù)據(jù)庫(kù)連接和 MyBatis運(yùn)行時(shí)所需的各種特性,包含了設(shè)置和影響 MyBatis 行為的屬性。

    在 src 目錄下創(chuàng)建 MyBatis的核心配置文件 mybatis-config.xml,在該文件中配置了數(shù)據(jù)庫(kù)環(huán)境和映射文件的位置,具體內(nèi)容如下:

    <?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>
          <!-- 框架參數(shù) -->
        <settings>
          <!-- 配置日志為L(zhǎng)OG4J -->  
          <setting name="logImpl" value="LOG4J" />
        </settings>
      
        <!-- 配置mybatis運(yùn)行環(huán)境 -->
        <environments default="development">
            <environment id="development">
                <!-- 使用JDBC的事務(wù)管理 -->
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <!-- MySQL數(shù)據(jù)庫(kù)驅(qū)動(dòng) -->
                    <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                    <!-- 連接數(shù)據(jù)庫(kù)的URL -->
                    <property name="url"
                        value="jdbc:mysql://localhost:3306/my_bank?charset=utf8mb4&amp;useSSL=false&amp;useTimezone=true&amp;serverTimezone=GMT%2B8" />
                    <property name="username" value="xxxx" />
                    <property name="password" value="xxxxxx" />
                </dataSource>
            </environment>
        </environments>
      
        <!-- 將mapper文件加入到配置文件中 -->
        <mappers>
            <mapper resource="com/my/mapper/EarthquakeMapper.xml" />
        </mappers>
    </configuration>

    ⑤日志文件

     MyBatis 默認(rèn)使用 log4j 輸出日志信息,如果開(kāi)發(fā)者需要查看控制臺(tái)輸出的 SQL 語(yǔ)句,可以在 classpath 路徑下配置其日志文件。在 mybatisDemo 的 src 目錄下創(chuàng)建 log4j.properties 文件

    # Global logging configuration
    log4j.rootLogger=ERROR,stdout
     
    # MyBatis logging configuration...
    log4j.logger.com.apesource=DEBUG
     
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    三、MyBatis 核心對(duì)象

    MyBatis 的核心接口和類包括:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。

    基于MyBatis的數(shù)據(jù)持久化框架如何使用

    使用步驟:

    1首先,獲取 SqlSessionFactoryBuilder對(duì)象,可以根據(jù) XML 配置文件或者 Configuration 類的實(shí)例構(gòu)建該對(duì)象。

    2其次,通過(guò) SqlSessionFactoryBuilder對(duì)象來(lái)獲取 SqlSessionFactory 對(duì)象。

    3最后,獲取 SqlSessionFactory 對(duì)象之后,就可以進(jìn)一步獲取 SqlSession 實(shí)例。SqlSession 對(duì)象中完全包含以數(shù)據(jù)庫(kù)為背景的所有執(zhí)行 SQL 操作的方法,用該實(shí)例可以直接執(zhí)行已映射的 SQL 語(yǔ)句。

    核心對(duì)象的生命周期和作用域

    SqlSessionFactoryBuilder

    這個(gè)類可以被實(shí)例化、使用和丟棄,一旦創(chuàng)建了SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實(shí)例的最佳作用域是方法作用域(也就是局部方法變量)。 可以重用 SqlSessionFactoryBuilder 來(lái)創(chuàng)建多個(gè) SqlSessionFactory 實(shí)例。

    SqlSessionFactory

    SqlSessionFactory 一旦被創(chuàng)建就應(yīng)該在應(yīng)用的運(yùn)行期間一直存在,沒(méi)有任何理由丟棄它或重新創(chuàng)建另一個(gè)實(shí)例。 使用 SqlSessionFactory 的最佳實(shí)踐是在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞習(xí)慣”。因此 SqlSessionFactory 的最佳作用域是"應(yīng)用作用域"。即隨著應(yīng)用程序的生命周期一直存在。這種“存在于整個(gè)應(yīng)用運(yùn)行期間,并且只存在一個(gè)對(duì)象實(shí)例”。例如使用單例模式。

    SqlSession

    每個(gè)線程都應(yīng)該有它自己的 SqlSession 實(shí)例。SqlSession 的實(shí)例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請(qǐng)求或方法作用域。 絕對(duì)不能將 SqlSession 實(shí)例的引用放在一個(gè)類的靜態(tài)域,甚至一個(gè)類的實(shí)例變量也不行。為了確保每次都能執(zhí)行關(guān)閉操作,你應(yīng)該把這個(gè)關(guān)閉操作放到 finally 塊中。

    將其代入實(shí)例中封裝為MyBatis工具類和實(shí)

    工具類

    package com.my.dao;
     
    import java.io.IOException;
     
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     
    public class MybatisDBUtils {
        private static SqlSessionFactory factory = null;
        static {
            try {
                SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
                factory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        public static SqlSession getSqlSession() {
            SqlSession session = null;
            if(factory != null) {
                session = factory.openSession();
            }
            return session;
        }
     
    }

    實(shí)現(xiàn)類

    public class Test04 {
        public static void main(String[] args) {
            //每1000條執(zhí)行一次批處理,并獲取主鍵回填
            try (SqlSession sqlSession = MybatisDBUtils.getBatchSqlSession()) {
                WebsiteMapper websiteMapper = sqlSession.getMapper(WebsiteMapper.class);
                
                for(int i = 1;i <= 10;i++) {
                  Website website = new Website("神碼搜索","www.shenma.com",((int)(Math.random()*10)),"CN");
            }
        }
    }

    到此,關(guān)于“基于MyBatis的數(shù)據(jù)持久化框架如何使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI