天天看點

mybatis基礎知識-03-C-2020-11-14mybatis緩存ssm整合mybatis-generatormybatis-plus

文章目錄

  • mybatis緩存
    • 一級緩存
    • 二級緩存
    • 第三方緩存
  • ssm整合
  • mybatis-generator
  • mybatis-plus
    • 快速使用mybatis-plus
日志編号 說明
C-2020-11-14 第一次建立

mybatis緩存

緩存這個概念大家也比較熟悉,現在進行mybatis緩存的講解。

在mybatis中,緩存分為了三類,分别是一級緩存,二級緩存和第三方緩存。

一級緩存

在mybatis中,一級緩存是預設開啟的,它表示sqlSession級别的緩存,每次查詢的時候會開啟一個會話,此會話相當于一次連接配接,關閉之後自動失效。

在同一個會話之内,如果執行了多個相同的sql語句,那麼除了第一個之外,所有的資料都是從緩存中進行查詢的。

在某些情況下,一級緩存可能會失效?

  • 在同一個方法中,可能會開啟多個會話,此時需要注意,會話跟方法沒有關系,不是一個方法就隻能由一個會話,是以嚴格記住,緩存的資料是儲存在sqlsession中的。
  • 當傳遞對象的時候,如果對象中的屬性值不同,也不會走緩存。
  • 在多次查詢過程中,如果修改了資料,那麼緩存會失效。
  • 如果在一個會話過程中,手動清空了緩存,那麼緩存也會失效。

二級緩存

二級緩存表示的是全局緩存,必須要等到sqlsession關閉之後才會生效,也就是說,二級緩存的資料,是在一級緩存關閉的時候,把一級緩存的資料刷到二級緩存中。

在使用二級緩存的過程裡,需要進行如下配置:

  • 修改全局配置檔案(mybatis-config.xml),在settings中添加配置:
  • 指定在哪個映射檔案中使用緩存的配置,例如要對UserDao.xml使用二級緩存,需要在UserDao.xml中添加如下的配置:
  • 對應的java實體類必須要實作序列化的接口,即User類需要實作序列化接口。同時,如果包含了嵌套查詢,則嵌套的類也需要實作序列化接口。

通過上面的配置之後,就可以使用mybatis的二級緩存。接着講解一下配置在mapper中的cache元素的屬性。

cache中包含了如下常用屬性,每個屬性的意義如下:

eviction:表示緩存回收政策,預設是LRU

  • LRU:最近最少使用的,移除最長時間不被使用的對象。
  • FIFO:先進先出,按照對象進入緩存的順序來移除。
  • SOFT:軟引用,移除基于垃圾回收器狀态和軟引用規則的對象。
  • WEAK:弱引用,更積極地移除基于垃圾收集器狀态和弱引用規則的對象

flushInternal:重新整理間隔,機關毫秒,預設情況是不設定,也就是沒有重新整理間隔,緩存僅僅調用語句時重新整理。

size:引用數目,正整數。代表緩存最多可以存儲多少個對象,太大容易導緻記憶體溢出。

readonly:隻讀,true/false。

  • true:隻讀緩存,會給所有調用這傳回緩存對象的相同執行個體,是以這些對象不能被修改。
  • false:讀寫緩存,會傳回緩存對象的拷貝(序列化實作),這種方式比較安全,預設值。

cache元素在不進行屬性配置時,起到的作用如下:

  • 映射語句檔案中的所有 select 語句的結果将會被緩存。
  • 映射語句檔案中的所有 insert、update 和 delete 語句會重新整理緩存。
  • 緩存會使用最近最少使用算法(LRU, Least Recently Used)算法來清除不需要的緩存。
  • 緩存不會定時進行重新整理(也就是說,沒有重新整理間隔)。
  • 緩存會儲存清單或對象(無論查詢方法傳回哪種)的 1024 個引用。
  • 緩存會被視為讀/寫緩存(false),這意味着擷取到的對象并不是共享的,可以安全地被調用者修改,而不幹擾其他調用者或線程所做的潛在修改。

上面是cache中常用的基礎屬性,除過上面定義目前mapper二級緩存特性的之外,在增删改查的操作中,有一個配合使用的屬性:

flushCache

在insert,update,delete這三個元素中,flushCache屬性預設是true,也就是上面說的,當調用這三個語句之後,會重新整理緩存。

在select元素中也有這個屬性。預設是false。

在緩存開啟的時候(不論是一級緩存,二級緩存,亦或者第三方緩存),可以通過特定語句上的

