SpringBoot集成Mybatis-Plus

SpringBoot集成Mybatis-Plus

pom.xml導入依賴


<!--包含mybatis-plus癣诱、mybaits核心、mybatis-spring-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>com.baomidou</groupId>

? ? ? ? ? ? <artifactId>mybatis-plus-boot-starter</artifactId>

? ? ? ? ? ? <version>3.1.2</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>com.baomidou</groupId>

? ? ? ? ? ? <artifactId>mybatis-plus</artifactId>

? ? ? ? ? ? <version>3.1.2</version><!--wapper要用這個版本-->

? ? ? ? ? ? <!--<version>2.1.8</version>--><!--代碼生成器用這個版本-->

? ? ? ? </dependency>

? ? ? ? <!--druid數(shù)據(jù)庫連接池-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>com.alibaba</groupId>

? ? ? ? ? ? <artifactId>druid</artifactId>

? ? ? ? ? ? <version>1.1.8</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>com.baomidou</groupId>

? ? ? ? ? ? <artifactId>mybatis-plus-generator</artifactId>

? ? ? ? ? ? <version>3.1.2</version>

? ? ? ? </dependency>

? ? ? ? <!-- 模板引擎 代碼生成 -->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.apache.velocity</groupId>

? ? ? ? ? ? <artifactId>velocity-engine-core</artifactId>

? ? ? ? ? ? <version>2.0</version>

? ? ? ? </dependency>

? ? ? ? <!-- 模板引擎玛歌,需要指定 mpg.setTemplateEngine(new FreemarkerTemplateEngine()); -->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.freemarker</groupId>

? ? ? ? ? ? <artifactId>freemarker</artifactId>

? ? ? ? ? ? <version>2.3.23</version>

? ? ? ? </dependency>


注意看依賴里面的注釋,如果要用到mybatis-plus的wapper奏赘,那版本需要是3x以上的竹揍,但如果要用Generator代碼生成器,我是用的2.1.8的版本痕鳍,因為3x的版本`import com.baomidou.mybatisplus.generator.config.rules.DbType`這個包導不進去硫豆,具體原因也沒有做過多的探索龙巨,如果有了解的朋友,可以留言給我熊响!一起探討旨别!



mybatisplus-config.properties配置

注意jdbc.url的時區(qū)設置`characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false`


#代碼輸出基本路徑

OutputDir=E:\\code\\java\\demo\\src\\main\\java

? ? ? ? #mapper.xml SQL映射文件目錄

OutputDirXml=E:\\code\\java\\demo\\src\\main\\resources

#domain的輸出路徑

#OutputDirBase=D:/ideaworkspace/hrm-parent/com_likun_cinema/src/main/java

#設置作者

author=ck

#自定義包路徑com.zq

parent=com.zq

#數(shù)據(jù)庫連接信息

jdbc.driver=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://127.0.0.1:3306/ck?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false

jdbc.user=root

jdbc.pwd=root


application.yml配置

可直接復制修改數(shù)據(jù)庫和包名以及mapper.xml的輸出路徑

注意`driver-class-name: com.mysql.cj.jdbc.Driver`? 這里一定要加上cj


spring:

? datasource:

? ? driver-class-name: com.mysql.cj.jdbc.Driver

? ? url: jdbc:mysql://127.0.0.1:3306/ck?characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false

? ? username: root

? ? password: root

? ? type: com.alibaba.druid.pool.DruidDataSource

mybatis-plus:

? # 如果是放在src/main/java目錄下 classpath:/com/yourpackage/*/mapper/*Mapper.xml

? # 如果是放在resource目錄 classpath:/mapper/*Mapper.xml

