Mybatis系列全解(二):Mybatis簡(jiǎn)介與環(huán)境搭建

封面:洛小汐
作者:潘潘

Mybatis 是一套持久層框架,靈活易用,特別流行。

前言

Mybatis系列全解,我們預(yù)計(jì)準(zhǔn)備10+篇文章,讓我們了解到 Mybatis 的基本全貌,真正從入門到上手,從上手到精通,本文為首篇,我們開始。

Mybaits系列全解 (持續(xù)更新)


目錄


1、Mybatis是什么

2、Mybatis的前世今生

3、Mybatis的優(yōu)勢(shì)

4、Mybatis整體架構(gòu)圖

5、環(huán)境搭建

6、總結(jié)

Mybatis是什么

我們先看一下官網(wǎng)簡(jiǎn)介,Mybatis 官網(wǎng):https://mybatis.org/mybatis-3/

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

大致翻譯為:

MyBatis是一款優(yōu)秀的持久層框架,它支持定制化SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。MyBatis避免了幾乎所有的JDBC代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis可以使用簡(jiǎn)單的XML或注解來(lái)配置和映射原生類型、集合接口以及Java的POJO(Plain Old Java Objects,普通老式 Java 對(duì)象)為數(shù)據(jù)庫(kù)中的記錄。

我目前的理解是,Mybatis 本身抽象了大量的 JDBC 冗余代碼,同時(shí)基于對(duì)象關(guān)系映射模型,向外提供了一套靈活易用的 API 和數(shù)據(jù)庫(kù)做交互。

Mybatis的前世今生

凡事皆有過(guò)往,之前我們講過(guò)一篇 JDBC 的介紹與實(shí)際應(yīng)用,并分析對(duì)比了 JDBC 與持久層框架的差異,由于 JDBC 需要開發(fā)人員編寫過(guò)多的代碼,操作所有對(duì)象,既麻煩還特別容易出錯(cuò),所以在我們實(shí)際開發(fā)中很少直接使用 JDBC 進(jìn)行編程,于是 ORM 的登臺(tái)顯得尤為重要,ORM 全稱是 Object/Relation Mapping:表示 對(duì)象-關(guān)系映射 的縮寫。

ORM映射模型

ORM模型 ,簡(jiǎn)單來(lái)說(shuō),就是數(shù)據(jù)庫(kù)的表和簡(jiǎn)單 Java 對(duì)象的映射關(guān)系模型。采用ORM框架后,應(yīng)用程序不再直接訪問(wèn)底層數(shù)據(jù)庫(kù),而是以 面向?qū)ο?/strong> 的方式來(lái)操作持久化對(duì)象,而ORM框架則將這些面向?qū)ο蟮牟僮鬓D(zhuǎn)換成底層SQL操作。ORM框架實(shí)現(xiàn)的效果:把對(duì)持久化對(duì)象的保存、修改、刪除 等操作,轉(zhuǎn)換為對(duì)數(shù)據(jù)庫(kù)的操作。

Hibernate模型開發(fā)過(guò)程

最初 SUN 公司推出了 Java EE 服務(wù)器端組件模型(EJB),不過(guò)由于EJB 配置過(guò)于復(fù)雜,且適應(yīng)范圍小于是很快就被淘汰。后來(lái)封裝度極高、開發(fā)效率極高、全表映射的 ORM 持久層框架Hibernate 出現(xiàn),成為了當(dāng)時(shí)首選的 Java ORM 模型框架。但是隨著互聯(lián)網(wǎng)的極速發(fā)展、復(fù)雜業(yè)務(wù)場(chǎng)景的不斷涌現(xiàn),Hibernate 在許多方面慢慢暴露出了缺點(diǎn):靈活性不夠、無(wú)法根據(jù)不同條件組裝不同SQL、對(duì)多表關(guān)聯(lián)和復(fù)雜SQL查詢支持較差、SQL優(yōu)化和性能差、全表映射帶來(lái)的不便等等。

MybatisLogo

于是 Mybatis 框架應(yīng)運(yùn)而生,彌補(bǔ)了Hibernate的不足,不僅簡(jiǎn)單易用,而且具有高度靈活、可優(yōu)化、易維護(hù)等特點(diǎn),成為如今大型互聯(lián)網(wǎng)項(xiàng)目的首選框架。

Mybatis 野史:Mybatis 前身是 iBATIS,2001年由Clinton Begin發(fā)起的一個(gè)開源項(xiàng)目,最初側(cè)重于密碼軟件的開發(fā),后來(lái)發(fā)展成為一款基于Java的持久層框架,2004年,Clinton 將 iBATIS 的名字和源碼捐贈(zèng)給 Apache 軟件基金會(huì),接下來(lái)的6年中,開源軟件世界發(fā)生了巨大的變化,一切開發(fā)實(shí)踐、基礎(chǔ)設(shè)施、許可,甚至數(shù)據(jù)庫(kù)技術(shù)都徹底改變了。在2010年6月,核心開發(fā)團(tuán)隊(duì)把這個(gè)項(xiàng)目由 apache software foundation 遷移到了google code,隨著開發(fā)團(tuán)隊(duì)轉(zhuǎn)投 Google Code 旗下,ibatis3.x 正式更名為 Mybatis ,代碼于2013年11月遷移到 Github 。

