簡介
Mybatis-Plus是在Mybatis的基礎上,國人開發的一款持久層框架。
並且榮獲了2018年度開源中國最受歡迎的中國軟件TOP5
同樣以簡化開發為宗旨的Spring Boot
與Mybatis-Plus
放在一起會產生什么樣的化學反應呢?下面我們來領略一下兩者配合帶來的效率上的提升。
Mybatis-Plus的作用
可以看到,它給我們提供了一些核心的功能:代碼生成器和現成的CRUD接口以及可以結合Lambda
的條件構造器使我們的代碼變得足夠優雅,分頁的使用也是相當的方便,以及提供了不同的主鍵生成策略。
如果這些功能不能滿足我們的需求,Mybatis-Plus
還提供了豐富的插件供我們去使用,我們接下來只講核心功能,插件的使用會在后面的文章中進行部分的講解,感興趣的同學可以先去看一下官方的文檔。
使用第一步:引入POM
首先我們需要引入POM,我在這里引用的是最新版本的:
接着,如果我們需要使用代碼生成器,需要引入模板引擎的依賴:
到此,pom的引入就告一段落,下面我們來看一下配置文件的編寫:
使用第二步:編寫配置文件
這里我們使用的是application.yml
作為配置文件,而非新建Spring Boot
項目默認的application.properties
,這里如果不會新建一個Spring Boot
項目,可以去參考本系列教程的第一篇文章
在這里可以進行打印SQL的配置,便於我們進行排查問題。
使用第三步:建表
使用第四步:使用代碼生成器
直接貼出我的代碼生成器代碼:
public class MpGenerator {
public static void main(String[] args) {
GlobalConfig config = new GlobalConfig();
String dbUrl = "jdbc:mysql://localhost:3306/viboot?useSSL=false";
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setDbType(DbType.MYSQL)
.setUrl(dbUrl)
.setUsername("root")
.setPassword("Passw0rd")
.setDriverName("com.mysql.cj.jdbc.Driver");
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig
.setCapitalMode(true)
//這里結合了Lombok,所以設置為true,如果沒有集成Lombok,可以設置為false
.setEntityLombokModel(true)
.setNaming(NamingStrategy.underline_to_camel);
//這里因為我是多模塊項目,所以需要加上子模塊的名稱,以便直接生成到該目錄下,如果是單模塊項目,可以將后面的去掉
String projectPath = System.getProperty("user.dir") + "/viboot-mybatis-plus";
// 自定義配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定義輸出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定義配置會被優先輸出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定義輸出文件名
return projectPath + "/src/main/resources/mapper/" + "user"
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
cfg.setFileOutConfigList(focList);
//設置作者,輸出路徑,是否重寫等屬性
config.setActiveRecord(false)
.setEnableCache(false)
.setAuthor("viyoung")
.setOutputDir(projectPath + "/src/main/java")
.setFileOverride(true)
.setServiceName("%sService");
new AutoGenerator()
.setGlobalConfig(config)
.setDataSource(dataSourceConfig)
.setStrategy(strategyConfig)
.setTemplateEngine(new FreemarkerTemplateEngine())
.setCfg(cfg)
//這里進行包名的設置
.setPackageInfo(
new PackageConfig()
.setParent("indi.viyoung.viboot.mybatis")
.setController("controller")
.setEntity("entity")
.setMapper("mapper")
.setServiceImpl("service.impl")
.setService("service")
).execute();
}
}
下面我們來運行main方法,就可以看到生成的包:
將mapper
包下面xml
包刪掉,因為我們已經在resources
中生成了*mapper.xml
文件。
這里需要注意,需要在SpringBoot的啟動類上配置MapperScan
來幫助我們去找到持久層接口的位置。
使用第四步:編寫查詢列表進行測試
沒錯,我們只需要寫一行代碼就可以獲取到我們想要的列表,下面我們來訪問一下
IService與BaseMapper
有些人可能會好奇,為什么我們只需要在controller
層中直接去調用就可以獲得到列表,這是因為Mybatis-Plus
給我們封裝了一系列的CRUD的基礎接口,在通過代碼生成器生成的UserService
接口實際上是繼承了IService
接口的,而UserServiceImpl
則是繼承ServiceImpl
,所以就可以獲取到一些基礎的實現。
而IService
則給我們提供了以下方法來實現基礎的CRUD:
同樣的,BaseMapper
接口也提供了一些實現:
通過這些基礎的實現,我們可以完成日常中大部分的基礎查詢,而省去了編寫Service和ServiceImpl的時間,從編碼效率上來講比起JPA更勝一籌。
條件構造器
條件構造器可以構造一些查詢條件來獲取我們指定的值,同時可以結合Lambda表達式來使用,下面我們直接來編寫兩個例子:
可以看到,被注釋掉的部分是不使用Lambda表達式的寫法,這樣的寫法存在魔法值,而且會由於粗心寫錯column的名稱而導致錯誤,但是使用Lambda表達式就足夠直觀的可以看出我們是想查詢出userName = ?
的數據,下面,我們來運行一下,看看結果是否符合我們預期的那樣
當然,條件構造器的用法還有許許多多,這里就不在一一羅列,有需要的同學可以去官網查看文檔
分頁查詢
如果我們需要分頁查詢數據去渲染表格,可以使用Mybatis-Plus
自帶的分頁插件:
在啟動類中加入上面的代碼,然后我們就可以去使用分頁了:
我們只需要構建一個Page
對象,並初始化我們所需的頁數(page)和每頁數據量(pageSize),然后將其作為page()
方法的參數傳入即可
下面,我們來訪問一下:
至此,我們的Mybatis-Plus
就告一段落了,謝謝您的耐心閱讀,希望您有所收獲~
原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。
源碼可以去github(https://github.com/viyog/viboot/)或者碼雲(https://gitee.com/yw18530069930/viboot)上進行下載,后續的例子都會同步更新。