1. 程式人生 > >MyBatis入門——瞭解基本概念

MyBatis入門——瞭解基本概念

1. 瞭解MyBatis

1.1 MyBatis是什麼?

使用Java操作資料庫的話,JDK給我們提供了一層對各個資料庫的封裝,也就是JDBC,它遮蔽了資料庫之間的差異,使用JDBC可以統一操作。但是他長期以來被人詬病的就是重複程式碼太多。封裝引數需要一個一個set,還需要你把ResultSet一個一個對映成POJO,這裡面充滿了重複程式碼,這裡完全可以由模板程式碼來代替。當然,不僅僅是重複程式碼,還有其他缺點,比如,效能,安全,擴充套件性等等。

封裝JDBC以求達到更簡潔,更優雅,更安全,更高效的方案有很多,MyBatis就是其中之一,這類框架一般被叫做ORM框架(Object Relational Mapping,就是Java中的物件和關係型資料庫裡的資料對映的一個框架)。

MyBatis通過構造一個Mapper來消除JDBC程式碼,卻又可以實現查詢資料庫的功能。Mapper是個interface,我們可以指定這個接口裡每個方法對應的SQL模板,然後由MyBatis來繫結執行時傳入的引數給SQL模板裡的佔位符,構造成一個可執行的SQL,然後執行,獲得結果後再自動封裝成方法返回值的型別的物件。

舉個例子,Mapper

Blog selectBlog(long id);

SQL:

select * from Blog where id = #{id}

這樣查詢時的引數繫結,和查詢結果的封裝都可以由MyBatis來完成。

1.2 為什麼使用MyBatis?

知道MyBatis是什麼,應該就明白為什麼會出現MyBatis之類的ORM框架了,還有常見的Hibernate。對於ORM框架,或者類似的東西,存在的意義就是上面所說的。那麼,為什麼是MyBatis?而不是其他ORM框架呢?這裡我簡單的說說,為什麼我喜歡MyBatis勝過喜歡Hibernate吧,我更喜歡簡潔。說通俗一點,ORM確實有存在的必要,但是真的有必要封裝的太過深嗎?Hiberante可以達到讓使用者完全不知道自己在使用資料庫的程度,這實現起來肯定比MyBatis更復雜,說明Hibernate的技術含量要更高,可是這也帶來了問題,我們真的需要這樣嗎?

過度的封裝,會帶來更多的成本,學習成本、故障解決時的成本。而相比Hibernate的高度複雜,MyBatis就顯得很簡小精悍了。我想這也是很多人喜歡用guice而不是spring吧。

這裡隨意比較一下兩個框架的文件:

2. 基本概念

這裡介紹一下MyBatis最核心的幾個類,雖然框架幫我們隱藏了很多細節,但是如果對他不夠了解,就不能應用的得心應手。這裡介紹的幾個類都很容易理解,名字起的好也是一種本領啊。

2.1 SqlSessionFactoryBuilder

SqlSessionFactoryBuilder是根據配置建立SqlSessionFactory的工廠類,一般來說是通過XML,當然,我們也可以直接用程式碼來構建。這個類一旦創建出SqlSessionFactory之後,他的意義就結束了,可以被釋放了。一般推薦在方法內定義,用完就釋放。當然,你可以用它建立多個不同的SqlSessionFactory

2.2 SqlSessionFactory

SqlSessionFactory一旦建立就應該一直存在,一般建議維護在應用級別(不是方法級別,也不是類級別,而是整個應用共享)。一般來說,不需要重複建立這個物件,也不要釋放它。可以用單例模式來保證整個應用內的唯一性。

2.3 SqlSession

SqlSession是執行緒不安全的,所以每個執行緒應該維護一個單獨的SqlSession物件。千萬不要用物件的靜態變數引用來指向一個SqlSession,這樣會導致它洩露到其他執行緒中。而且,一定要記得關閉SqlSession,常見的使用方式如下:

SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
} finally {
  session.close();
}

2.4 Mapper Instances