Mybatis的優(yōu)勢(shì)

Mybatis 是一個(gè)半自動(dòng)化的持久層框架,對(duì)開發(fā)人員來(lái)說(shuō),核心 sql 還是需要自己進(jìn)行優(yōu)化,sql 和 java 編碼進(jìn)行分離,功能邊界清晰,一個(gè)專注業(yè)務(wù),一個(gè)專注數(shù)據(jù)。

藍(lán)色區(qū)域是 Mybatis 框架功能支持,紅色區(qū)域是應(yīng)用了Mybatis 框架的工程項(xiàng)目實(shí)際需要操作的2個(gè)步驟:
Mybatis框架應(yīng)用實(shí)例
當(dāng)前有很多 Java 實(shí)現(xiàn)的持久化框架,而 MyBatis 流行起來(lái)有以下原因:

1、它消除了大量的 JDBC 冗余代碼

2、它有低的學(xué)習(xí)曲線

3、它能很好地與傳統(tǒng)數(shù)據(jù)庫(kù)協(xié)同工作

4、它可以接受 SQL 語(yǔ)句

5、它提供了與 Spring 和 Guice 框架的集成支持

6、它提供了與第三方緩存類庫(kù)的集成支持

7、它引入了更好的性能

Mybatis整體架構(gòu)圖

Mybatis整體架構(gòu)圖

環(huán)境搭建

默認(rèn)已安裝 Java 開發(fā)環(huán)境、Mysql數(shù)據(jù)庫(kù)、Maven 環(huán)境。

Mybatis 開發(fā)與環(huán)境搭建,我們先入門體驗(yàn),步驟如下:

1、創(chuàng)建 maven 工程

2、添加 MyBatis 倉(cāng)庫(kù)坐標(biāo)(非maven項(xiàng)目則引入jar包)

3、創(chuàng)建user數(shù)據(jù)表

4、編寫User實(shí)體類

5、編寫映射文件UserMapper.xml

6、編寫核心文件SqlMapConfig.xml

7、編寫測(cè)試類

1、創(chuàng)建 maven 工程

創(chuàng)建maven工程

2、添加 MyBatis 倉(cāng)庫(kù)坐標(biāo)


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>

        <!--mybatis坐標(biāo)-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

        <!--mysql驅(qū)動(dòng)坐標(biāo)-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
            <scope>runtime</scope>
        </dependency>

        <!--單元測(cè)試坐標(biāo)-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!--日志坐標(biāo)-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>

    </dependencies>

3、創(chuàng)建user數(shù)據(jù)表


CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  `birthday` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

User表數(shù)據(jù)

4、編寫User實(shí)體類


package com.panshenlian.pojo;

/**
 * @Author: panshenlian
 * @Description: 用戶實(shí)體
 * @Date: Create in 2:08 2020/11/28
 */
public class User {
    private int id;
    private String username;
    private String password;
    private String birthday;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", birthday='" + birthday + '\'' +
                '}';
    }
}

5、編寫映射文件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="userMapper">

    <select id="findAll" resultType="com.panshenlian.pojo.User">
        select * from User
    </select>

</mapper>

6、編寫核心文件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" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="/UserMapper.xml" />
    </mappers>
</configuration>

7、編寫測(cè)試類


package com.panshenlian.service;

import com.panshenlian.pojo.User;
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;

/**
 * @Author: panshenlian
 * @Description: 體驗(yàn)測(cè)試類
 * @Date: Create in 2:21 2020/11/28
 */
public class MybatisTest {

    @Test
    public void testQueryUser01() throws IOException {

        //加載核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

        // 獲得sqlSession工廠對(duì)象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

        //獲得sqlSession對(duì)象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 執(zhí)行sql語(yǔ)句
        List<User> userList = sqlSession.selectList("userMapper.findAll");

        // 打印結(jié)果
        for (User user : userList) {
            System.out.println(user);
        }

        // 釋放資源
        sqlSession.close();
    }


}


最終通過(guò) Junit 單元測(cè)試,運(yùn)行結(jié)果符合預(yù)期:
Junit單元測(cè)試運(yùn)行結(jié)果
工程結(jié)構(gòu)參考:
工程結(jié)構(gòu)參考

總結(jié)

我們通過(guò)本文介紹,也動(dòng)手做了一個(gè)入門體驗(yàn)的測(cè)試工程,基本對(duì) Mybatis 有了初步認(rèn)識(shí),同時(shí)對(duì)比了 JDBC 與 Hibernate ,明晰了 Mybatis 誕生的使命,和與生俱來(lái)的優(yōu)勢(shì)能力。后續(xù)我們會(huì)繼續(xù)深入講解 ,對(duì)于 Mybatis 各個(gè)知識(shí)脈絡(luò)進(jìn)行梳理和解析。

本篇完,下一篇我們講《 Mybatis簡(jiǎn)單CRUD使用介紹 》。

BIU ~ 文章持續(xù)更新,微信搜索「潘潘和他的朋友們」第一時(shí)間閱讀,隨時(shí)有驚喜。本文會(huì)在 GitHub https://github.com/JavaWorld 收錄,熱騰騰的技術(shù)、框架、面經(jīng)、解決方案,我們都會(huì)以最美的姿勢(shì)第一時(shí)間送達(dá),歡迎 Star。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容