? mapper-locations: classpath:com/zq/mapper/*Mapper.xml

? #實體掃描,多個package用逗號或者分號分隔

? typeAliasesPackage: com.zq.entity

? global-config:

? ? #主鍵類型? 0:"數(shù)據(jù)庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數(shù)字類型唯一ID)", 3:"全局唯一ID UUID";

? ? id-type: 0

? ? #字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"

? ? field-strategy: 1

? ? #駝峰下劃線轉換

? ? #db-column-underline: true

? ? #刷新mapper 調試神器

? ? #refresh-mapper: true

? ? #數(shù)據(jù)庫大寫下劃線轉換

? ? #capital-mode: true

? ? # Sequence序列接口實現(xiàn)類配置

? ? #key-generator: com.baomidou.mybatisplus.incrementer.OracleKeyGenerator

? ? #邏輯刪除配置(下面3個配置)

? ? #logic-delete-value: 1

? ? #logic-not-delete-value: 0

? ? #sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector

? ? #自定義填充策略接口實現(xiàn)

? ? #meta-object-handler: com.baomidou.springboot.MyMetaObjectHandler

? configuration:

? ? map-underscore-to-camel-case: true

? ? cache-enabled: false

? ? #配置JdbcTypeForNull

? ? jdbc-type-for-null: 'null'


啟動類中掃描mapper層


@SpringBootApplication

@MapperScan(basePackages = "com.zq.mapper")

public class MySpringbootApplication {

? ? public static void main(String[] args) {

? ? ? ? SpringApplication.run(MySpringbootApplication.class, args);

? ? }

}


自定義的模板放在`resources/templates`這個目錄下

注意模板里面的涉及的路徑一定要修改成自己的路徑

controller.java.vm


package ${package.Controller};

import ${package.Service}.${table.serviceName};

import ${package.Entity}.${entity};

import com.zq.query.${entity}Query;

import com.zq.util.AjaxResult;

import com.zq.util.PageList;

import com.baomidou.mybatisplus.plugins.Page;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;

import io.swagger.annotations.ApiOperation;

import io.swagger.annotations.ApiParam;

import java.util.List;

@RestController

@RequestMapping("/${table.entityPath}")

public class ${entity}Controller {

? ? @Autowired

? ? public ${table.serviceName} ${table.entityPath}Service;

? ? /**

? ? * 保存和修改公用的

? ? * @param ${table.entityPath}? 傳遞的實體

? ? * @return Ajaxresult轉換結果

? ? */

? ? @RequestMapping(value="/save",method= RequestMethod.POST)

? ? public AjaxResult save(@RequestBody ${entity} ${table.entityPath}){

? ? ? ? try {

? ? ? ? ? ? if(${table.entityPath}.getId()!=null){

${table.entityPath}Service.updateById(${table.entityPath});

? ? ? ? ? ? }else{

${table.entityPath}Service.insert(${table.entityPath});

? ? ? ? ? ? }

? ? ? ? ? ? return AjaxResult.me();

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? return AjaxResult.me().setSuccess(false).setMessage("保存對象失敽骨选秸弛!"+e.getMessage());

? ? ? ? }

? ? }

? ? /**

? ? * 刪除對象信息

? ? * @param id

? ? * @return

? ? */

? ? @RequestMapping(value="/{id}",method=RequestMethod.DELETE)

? ? public AjaxResult delete(@PathVariable("id") String id){

? ? ? ? try {

${table.entityPath}Service.deleteById(id);

? ? ? ? ? ? return AjaxResult.me();

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? ? ? return AjaxResult.me().setSuccess(false).setMessage("刪除對象失敗剔难!"+e.getMessage());

? ? ? ? }

? ? }

? ? //獲取

? ? @RequestMapping(value = "/{id}",method = RequestMethod.GET)

? ? public ${entity} get(@PathVariable("id")Long id)

? ? {

? ? ? ? return ${table.entityPath}Service.selectById(id);

? ? }

? ? /**

? ? * 查看所有

? ? * @return

? ? */

? ? @RequestMapping(value = "/list",method = RequestMethod.GET)

? ? public List<${entity}> list(){

? ? ? ? return ${table.entityPath}Service.selectList(null);

? ? }

? ? /**

? ? * 分頁查詢數(shù)據(jù)

? ? *

? ? * @param ${table.entityPath}Query 查詢對象

? ? * @return PageList 分頁對象

? ? */

? ? @RequestMapping(value = "/pagelist",method = RequestMethod.POST)