Mapper Instances是我們定義的Mapper介面的例項物件,他包含了SQL繫結關係,需要SqlSession建立。所以他的生命週期可以和SqlSession一致,也就是執行緒級別,但是為了簡潔,我還是建議放在方法內部,它不需要關閉,使用方法一般如下:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // do work
} finally {
  session.close();
}

3. 基本使用

依賴:

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>
</dependencies>

3.1 XML版(經典版本)

MyBatis的經典版本就是用XML來配置,並用XML來實現SQL和Java程式碼的分離。

建立資料庫:

CREATE TABLE `blog` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(1024) DEFAULT NULL,
  `content` text,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;

插入資料:

INSERT INTO `blog` (`id`, `title`, `content`, `create_time`)
VALUES
    (1, '標題1', '內容1', '2018-02-05 10:45:26');

編寫主配置檔案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>
    <typeAliases>
        <package name="cn.dubby.study.mybatis.basic.xml.entity"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_study?useUnicode=true&amp;characterEncoding=UTF-8&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC"/>
                <property name="username" value="test"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="cn/dubby/study/mybatis/basic/xml/mapper/BlogMapper.xml"/>
    </mappers>
</configuration>

編寫啟動類Main.java

package cn.dubby.study.mybatis.basic.xml;

import cn.dubby.study.mybatis.basic.xml.entity.Blog;
import cn.dubby.study.mybatis.basic.xml.mapper.BlogMapper;
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 java.io.IOException;
import java.io.InputStream;

public class Main {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession session = sqlSessionFactory.openSession();
        try {
            Blog blog1 = session.selectOne("cn.dubby.study.mybatis.basic.xml.mapper.BlogMapper.selectBlog", 1);
            System.out.println(blog1);

            BlogMapper mapper = session.getMapper(BlogMapper.class);
            Blog blog2 = mapper.selectBlog(1);
            System.out.println(blog2);
        } finally {
            session.close();
        }
    }
}

編寫POJO Blog.java

package cn.dubby.study.mybatis.basic.xml.entity;

import java.util.Date;

public class Blog {

    private Long id;
    private String title;
    private String content;
    private Date createTime;

    @Override
    public String toString() {
        return "Blog{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", createTime=" + createTime +
                '}';
    }

    //getter and setter ...
}

編寫Mapper BlogMapper.java

package cn.dubby.study.mybatis.basic.xml.mapper;

import cn.dubby.study.mybatis.basic.xml.entity.Blog;

public interface BlogMapper {
    Blog selectBlog(long id);
}

執行Main.java結果:

Blog{id=1, title='標題1', content='內容1', createTime=Mon Feb 05 18:45:26 CST 2018}
Blog{id=1, title='標題1', content='內容1', createTime=Mon Feb 05 18:45:26 CST 2018}

3.2 註解版

可以做到完全沒有XML,總共有三個類,Main.javaSerial.javaSerialMapper.java

先準備資料庫:

CREATE TABLE `serial` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(1024) DEFAULT NULL,
  `description` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `serial` (`id`, `name`, `description`)
VALUES
    (1, 'MyBatis教程', '這一系列文章主要是介紹MyBatis,包含入門使用,高階特性,以及實現細節。');

Main.java

package cn.dubby.study.mybatis.basic.without.xml;

import cn.dubby.study.mybatis.basic.without.xml.entity.Serial;
import cn.dubby.study.mybatis.basic.without.xml.mapper.SerialMapper;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;

import javax.sql.DataSource;

public class Main {

    public static void main(String[] args) {
        DataSource dataSource = new UnpooledDataSource("com.mysql.cj.jdbc.Driver", "jdbc:mysql://localhost:3306/mybatis_study?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=UTC", "test", "123456");
        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment("development", transactionFactory, dataSource);
        Configuration configuration = new Configuration(environment);
        configuration.addMapper(SerialMapper.class);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

        SqlSession session = sqlSessionFactory.openSession();
        try {
            Serial serial1 = session.selectOne("cn.dubby.study.mybatis.basic.without.xml.mapper.SerialMapper.selectSerial", 1);
            System.out.println(serial1);

            SerialMapper mapper = session.getMapper(SerialMapper.class);
            Serial serial2 = mapper.selectSerial(1);
            System.out.println(serial2);
        } finally {
            session.close();
        }
    }
}