flushCache

屬性去配置它對于緩存資料的影響。

第三方緩存

注意,在使用第三方緩存的時候,是通過在Mapper中cache元素的type屬性進行定義。

在上面講解cache屬性的時候,還有一個我們會用到的屬性沒有講解,就是

type

在某些情況下我們也可以自定義實作緩存,或為其他第三方緩存方案建立擴充卡,來完全覆寫緩存行為。當要自己實作緩存操作的時候,需要實作cache接口,并且在實作類中提供一個接受 String 參數作為 id 的構造器。當寫好這個實作類之後,就可以把這個實作類的完全限定名作為

type

的值。

除了自己實作,還可以使用第三方工具作為緩存,這裡通過ehcache舉例。

首先,是引入pom資訊。

<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.8.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.0-alpha1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>2.0.0-alpha1</version>
    <scope>test</scope>
</dependency>
           

上面引入了ehcache的pom以及mybatis-ehcache。mybatis-ehcache可以在git中mybatis庫裡去看相應的配置解釋。slf4j是ehcache需要用到的日志元件,是以也進行引入。

接下來是建立ehcache的配置檔案編寫 ehcache.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
 <!-- 磁盤儲存路徑 -->
 <diskStore path="D:\ehcache" />
 
 <defaultCache 
   maxElementsInMemory="1" 
   maxElementsOnDisk="10000000"
   eternal="false" 
   overflowToDisk="true" 
   timeToIdleSeconds="120"
   timeToLiveSeconds="120" 
   diskExpiryThreadIntervalSeconds="120"
   memoryStoreEvictionPolicy="LRU">
 </defaultCache>
</ehcache>
 
<!-- 
屬性說明:
diskStore:指定資料在磁盤中的存儲位置。
defaultCache:當借助CacheManager.add("demoCache")建立Cache時,EhCache便會采用<defalutCache/>指定的的管理政策
 
以下屬性是必須的:
maxElementsInMemory - 在記憶體中緩存的element的最大數目 
maxElementsOnDisk - 在磁盤上緩存的element的最大數目,若是0表示無窮大
eternal - 設定緩存的elements是否永遠不過期。如果為true,則緩存的資料始終有效,如果為false那麼還要根據timeToIdleSeconds,timeToLiveSeconds判斷
overflowToDisk - 設定當記憶體緩存溢出的時候是否将過期的element緩存到磁盤上
 
以下屬性是可選的:
timeToIdleSeconds - 當緩存在EhCache中的資料前後兩次通路的時間超過timeToIdleSeconds的屬性取值時,這些資料便會删除,預設值是0,也就是可閑置時間無窮大
timeToLiveSeconds - 緩存element的有效生命期,預設是0.,也就是element存活時間無窮大
 diskSpoolBufferSizeMB 這個參數設定DiskStore(磁盤緩存)的緩存區大小.預設是30MB.每個Cache都應該有自己的一個緩沖區.
diskPersistent - 在VM重新開機的時候是否啟用磁盤儲存EhCache中的資料,預設是false。
diskExpiryThreadIntervalSeconds - 磁盤緩存的清理線程運作間隔,預設是120秒。每個120s,相應的線程會進行一次EhCache中資料的清理工作
memoryStoreEvictionPolicy - 當記憶體緩存達到最大,有新的element加入的時候, 移除緩存中element的政策。預設是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進先出)
 -->
           

上述配置和詳細的講解,歡迎移步ehcache的相關介紹。(後續會把博文連結貼在這裡)。

最後,就是在目标mapper中的

cache

元素上,添加對應的

type

屬性,指明緩存用到的具體的類。

這樣,就完成了mybatis與第三方緩存工具的整合。

再次留意一下,因為這個type是cache的屬性,而cache是編寫在Mapper中的,也就是說,每個Mapper都可以通過自己的cache去指定自己的二級緩存行為。

ssm整合

在部落格中已經寫了spring,springmvc和mybatis,這三者構成了一個主流開發架構:SSM。現在說如何把這三個整合到一起。

建立好一個maven空工程之後,首先引入pom資訊。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.phl</groupId>
    <artifactId>ssm_second</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>
           

之後寫各個元件的配置檔案。

編寫資料庫連接配接配置和日志配置

db.properties

jdbc.username=XXXX
jdbc.password=XXXX
jdbc.driverName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3307/XXXX?serverTimezone=UTC
           

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
    </context-param>
    <!--springmvc的核心配置類-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--字元編碼過濾器-->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--支援rest風格的過濾器-->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
           