? ? public PageList<${entity}> json(@RequestBody ${entity}Query ${table.entityPath}Query)

? ? {

? ? ? ? Page<${entity}> page = new Page<${entity}>(${table.entityPath}Query.getPage(),${table.entityPath}Query.getRows());

? ? ? ? page = ${table.entityPath}Service.selectPage(page);

? ? ? ? return new PageList<${entity}>(page.getTotal(),page.getRecords());

? ? }

}


entity.java.vm


package ${package.Entity};

import io.swagger.annotations.ApiModel;

import io.swagger.annotations.ApiModelProperty;

import com.baomidou.mybatisplus.annotations.TableField;

import com.baomidou.mybatisplus.annotations.TableName;

import lombok.Data;

import java.io.Serializable;

import java.util.Date;

## 表備注胆屿,作者奥喻,日期

/**

* @author ${author}

* @since ${date}

*/

## 使用lombok

@Data

@ApiModel(value="${entity}對象")

@TableName("${table.name}")

public class ${entity} implements Serializable {

#foreach($field in ${table.fields})

#if("$!field.comment" != "")

? ? @ApiModelProperty(value = "${field.comment}")

#end

#if(${field.convert})

#if(${field.keyFlag})

@TableId("${field.name}")

#else

@TableField("${field.name}")

#end

#end

private ${field.propertyType} ${field.propertyName};

#end

}


query.java.vm


package com.zq.query;

import com.zq.common.query.BaseQuery;

/**

*

* @author ${author}

* @since ${date}

*/

public class ${table.entityName}Query extends BaseQuery{

}

```

test.vm

```java

package ${package.Entity};

#foreach($pkg in ${table.importPackages})

import ${pkg};

#end

#if(${swagger2})

import io.swagger.annotations.ApiModel;

import io.swagger.annotations.ApiModelProperty;

#end

#if(${entityLombokModel})

import lombok.Data;

#end

## 表備注偶宫,作者,日期

/**

*

* @author ${author}

* @since ${date}

*/

@Data

@TableName("${table.name}")

@ApiModel(value="${entity}對象")

public class ${entity} implements Serializable {

## ----------? BEGIN 字段循環(huán)遍歷? ----------

#foreach($field in ${table.fields})

## swagger2字段api

? ? #if("$!field.comment" != "")

? ? ? ? ? ? #if(${field.propertyType} == "Long" || ${field.propertyType} == "Integer")

? ? ? ? ? ? ? ? #if(${field.keyFlag})

? ? ? ? ? ? ? ? @ApiModelProperty(value = "${field.comment},新增不傳",example="1")

? ? ? ? ? ? ? ? #else

? ? ? ? ? ? ? ? @ApiModelProperty(value = "${field.comment}",example="1")

? ? ? ? ? ? ? ? #end

? ? ? ? ? ? #else

? ? ? ? ? ? @ApiModelProperty(value = "${field.comment}")

? ? ? ? ? ? #end

? ? #end

private ${field.propertyType} ${field.propertyName};

#end

## ----------? END 字段循環(huán)遍歷? ----------

## ---------- 使用的lombok,所以后面的get/set都不要 ---------------

}

#foreach($field in ${table.fields})

? ? #if(${field.keyFlag})

? ? ? ? #set($keyPropertyName=${field.propertyName})

? ? #end

? ? #if("$!field.comment" != "")

? ? /**

? ? * ${field.comment}

? ? */

? ? @ApiModelProperty(value = "${field.comment}")

? ? #end

? ? #if(${field.convert})

? ? ? ? #if(${field.keyFlag})

? ? ? ? @TableId("${field.name}")

? ? ? ? #else

? ? ? ? @TableField("${field.name}")

? ? ? ? #end

? ? #end

private ${field.propertyType} ${field.propertyName};

#end


所有的準備工作都做好了接下來就是真正的代碼生成器了

GenteratorCode.java


package com.zq;

import com.baomidou.mybatisplus.generator.AutoGenerator;

import com.baomidou.mybatisplus.generator.InjectionConfig;

