1. 程式人生 > >Mybatis精講(一)---環境配置及架構梳理

Mybatis精講(一)---環境配置及架構梳理

目錄

  • 簡介
  • ORM模型
    • Hibernate
    • Ibatis
  • 環境搭建
    • jar
    • 配置
      • xml方式配置
      • 程式碼方式配置
      • 兩種方式對比
  • Mybatis結構
  • 原始碼解讀xml環境載入
  • 對映器解讀
  • Ibatis
  • # 加入戰隊
    • 微信公眾號

此文已獨家授權給【新華前後端開發】使用。其他平臺使用聯絡作者後再使用

簡介

在資料庫方面我們最常用的應該JDBC、Hibernate和Mybatis。通過JDBC方式連線資料庫,我們會發現工作量是相當的複雜。我們得處理一些瑣碎的關閉。然後入參出參我們都得自己管理。基於次產生了ORM(Object Relational Mapping)模型。

ORM模型

  • 簡單的說ORM模型就是資料庫表和Java物件的對映模型。主要解決了資料庫和Java物件的相互對映。我們可以操作實體物件進而操作資料庫表。這樣的好處是我們不需要太瞭解資料庫。減輕了我們的學習代價。

Hibernate

  • 基於ORM模型很快我們的第二主角登場了。但是由於Hibernate配置比較複雜,且操作效能上不是很好。雖然大大的弱化了我們的sql但是因為效能低下很快就被淘汰了。

Ibatis

  • Mybatis的前身嚴格意義上說應該是Ibatis,後面我們都稱之為Mybatis.為了解決Hibernate的不足,Mybatis產生了相對於Hibernate的全表對映Mybatis可以說是半自動對映的框架。因為他是實體和sql結合的一個框架。

  • Mybatis有SQL , 實體 , 對映規則三個主要物件主成。和Hibernate相比雖然多出了sql的編寫,但是正是因為sql的編寫使得Mybatis變得很方便。Hibernate因為不用sql,所以他無法呼叫儲存過程這些資料庫方法。但是Mybatis不一樣,Mybatis可以呼叫sql中的儲存過程。

環境搭建

jar


<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.0</version>
</dependency>

配置

  • 在上面的圖示中我們可以發現,Mybatis中提供的註解或者是介面的方式來操作資料庫的。所以這裡我們準備一個介面。與介面對應的是xml檔案。兩者組成了Mybatis中的一個元件。

package com.github.zxhtom.mapper;
import com.github.zxhtom.model.Student;
import java.util.List;
public interface StudentMapper {
    /**
     * 獲取學生列表
     * @return
     */
    public List<Student> getStudents();
    /**
     * 通過id獲取學生資訊
     * @param id
     * @return
     */
    public Student getStudentByStuId(String id);
}
  • 與介面對應的是xml,裡面記錄了真是的sql。這裡注意下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.github.zxhtom.mapper.StudentMapper">

    <select id="getStudents" resultType="com.github.zxhtom.model.Student">
        select * from student
    </select>
    <select id="getStudentByStuId" resultType="com.github.zxhtom.model.Student">
        select * from student where id=#{id}
    </select>
</mapper>

xml方式配置

  • 有了上面的介面和xml,下面我們開始配置我們的Mybatis環境。

<?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="config.properties"></properties>
    <!--定義別名-->
    <typeAliases>
        <package name=""/>
    </typeAliases>

    <!--定義資料庫資訊,預設使用development資料庫構建環境-->
    <environments default="development">
        <environment id="development">
            <!--jdbc事物管理-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置資料庫連線資訊-->
            <dataSource type="POOLED">
                <property name="driver" value="${database.driver}"/>
                <property name="url" value="${database.url}"/>
                <property name="username" value="${database.username}"/>
                <property name="password" value="${database.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/github/zxhtom/mapper/StudentMapper.xml"></mapper>
    </mappers>

</configuration>
  • 然後我們就可以載入這個xml環境配置,構建我們的sqlsession.

//獲取mybatis-config.xml位置
InputStream inputStream = Resources.getResourceAsStream(Constant.MYBATIS);
//載入mybatis-config,並建立sqlsessionfactory物件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//建立sqlsession物件
SqlSession sqlSession = sqlSessionFactory.openSession();
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("id", 1);
//執行select語句,將resultSet對映成物件並返回
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.getStudents();
studentPrint(students);

