MyBatis 介紹


MyBatis 介紹

MyBatis 是一款優秀的 ORM(Object Relational Mapping,對象關系映射)框架,它可以通過對象和數據庫之間的映射,將程序中的對象自動存儲到數據庫中。它是 Apache 提供的一個開源項目,之前的名字叫做 iBatis,2010 年遷移到了 Google Code,並且將名字改為我們現在所熟知的 MyBatis,又於 2013 年 11 月遷移到了 Github。

MyBatis 提供了普通 SQL 查詢、事務、存儲過程等功能,它的優缺點如下。

優點

  • 相比於 JDBC 需要編寫的代碼更少
  • 使用靈活,支持動態 SQL
  • 提供映射標簽,支持對象與數據庫的字段關系映射

缺點

  • SQL 語句依賴於數據庫,數據庫移植性差
  • SQL 語句編寫工作量大,尤其在表、字段比較多的情況下

總體來說,MyBatis 是一個非常優秀和靈活的數據持久化框架,適用於需求多變的互聯網項目,也是當前主流的 ORM 框架。

MyBatis 重要組件

MyBatis 中的重要組件如下:

  • Mapper 配置:用於組織具體的查詢業務和映射數據庫的字段關系,可以使用 XML 格式或 Java 注解格式來實現;
  • Mapper 接口:數據操作接口也就是通常說的 DAO 接口,要和 Mapper 配置文件中的方法一一對應;
  • Executor:MyBatis 中所有的 Mapper 語句的執行都是通過 Executor 執行的;
  • SqlSession:類似於 JDBC 中的 Connection,可以用 SqlSession 實例來直接執行被映射的 SQL 語句;
  • SqlSessionFactory:SqlSessionFactory 是創建 SqlSession 的工廠,可以通過 SqlSession openSession() 方法創建 SqlSession 對象。

MyBatis 執行流程

MyBatis 完整執行流程如下圖所示:

MyBatis 執行流程說明:

  1. 首先加載 Mapper 配置的 SQL 映射文件,或者是注解的相關 SQL 內容。
  2. 創建會話工廠,MyBatis 通過讀取配置文件的信息來構造出會話工廠(SqlSessionFactory)。
  3. 創建會話,根據會話工廠,MyBatis 就可以通過它來創建會話對象(SqlSession),會話對象是一個接口,該接口中包含了對數據庫操作的增、刪、改、查方法。
  4. 創建執行器,因為會話對象本身不能直接操作數據庫,所以它使用了一個叫做數據庫執行器(Executor)的接口來幫它執行操作。
  5. 封裝 SQL 對象,在這一步,執行器將待處理的 SQL 信息封裝到一個對象中(MappedStatement),該對象包括 SQL 語句、輸入參數映射信息(Java 簡單類型、HashMap 或 POJO)和輸出結果映射信息(Java 簡單類型、HashMap 或 POJO)。
  6. 操作數據庫,擁有了執行器和 SQL 信息封裝對象就使用它們訪問數據庫了,最后再返回操作結果,結束流程。

MyBatis XML 版

MyBatis 使用分為兩個版本:XML 版和 Java 注解版。接下來我們使用 Spring Boot 結合 MyBatis 的 XML 版,來實現對數據庫的基本操作,步驟如下。

1)創建數據表

drop table if exists `t\_user`;
create table `t\_user` (
  `id` bigint(20) not null auto_increment comment '主鍵id',
  `username` varchar(32) default null comment '用戶名',
  `password` varchar(32) default null comment '密碼',
  `nick\_name` varchar(32) default null,
  primary key (`id`)
) engine=innodb auto_increment=1 default charset=utf8;

2)添加依賴

在項目添加對 MyBatis 和 MySQL 支持的依賴包,在 pom.xml 文件中添加如下代碼:

\<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --\>
\<dependency\>
    \<groupId\>org.mybatis.spring.boot\</groupId\>
    \<artifactId\>mybatis-spring-boot-starter\</artifactId\>
    \<version\>2.1.0\</version\>
\</dependency\>
\<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --\>
\<dependency\>
    \<groupId\>mysql\</groupId\>
    \<artifactId\>mysql-connector-java\</artifactId\>
    \<version\>8.0.16\</version\>
\</dependency\>

mybatis-spring-boot-starter 是 MyBatis 官方幫助我們快速集成 Spring Boot 提供的一個組件包,mybatis-spring-boot-starter 2.1.0 對應 MyBatis 的版本是 3.5.2。

3)增加配置文件

在 application.yml 文件中添加以下內容:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/learndb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
  type-aliases-package: com.interview.mybatislearning.model

其中:

  • mybatis.config-location:配置 MyBatis 基礎屬性;
  • mybatis.mapper-locations:配置 Mapper 對應的 XML 文件路徑;
  • mybatis.type-aliases-package:配置項目中實體類包路徑。

注:如果配置文件使用的是 application.properties,配置內容是相同的,只是內容格式不同。

4)創建實體類