import com.baomidou.mybatisplus.generator.config.*;

import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;

import com.baomidou.mybatisplus.generator.config.po.TableInfo;

//import com.baomidou.mybatisplus.generator.config.rules.DbType; //使用時去掉注釋 修改pom里面mybatisplus的版本號

import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.*;

/**

* 生成代碼的主類

*/

public class GenteratorCode {

? ? public static void main(String[] args) throws InterruptedException {

? ? ? ? //if(true) return;

? ? ? ? //用來獲取Mybatis-Plus.properties文件的配置信息

? ? ? ? ResourceBundle rb = ResourceBundle.getBundle("mybatisplus-config"); //不要加后綴

? ? ? ? String path="/com/zq/";

? ? ? ? AutoGenerator mpg = new AutoGenerator();

? ? ? ? // 全局配置

? ? ? ? GlobalConfig gc = new GlobalConfig();

? ? ? ? gc.setOutputDir(rb.getString("OutputDir"));

? ? ? ? gc.setFileOverride(true);

? ? ? ? gc.setActiveRecord(true);// 開啟 activeRecord 模式

? ? ? ? gc.setEnableCache(false);// XML 二級緩存

? ? ? ? gc.setBaseResultMap(true);// XML ResultMap

? ? ? ? gc.setBaseColumnList(false);// XML columList

? ? ? ? gc.setAuthor(rb.getString("author"));

? ? ? ? mpg.setGlobalConfig(gc);

? ? ? ? // 數(shù)據(jù)源配置

? ? ? ? DataSourceConfig dsc = new DataSourceConfig();

? ? ? ? //dsc.setDbType(DbType.MYSQL);? //使用的時候去掉注釋

? ? ? ? dsc.setTypeConvert(new MySqlTypeConvert());

? ? ? ? dsc.setDriverName(rb.getString("jdbc.driver"));

? ? ? ? dsc.setUsername(rb.getString("jdbc.user"));

? ? ? ? dsc.setPassword(rb.getString("jdbc.pwd"));

? ? ? ? dsc.setUrl(rb.getString("jdbc.url"));

? ? ? ? mpg.setDataSource(dsc);

? ? ? ? // 策略配置

? ? ? ? StrategyConfig strategy = new StrategyConfig();

? ? ? ? //strategy.setTablePrefix(new String[] { "t_" });// 此處可以修改為您的表前綴

? ? ? ? strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略

? ? ? ? //strategy.setInclude(new String[]{"user"}); // 需要生成的表

? ? ? ? strategy.setInclude("user"); // 需要生成的表

? ? ? ? mpg.setStrategy(strategy);

? ? ? ? // 包配置

? ? ? ? PackageConfig pc = new PackageConfig();

? ? ? ? pc.setParent(rb.getString("parent"));

? ? ? ? pc.setController("web.controller");

? ? ? ? pc.setService("service");

? ? ? ? pc.setServiceImpl("service.impl");

? ? ? ? pc.setEntity("entity");

? ? ? ? pc.setMapper("mapper");

? ? ? ? mpg.setPackageInfo(pc);

? ? ? ? // 注入自定義配置环鲤,可以在 VM 中使用 cfg.abc 【可無】

? ? ? ? InjectionConfig cfg = new InjectionConfig() {

? ? ? ? ? ? @Override

? ? ? ? ? ? public void initMap() {

? ? ? ? ? ? ? ? Map<String, Object> map = new HashMap<String, Object>();

? ? ? ? ? ? ? ? map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-rb");

? ? ? ? ? ? ? ? this.setMap(map);

? ? ? ? ? ? }

? ? ? ? };

? ? ? ? List<FileOutConfig> focList = new ArrayList<FileOutConfig>();

? ? ? ? //controller的輸出配置

? ? ? ? focList.add(new FileOutConfig("/templates/controller.java.vm") {

? ? ? ? ? ? @Override

? ? ? ? ? ? public String outputFile(TableInfo tableInfo) {

? ? ? ? ? ? ? ? return rb.getString("OutputDir") +path+"web/controller/" + tableInfo.getEntityName() + "Controller.java";

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? //query的輸出配置

? ? ? ? focList.add(new FileOutConfig("/templates/query.java.vm") {

? ? ? ? ? ? @Override

? ? ? ? ? ? public String outputFile(TableInfo tableInfo) {

? ? ? ? ? ? ? ? return rb.getString("OutputDir") +path+"query/" + tableInfo.getEntityName() + "Query.java";

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? // 調整 domain 生成目錄演示

? ? ? ? focList.add(new FileOutConfig("/templates/entity.java.vm") {

? ? ? ? ? ? @Override

? ? ? ? ? ? public String outputFile(TableInfo tableInfo) {

? ? ? ? ? ? ? ? return rb.getString("OutputDir")+path+ "entity/" + tableInfo.getEntityName() + ".java";

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? // 調整 xml 生成目錄演示

? ? ? ? focList.add(new FileOutConfig("/templates/mapper.xml.vm") {

? ? ? ? ? ? @Override

? ? ? ? ? ? public String outputFile(TableInfo tableInfo) {

? ? ? ? ? ? ? ? return rb.getString("OutputDirXml")+path+ "mapper/" + tableInfo.getEntityName() + "Mapper.xml";

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? cfg.setFileOutConfigList(focList);

? ? ? ? mpg.setCfg(cfg);

? ? ? ? // 自定義模板配置纯趋,可以 copy 源碼 mybatis-plus/src/main/resources/templates 下面內容修改,

? ? ? ? // 放置自己項目的 src/main/resources/templates 目錄下, 默認名稱一下可以不配置冷离,也可以自定義模板名稱

? ? ? ? TemplateConfig tc = new TemplateConfig();

? ? ? ? tc.setService("/templates/service.java.vm");

? ? ? ? tc.setServiceImpl("/templates/serviceImpl.java.vm");

? ? ? ? tc.setMapper("/templates/mapper.java.vm");

? ? ? ? tc.setEntity(null);

? ? ? ? tc.setController(null);

? ? ? ? tc.setXml(null);

? ? ? ? // 如上任何一個模塊如果設置 空 OR Null 將不生成該模塊吵冒。

? ? ? ? mpg.setTemplate(tc);

? ? ? ? // 執(zhí)行生成

? ? ? ? mpg.execute();

? ? }

}


這就是完整的springboot集成mybatis-plus的過程,以及我在其中遇到的一些小坑西剥,不一定適用于全部痹栖,但是還是有一定的參考價值!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瞭空,一起剝皮案震驚了整個濱河市揪阿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咆畏,老刑警劉巖南捂,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旧找,居然都是意外死亡溺健,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門钮蛛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞭缭,“玉大人,你說我怎么就攤上這事魏颓「咳ィ” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵琼开,是天一觀的道長易结。 經常有香客問我,道長,這世上最難降的妖魔是什么搞动? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任躏精,我火速辦了婚禮,結果婚禮上鹦肿,老公的妹妹穿的比我還像新娘矗烛。我一直安慰自己,他們只是感情好箩溃,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布瞭吃。 她就那樣靜靜地躺著,像睡著了一般涣旨。 火紅的嫁衣襯著肌膚如雪歪架。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天霹陡,我揣著相機與錄音和蚪,去河邊找鬼。 笑死烹棉,一個胖子當著我的面吹牛攒霹,可吹牛的內容都是我干的。 我是一名探鬼主播浆洗,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼催束,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伏社?” 一聲冷哼從身側響起抠刺,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洛口,沒想到半個月后矫付,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡第焰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年买优,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挺举。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡杀赢,死狀恐怖,靈堂內的尸體忽然破棺而出湘纵,到底是詐尸還是另有隱情脂崔,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布梧喷,位于F島的核電站砌左,受9級特大地震影響脖咐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜汇歹,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一屁擅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧产弹,春花似錦派歌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至斤斧,卻和暖如春早抠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背折欠。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工贝或, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吼过,地道東北人锐秦。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像盗忱,于是被迫代替她去往敵國和親酱床。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容