程式碼方式配置

  • 官方提供了另外一種Java物件的方式來配置環境。這種配置我們控制的力度更加細膩,但是導致的問題是我們的一些配置將會硬編碼在程式碼裡。我們這裡通過Properties檔案將硬編碼的東西挪出去。

Map<Object, Object> properties = PropertiesUtil.getProperties("config.properties");
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver(properties.get("database.driver").toString());
dataSource.setUrl(properties.get("database.url").toString());
dataSource.setUsername(properties.get("database.username").toString());
dataSource.setPassword(properties.get("database.password").toString());
//構建資料庫事物方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
//建立資料庫執行環境
Environment environment = new Environment("development",transactionFactory,dataSource);
//構建Configure物件
Configuration configuration = new Configuration(environment);
//註冊別名
configuration.getTypeAliasRegistry().registerAlias("stu", Student.class);
//加入一個對映器
configuration.addMapper(StudentMapper.class);
//使用sqlsessionfactoryBuilder構建sqlsessionfactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
SqlSession sqlSession = sqlSessionFactory.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> students = studentMapper.getStudents();
studentPrint(students);

兩種方式對比

  • 上面我強調了我們的StudentMapper.xml和StudentMapper.java要同名而且在同一位置上。這是為什麼呢。因為在Mybatis原始碼中預設會讀取Java物件同目錄下的同名的xml檔案作為sql配置檔案。

  • 但是後期我們專案的展開Java和xml會越來越多,放在一起的話很亂。作為一個框架不會這麼侷限的。在xml配置環境方式中我們是通過Mappers-->Mapper標籤來注入我們的Mapper.xml的。這裡的xml路徑並沒有要求在同一個目錄。我們這裡可以隨意的改。上面的那些限制是在Java程式碼搭建環境的方式中。因為在Java程式碼方式中我們只是通過java物件註冊mapper介面的。在這種方式下預設就會載入同目錄下的同名xml

Mybatis結構

  • 學習的過程就是認知的過程。接下來我們來認識下Mybnatis的核心元件吧。

  • SqlSessionFactoryBuilder : 根據xml(mybatis-config.xml)或者Java程式碼(程式碼方式)來生成SqlSessionFactory
  • SqlSessionFactory : 構建SqlSession
  • SqlSession : 既可以傳送sql執行並返回結果,也可以獲取Mapper介面
  • SQL Mapper : Mybatis獨有的元件。有Java介面和xml檔案構成的一個整體。負責將xml中的sql進行解析然後傳遞給資料庫並獲取結果

原始碼解讀xml環境載入

  • 因為範疇基礎課程,這裡對原始碼的跟蹤點到為止(再深我也不會)。
  • 在解析mybatis-config.xml標籤這一塊是重點。這一塊會專門介紹各個標籤解析及作用。文章留言或點贊讓我們看到你們對這一塊的喜愛。留言點贊多的會盡快出這一篇。

對映器解讀

  • 上面已經說了對映器是有Java+xml組合而成的Mybatis元件。我們上面的案例也展示了兩者的編寫。Java實際就是一個介面定義好方法。在xml中對應的標籤帶上我們的sql就行了。


  • 圈出來的這條sql中我們會發現和我們平時的sql不一樣。#{id}是Mybatis為我們提供的入參。在提交給資料庫的時候會將真正的sql填充過來。這裡還有一個注意點我們寫的是select * 。因為資料庫欄位和我們實體屬性是一樣的。所以Mybatis就會自動把相同欄位內容對映給實體了。這就實現了自動映射了。
  • 之前說了和Hibernate相比,Mybatis屬於半自動。如果我們的實體和資料庫欄位不一樣了(注意駝峰和平峰在資料庫通過設定可以認為是一樣的。Mybatis也提供功能可以對映的。這裡我們認為是一樣的),我們可以通過resultMap來實現資料庫欄位和實體欄位的對映。這就是我們所謂的半自動對映

Ibatis

  • 雖然我們用Mybatis。但是Ibatis之前的方法還是保留下來的。這裡提一下。但是不推薦使用的方式執行sql

加入戰隊

# 加入戰隊

微信公眾號