Serial.java

package cn.dubby.study.mybatis.basic.without.xml.entity;

public class Serial {

    private Long id;
    private String name;
    private String description;

    @Override
    public String toString() {
        return "Serial{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", description='" + description + '\'' +
                '}';
    }

    //setter and getter...
}

SerialMapper.java

package cn.dubby.study.mybatis.basic.without.xml.mapper;

import cn.dubby.study.mybatis.basic.without.xml.entity.Serial;
import org.apache.ibatis.annotations.Select;

public interface SerialMapper {
    @Select("SELECT * FROM serial WHERE id = #{id}")
    Serial selectSerial(long id);
}

執行Main.java

Serial{id=1, name='MyBatis教程', description='這一系列文章主要是介紹MyBatis,包含入門使用,高階特性,以及實現細節。'}
Serial{id=1, name='MyBatis教程', description='這一系列文章主要是介紹MyBatis,包含入門使用,高階特性,以及實現細節。'}

相關推薦

MyBatis入門——瞭解基本概念

1. 瞭解MyBatis 1.1 MyBatis是什麼? 使用Java操作資料庫的話,JDK給我們提供了一層對各個資料庫的封裝,也就是JDBC,它遮蔽了資料庫之間的差異,使用JDBC可以統一操作。但是他長期以來被人詬病的就是重複程式碼太多。封裝引數需

Excel零基礎入門——02Excel基本概念和操作

上節課大家已經體驗到了Excel的操作了,如果成功做完了小例子,那就更牛氣了,但只會操作不懂裡面的術語和原理就不太好了,本節課帶領大家初始熟悉一下Excel的環境、基本概念和基礎操作。咱要做個有文化的Excel人。 記住快捷鍵,秒殺老司機!   1、基本概念 大家把這裡當做字典,可以直接略過

Mybatis學習記錄-----Mybatis入門基本增刪改查方法)

方便回顧和加強記憶,記錄一下mybatis的使用方法。mybatis的官網文件:http://www.mybatis.org/mybatis-3/zh/getting-started.html。 Mybatis框架 目錄 1、建立資

MyBatis入門——瞭解配置

1、mybatis-config.xml 這個配置檔案的結構如下: properties settings typeAliases typeHandlers objectFactory plugins environments environment t

Apache Geode/GemFire入門(1)-基本概念和模組

在這個入門中我們將走一遍GemFire應用程式程式碼,學習GemFire Enterprise基本的特性。這個應用詳解了GemFire怎麼在VMs宕機情況下並不中斷服務。當應用執行時動態地新增更多的儲存,並且提供更小的延遲來訪問你的資料。 入門概覽 主要的概念

Apache Geode/GemFire入門(2)-基本概念和模組

使用持久化 GemFire支援無共享儲存持久化。每一個VM寫入他們的region data到自己的磁碟檔案中。 People region來說,每一個region將要寫入整個的region到自己的磁碟檔案中。而post region每一份拷貝都將要存在兩個不同的pe

RabbitMQ之入門基本概念

目錄 簡介 基本概念 ConnectionFactory、Connection、Channel——基本物件 Queue訊息佇列——內部物件 exchange訊息分發策略(路由) 1. Direct策略 2. Fanout策略 3. Topic策略 4. Heade

SpringCloud入門 - 一些基本概念

Monolith(單體應用)架構   -- 》  將所有的程式碼及功能都包含在一個WAR包中的專案組織方式  最終部署的時候只有一份war包,其他的以jar包的方式依賴來 缺點: 在專案很小的情況下這種單體應用比較簡單,

Zookeeper入門基本概念、5項配置、啟動

