文章目錄
- 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很契合的說明:

這裡希望大家留意的一點,既然是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本身的時候,需要自己去寫對應的接口,對應的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,一切都是那麼自然。