springmvc配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <context:component-scan base-package="com.phl">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <mvc:default-servlet-handler></mvc:default-servlet-handler>
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>
           

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>
</configuration>
           

spring配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
    <context:component-scan base-package="com.phl">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="driverClassName" value="${jdbc.driverName}"></property>
        <property name="url" value="${jdbc.url}"></property>
    </bean>
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
    <!--mybatis 整合-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:com/phl/dao/impl/*.xml"></property>
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.phl.dao"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>
</beans>
           

給出對應的Controller:

package com.phl.controller;

import com.phl.bean.User;
import com.phl.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class UserController {
    @Autowired
    private UserDao dao;

    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    public String getUser(Model model, @PathVariable("id") Integer id){
        User user = dao.searchUserById(id);
        model.addAttribute("msg",user.toString());
        return "view";
    }
}


           

上面就是整合SSM的過程。其中需要留意的兩個點。

  • 在web.xml中配置spring的監聽
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:application-context.xml</param-value>
</context-param>
           
  • 在整合的時候,需要将mybatis的sqlSessionFactory通過SqlSessionFactoryBean注入在spring IOC容器中。
<!--mybatis-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--指定dataSource-->
    <property name="dataSource" ref="dataSource"></property>
    <!--指明mybatis配置檔案位置-->
    <property name="configLocation" value="classpath:mybatis-config.xml"></property>
    <!--指明Mapper檔案位置-->
    <property name="mapperLocations" value="classpath:com/phl/dao/impl/*.xml"></property>
</bean>
<!--掃描接口,并交給spring管理-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!--指明接口的位置-->
    <property name="basePackage" value="com.phl.dao"></property>
    <!--指明要使用的SQLSessionFactory的名字-->
    <property name="sqlSessionFactoryBeanName" value="sessionFactory"></property>
</bean>
           

mybatis-generator

mybatis-generator就是經常提到的逆向工程。

在之前的例子中,都是在有了資料表之後,自己建立Bean,Dao,編寫對應mapper。逆向工程則是根據資料表,幫我們生成對應的Bean,Dao和mapper。當然,這個是否好用,不做過多評論,對于生成的代碼,是否契合我們的需求,也不做過多評論。這裡,隻是講解對應的工序。

在mybatis generator的官方文檔下有詳細的文檔說明,這裡的操作也是遵照文檔中的順序來進行的。mybatis-generator官方文檔.

為了使用mybatis-generator,需要現在pom中引入對應的依賴。目前最新的版本是1.4.0

<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.4.0</version>
</dependency>

           

引入pom之後,編寫mybatis-generator對應的配置檔案。配置檔案的内容,也可以從上面的官方文檔裡找到對應的内容,我這裡選用的

target

是MyBatis3對應的模闆。

<!DOCTYPE generatorConfiguration PUBLIC
        "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="simple" targetRuntime="MyBatis3Simple">
        <!--注意,模闆中是沒有password和userId這兩項的,需要手動添加-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3307/panbase?serverTimezone=UTC"
                        password=""
                        userId=""
        />
        <!--生成對應的實體類
        targetPackage:指定生成java檔案的目錄
        targetProject:放在那個工程的哪個目錄下
        -->
        <javaModelGenerator targetPackage="com.phl.ssm.bean" targetProject="src/main/java"/>
        <!--SQL映射檔案生成器
        targetPackage:指定生成java檔案的目錄
        targetProject:放在那個工程的哪個目錄下
        -->
        <sqlMapGenerator targetPackage="com.phl.ssm.dao" targetProject="src/main/resources"/>
        <!--dao接口生成器-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.phl.ssm.dao" targetProject="src/main/java"/>

        <!--指定要逆向生成的資料表
        tableName:表名
        domainObjectName:對象名
        -->
        <table tableName="tbl_user" domainObjectName="User"/>
    </context>
</generatorConfiguration>
           

編寫好這些之後,建立一個Java類,在裡面通過main方法進行啟動。

package com.phl.ssm.genarator;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) throws Exception{
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("mbg.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

           

之後運作這個main方法。運作結束後,就能看到mybatis-generator幫我們生成的bean,dao,mapper了。

在使用mybatis-generator的時候,需要注意一下幾個内容:

  • 記得在pom裡引入對應mybatis-generator的依賴。
  • 編寫generator對應的配置時,根據個人需求,去找需要的模闆,并且根據自己的需求,更改裡面的屬性。

mybatis-plus

快速使用mybatis-plus

上面講到了mybatis-generator,估計大家也試着用了一下。好不好用,結果是否友善不做過多評說,這裡提出一個比mybatis-generator更好用的一個工具:mybatis-plus。不說别的,就沖着mybatis-plus是中國人寫的,官網是中文,就已經比generator友善了一大截子了。mybatis-plus官網.

官網中有一個對mybatis-plus很契合的說明:

mybatis基礎知識-03-C-2020-11-14mybatis緩存ssm整合mybatis-generatormybatis-plus

這裡希望大家留意的一點,既然是1P,2P。那麼不論mybatis-plus在具體編碼中與mybatis有多大的差異,都是在對mybatis進行擴充和支援。他完全不影響我們按照習慣的mybatis操作去進行編碼。

另外一點,因為我的部落格還沒寫到springboot,是以即使mybatis-plus在官網的解釋大多都是用springboot進行舉例,我這裡還是用ssm整合的形式進行講解。

老規矩,在使用之前,永遠都是先引入對應的pom資訊。

<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.4.1</version>
</dependency>

           

由于原本的項目是整合了SSM,此處為了使用mybatis-plus,最簡單的一個更改就是這裡,将原本引入的org.mybatis.spring.SqlSessionFactoryBean

<!--mybatis-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
    <!--指明mybatis配置檔案位置-->
    <property name="configLocation" value="mybatis-config.xml"></property>
    <!--指明Mapper檔案位置-->
    <property name="mapperLocations" value="classpath:com/phl/ssm/dao/impl/*.xml"></property>
</bean>
           

更改為com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean:

<bean id="sessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
    <!--指明mybatis配置檔案位置,如果沒有,這個就省略了-->
    <property name="configLocation" value="mybatis-config.xml"></property>
    <!--指明Mapper檔案位置,如果沒有,這個就省略-->
    <property name="mapperLocations" value="classpath:com/phl/ssm/dao/impl/*.xml"></property>
</bean>
           

其實也很好了解,在之前單獨使用mybatis的例子裡,測試類中都會需要new一個sqlSessionFactory對象,在使用了spring之後,就是把他對應的Bean(這個是在pom中引用mybatis-spring)放置在IOC容器中進行管理。現在既然換成了mybatis-plus,則需要把對應的sqlSessionFactoryBean換成mybatis-plus裡面的

MybatisSqlSessionFactoryBean

,感覺上就是切換了一個總體的入口,其他配置都沒有什麼更改,就可以使用mybatis-plus了。

有了配置之後,就可以進行使用了,這裡給大家貼出來兩個圖。圖一,是之前為了做SSM整合的時候,自己寫的UserDao,圖二是使用了mybatis-plus之後,寫的UserPlusDao。

mybatis基礎知識-03-C-2020-11-14mybatis緩存ssm整合mybatis-generatormybatis-plus

圖二:

mybatis基礎知識-03-C-2020-11-14mybatis緩存ssm整合mybatis-generatormybatis-plus

通過兩個圖的比對很容易發現其中的差距。

使用mybatis本身的時候,需要自己去寫對應的接口,對應的Mapper。但是使用了mybatis-plus的話,定義好了接口之後,需要繼承BaseMapper接口,并且制定好對應的泛型,然後我們就能看到很多基礎方法繼承自了BaseMapper。不需要再進行其他與dao相關的開發,就可以進行使用。

有人說了,如果使用了mybatis-generator會比這樣更友善,不需要寫bean,dao和mapper,但是對于mybatis-plus而言,他也有自己的代碼生成器,并且不光是上面提到的三種,它還可以幫着生成service和controller等。

因為mybatis-plus是一個輔助工具,并且他的官網是中文的,這裡不再做其他講解。如果大家在使用中遇到了什麼問題,可以留言。同時也非常推薦去看mybatis-plus的官網。因為這個是中國人做的,中國人寫的,它的一切一切,都是那麼符合中國人的習慣。牛逼。

最後提一句,在mybatis-plus一開始就提到的,1P,2P的比喻,不僅僅是比喻。上面我們隻是說道了mybatis-plus給我們提供的便利,但是這種便利是有局限性的。比如說,關聯查詢,自定義結果集之類的。此時,你隻需要按照原來使用mybatis的方式去使用mybatis-plus就行。類似這個UserPlusDao,雖然實作了接口BaseMapper,但是并不阻礙在他内部定義自己的方法,并且去寫對應的Mapper,一切都是那麼自然。