起源   最早接觸Zookeeper,是在學習Hadoop權威指南這本書的時候,印象中是Hadoop專案的一個子工程。      最近,專案中需要用到“分散式鎖”。      之前,在開發P2P網貸系統的時候,就用到了“分散式鎖”,這個概念聽起來挺高階的,實際就是多臺機器下,

機器學習入門-瞭解相關概念

      按照了解一個新事物的步驟,學習機器學習時我們首先提出的問題是,什麼是機器學習?機器學習可以幹什麼?我們為什麼需要機器學習?       從人類誕生以來便一直在學習,學習行走,鑽木取火。。。自我們呱呱墜地便開始了一生的學習,人類學習的過程是先觀察後學習最後獲得相關

ROS學習筆記(一) : 入門基本概念

mes rap 打開 創建 創建ca cpp wiki 管理器 速度 目錄 基本概念 實踐操作 基本概念 1. Package 程序包,裏面包含節點Node、ROS程序庫、數據集、配置文件 Package Manefist 程序包的配置文件,即描述程序包的相關信息,包括其名

YoyoGo微服務框架入門系列-基本概念

## 前言 Github開源:[github.com/yoyofx/yoyogo](https://github.com/yoyofx/yoyogo) 還請多多Star 之前簡單介紹了[YoyoGo微服務框架](https://www.cnblogs.com/maxzhang1985/p/12981989.

orm的基本概念mybatis入門

orm:簡單來說,orm就像是一個單調函式,實現程式語言的型別與關係型資料庫型別之間的相互轉換。接下來簡單介紹一下java中的orm框架——mybatis。mybatis具有四大核心元件1、SqlSessionFactoryBuilder:會根據xml配置或是java配置來生

MySQL 基本概念瞭解入門

       發現自己對 MySQL 的瞭解確實少得可憐,於是到菜鳥網站菜鳥教程進行最基礎的學習入門,一個個參考例子進行學習與實踐,個人覺得上面的例子很簡單,對於初學者來講還是可以的,當然頂多入個門吧

mybatis入門篇基——基本配置與參數說明

*** values resource clas mybatis prop 測試 mapper ppi Mybatis   好吧這是我第一次寫這種文章~如果有不足和錯誤之處歡迎評論,指點。今天想談談關於mybatis的一些基礎入門知識。   進入正題~~:   a.關於my

Git基礎入門(八)Git分支的基本概念

git 版本控制 分支管理幾乎所有的版本控制系統都以某種形式支持分支。 使用分支意味著你可以把你的工作從開發主線上分離開來,以免影響開發主線。 在很多版本控制系統中,這是一個略微低效的過程——常常需要完全創建一個源代碼目錄的副本。對於大項目來說,這樣的過程會耗費很多時間。有人把Git的分支模型稱為它的`‘必殺

文件操作系統入門基本概念

平臺 ext fonts linux文件系統 mark proc文件系統 寫到 write 自動 1、文件管理系統   在大多數應用中,文件是一個核心成分,處理實時應用和一些特殊的應用外,應用程序的輸入都是通過文件的形式來完成的,實際上,所有應用程序的輸出都保存在文件中,這

關於LINUX命令的基本概念入門

linux 基本命令初學命令的分類:內置命令:shell程序自帶的命令,外部命令:有獨立的可執行程序文件用 type 命令,分辨是內置命令還是外部命令 命令的組成:命令 +選項 +參數選項分為:短選項: -l -d 等,短選項是可以合並寫的,-ld長選項: --help 參數:命令作用的對象 ls -l

vue入門——基本概念

charset div oct dem doc ctype htm template 掛載 1. 掛載點,模板,實例的關系? 首先附上一個基本demo: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <h

K8s基本概念入門

狀態 啟動 一句話 應用更新 一個 基本概念 而且 多個項目 。。 序言 沒等到風來,綿綿小雨,所以寫個隨筆,聊聊k8s的基本概念。 k8s是一個編排容器的工具,其實也是管理應用的全生命周期的一個工具,從創建應用,應用的部署,應用提供服務,擴容縮容應用,