public class UserEntity implements Serializable {
    private static final long serialVersionUID = -5980266333958177104L;
    private Integer id;
    private String userName;
    private String passWord;
    private String nickName;
    public UserEntity(String userName, String passWord, String nickName) {
        this.userName = userName;
        this.passWord = passWord;
        this.nickName = nickName;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer 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 getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
}

5)創建 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\>
    \<typeAliases\>
        \<typeAlias alias="Integer" type="java.lang.Integer"/\>
        \<typeAlias alias="Long" type="java.lang.Long"/\>
        \<typeAlias alias="HashMap" type="java.util.HashMap"/\>
        \<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/\>
        \<typeAlias alias="ArrayList" type="java.util.ArrayList"/\>
        \<typeAlias alias="LinkedList" type="java.util.LinkedList"/\>
    \</typeAliases\>
\</configuration\>

mybatis-config.xml 主要是為常用的數據類型設置別名,用於減少類完全限定名的長度,比如:resultType="Integer" 完整示例代碼如下:

\<select id="getAllCount" resultType="Integer"\>
    select
    count(*)
    from t_user
\</select\>

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="com.interview.mybatislearning.mapper.UserMapper"\>
    \<resultMap id="BaseResultMap" type="com.interview.mybatislearning.model.UserEntity" \>
        \<id column="id" property="id" jdbcType="BIGINT" /\>
        \<result column="username" property="userName" jdbcType="VARCHAR" /\>
        \<result column="password" property="passWord" jdbcType="VARCHAR" /\>
        \<result column="nick\_name" property="nickName" jdbcType="VARCHAR" /\>
    \</resultMap\>
    \<sql id="Base\_Column\_List" \>
        id, username, password, nick_name
    \</sql\>
    \<sql id="Base\_Where\_List"\>
        \<if test="userName != null and userName != ''"\>
            and userName = #{userName}
        \</if\>
    \</sql\>
    \<select id="getAll" resultMap="BaseResultMap" \>
        SELECT
        \<include refid="Base\_Column\_List" /\>
        FROM t_user
    \</select\>
    \<select id="getOne" parameterType="Long" resultMap="BaseResultMap" \>
        SELECT
        \<include refid="Base\_Column\_List" /\>
        FROM t_user
        WHERE id = #{id}
    \</select\>
    \<insert id="insert" parameterType="com.interview.mybatislearning.model.UserEntity" \>
       INSERT INTO
               t_user
               (username,password,nick_name)
           VALUES
               (#{userName}, #{passWord}, #{nickName})
    \</insert\>
    \<update id="update" parameterType="com.interview.mybatislearning.model.UserEntity" \>
        UPDATE
        t_user
        SET
        \<if test="userName != null"\>username = #{userName},\</if\>
        \<if test="passWord != null"\>password = #{passWord},\</if\>
        nick_name = #{nickName}
        WHERE
        id = #{id}
    \</update\>
    \<delete id="delete" parameterType="Long" \>
       DELETE FROM
                t_user
       WHERE
                id =#{id}
    \</delete\>
\</mapper\>

以上配置我們增加了增刪改查等基礎方法。

6)增加 Mapper 文件

此步驟我們需要創建一個與 XML 對應的業務 Mapper 接口,代碼如下:

public interface UserMapper {
    List\<UserEntity\> getAll();
    UserEntity getOne(Long id);
    void insert(UserEntity user);
    void update(UserEntity user);
    void delete(Long id);
}

7)添加 Mapper 包掃描

在啟動類中添加 @MapperScan,設置 Spring Boot 啟動的時候會自動加載包路徑下的 Mapper。

@SpringBootApplication
@MapperScan("com.interview.mybatislearning.mapper")
public class MyBatisLearningApplication {
   public static void main(String[] args) {
       SpringApplication.run(MyBatisLearningApplication.class, args);
   }
}

8)編寫測試代碼

經過以上步驟之后,整個 MyBatis 的集成就算完成了。接下來我們寫一個單元測試,驗證一下。

@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatislearningApplicationTests {
    @Resource
    private UserMapper userMapper;
    @Test
    public void testInsert() {
        userMapper.insert(new UserEntity("laowang", "123456", "老王"));
        Assert.assertEquals(1, userMapper.getAll().size());
    }
}

總結

通過本文我們知道 MyBatis 是一個優秀和靈活的數據持久化框架,MyBatis 包含 Mapper 配置、Mapper 接口、Executor、SqlSession、SqlSessionFactory 等幾個重要的組件,知道了 MyBatis 基本流程:MyBatis 首先加載 Mapper 配置和 SQL 映射文件,通過創建會話工廠得到 SqlSession 對象,再執行 SQL 語句並返回操作信息。我們也使用 XML 的方式,實現了 MyBatis 對數據庫的基礎操作。


歡迎關注我的公眾號,回復關鍵字“Java” ,將會有大禮相送!!! 祝各位面試成功!!!

%97%E5%8F%B7%E4%BA%8C%E7%BB%B4%E7%A0%81.png)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM