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的過程,以及我在其中遇到的一些小坑西剥,不一定適用于全部痹栖,但是還是有一定的參考價值!