Fork me on GitLab

Mybatis-plus配置

导入pom依赖

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
        <!--连接池-->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <!--数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
            <scope>runtime</scope>
        </dependency>

新建一个MybatisPlusConfig.java文件

@EnableTransactionManagement // 事物管理
@Configuration
public class MyBatisPlus {

    // 乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }

    // 分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }

    // 逻辑删除配置
    @Bean
     public ISqlInjector iSqlInjector(){
        return new LogicSqlInjector();
     }

     // sql 效率插件
    @Bean
    @Profile({"dev","test"})
    public PerformanceInterceptor performanceInterceptor(){
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(1000); // ms 最大执行时间超过不执行
        performanceInterceptor.setFormat(true); // 是否开启格式化支持
        return performanceInterceptor;
    }
}

在来点mybatis-plus的跟新策略

@Slf4j
@Component
public class MyMeteObject implements MetaObjectHandler {
    // 插入时的跟新策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("stats info hander.....");
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
    // 修改时的跟新策略
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

在启动类中扫描resources下的mapper文件

 

 

 

 

在application.properties文件添加数据库和mybatis-plus配置 

# mysql配置 mysql 8 版本需要配置时区
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dome?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

# 配置当前版本 开发环境
#spring.profiles.active=dev

# redis配置
#spring.redis.host=127.0.0.1
#spring.redis.port=6379


#数据库配置日志 使用控制台输出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

 

关键来了,mybatis给我们提供的代码自动生成器。在test中新建一个MybatisGenertot文件,它可以帮助我们根据数据库自动生成controller,service.....等基本代码。

  1. 先添加自动生成依赖


<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.1</version>
</dependency>

  2.新建一个带有main方法的类public class GeneratorCode 


package com.dome.common.utils.generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.Scanner;

/**
* @author auth
* @date 2020/11/25 10:52
* 生成代码
*/
public class GeneratorCode {

public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入" + tip + ":");
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}

public static void main(String[] args) {
AutoGenerator autoGenerator = new AutoGenerator();
//全局配置
GlobalConfig gc = new GlobalConfig();
//得到当前项目的路径
String oPath = System.getProperty("user.dir");
gc.setOutputDir(oPath + "/src/main/java");
//生成完成后不弹出文件框
gc.setOpen(false);
//文件覆盖
gc.setFileOverride(true);
// ActiveRecord特性
gc.setActiveRecord(false);
gc.setEnableCache(false);
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
// 作者
gc.setAuthor("auth");
gc.setSwagger2(true);
// 自定义文件命名,注意 %s 会自动填充表实体属性!
gc.setControllerName("%sController");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
autoGenerator.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("yourpass");
dsc.setUrl("jdbc:mysql://localhost:3306/sprin_security?useSSL=false&useUnicode=true&nullCatalogMeansCurrent=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai");
autoGenerator.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
//父包路径
pc.setParent("com.dome.cm");
String s = "." + scanner("包名称");
pc.setController("controller" + s);
pc.setService("service" + s);
pc.setServiceImpl("service" + s);
pc.setMapper("mapper" + s);
pc.setXml("mapper" + s);
pc.setEntity("po" + s);
autoGenerator.setPackageInfo(pc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// 表名生成策略
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
// 需要生成的表
strategy.setInclude(scanner("表名称").split(","));
strategy.setSuperServiceClass(null);
strategy.setSuperServiceImplClass(null);
strategy.setSuperMapperClass(null);
//去除表前缀
strategy.setTablePrefix("sys_", "sw_");
//去除字段前缀
strategy.setFieldPrefix("");
// 填充策略
strategy.setLogicDeleteFieldName("del_flag");
TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(createTime);
tableFills.add(updateTime);
strategy.setTableFillList(tableFills);
strategy.setVersionFieldName("version");
strategy.setRestControllerStyle(true);
autoGenerator.setStrategy(strategy);
// 执行生成
autoGenerator.execute();
}
}
 

  3.执行main方法输入数据库表名 回车。

  4.这里提供一个多模块结构的

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;

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

/**
 * @author yxw
 * @date 2021/11/25 10:52
 * 生成代码
 */
public class GeneratorCode {

    private static final String[] MODELS = {"com-dome-biz", "com-dome-model", "com-dome-provider"};

    public static void main(String[] args) {
        String modelName = "." + scanner("包名称");
        String[] tableNames = scanner("表名称,多个用','间隔").split(",");
        for (String model : MODELS) {
            shell(model, modelName, tableNames, "author");
        }
    }


    /**
     * 生成代码
     * @param model   項目名稱
     * @param modelName     包名称
     * @param tableNames     表名称
     * @param author    作者
     */
    public static void shell(String model, String modelName, String[] tableNames, String author) {
        String path = getPath(model);
        AutoGenerator autoGenerator = new AutoGenerator();
        //全局配置
        GlobalConfig gc = new GlobalConfig();
        //得到当前项目的路径
        gc.setOutputDir(path + "/src/main/java");
        //生成完成后不弹出文件框
        gc.setOpen(false);
        //文件覆盖
        gc.setFileOverride(true);
        // ActiveRecord特性
        gc.setActiveRecord(false);
        gc.setEnableCache(false);
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);
        // 作者
        gc.setAuthor(author);
        gc.setSwagger2(true);
        // 自定义文件命名,注意 %s 会自动填充表实体属性!
        gc.setControllerName("%sController");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        autoGenerator.setGlobalConfig(gc);
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
       /// 自定义数据库表字段类型转换
//        dsc.setTypeConvert(new MySqlTypeConvert(){
//            @Override
//            public IColumnType processTypeConvert(GlobalConfig globalConfig, TableField tableField) {
//                return null;
//            }
//        });
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("LBKJmysql@");
        dsc.setUrl("jdbc:mysql://sh-cdb-2i9lbldy.sql.tencentcdb.com:59810/farm_yx?useSSL=false&useUnicode=true&nullCatalogMeansCurrent=true&characterEncoding=UTF-8&serverTimezone=GMT");
        autoGenerator.setDataSource(dsc);
        // 包配置
        PackageConfig pc = packageConfig(modelName);
        autoGenerator.setPackageInfo(pc);
        /// 自定义配置  (使用模板引擎,需要把mybatis-plus自带的生成功能关闭)
//        if (StringUtils.equals(model, MODELS[0])) {
//            InjectionConfig cfg = templateConfig(path, modelName);
//            autoGenerator.setCfg(cfg);
//        }
        // 关闭默认 xml 生成,调整生成 至 根目录
        TemplateConfig tc = allocation(new TemplateConfig(), model);
        autoGenerator.setTemplate(tc);
        // 策略配置
        StrategyConfig strategy = strategyConfig(new StrategyConfig(), tableNames);
        autoGenerator.setStrategy(strategy);

        // 执行生成
        autoGenerator.execute();
    }

    /**
     * 多項目的包配置
     * @param modelName
     * @return
     */
    private static PackageConfig packageConfig(String modelName) {
        PackageConfig pc = new PackageConfig();
        // **不同的項目包路徑也需要更改
        pc.setParent(null);
        pc.setController(replace(MODELS[2], "-", ".") + ".controller" + modelName);
        pc.setService(replace(MODELS[0], "-", ".") + ".service" + modelName);
        pc.setServiceImpl(replace(MODELS[0], "-", ".") + ".service" + modelName);
        pc.setMapper(replace(MODELS[0], "-", ".") + ".mapper" + modelName);
        pc.setXml(replace(MODELS[0], "-", ".") + ".mapper" + modelName);
        pc.setEntity(replace(MODELS[1], "-", ".") + ".po" + modelName);
        return pc;
    }

    /**
     * 模板配置
     * @param path
     * @param modelName
     * @return
     */
    private static InjectionConfig templateConfig(String path, String modelName) {
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        /// 如果模板引擎是 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) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return path + "/src/main/resources/mapper/" + lastSplit(modelName, ".")
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        return cfg;
    }


    /**
     * 生成代碼策略
     * @param strategy
     * @param tableNames
     * @return
     */
    private static StrategyConfig strategyConfig(StrategyConfig strategy, String[] tableNames) {
        // 表名生成策略
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        // 需要生成的表
        strategy.setInclude(tableNames);
        /// 自己的父类实体,没有就不用设置!
//        strategy.setSuperServiceClass(null);
//        strategy.setSuperServiceImplClass(null);
//        strategy.setSuperMapperClass(null);
        //去除表前缀
         strategy.setTablePrefix("sys_", "sw_", "zzl_", "tx_", "xqd_");
        //去除字段前缀
        strategy.setFieldPrefix("");
        // 填充策略
        strategy.setLogicDeleteFieldName("is_delete");
        TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(createTime);
        tableFills.add(updateTime);
        strategy.setTableFillList(tableFills);
        strategy.setVersionFieldName("version");
        strategy.setRestControllerStyle(true);
        return strategy;
    }


    /**
     * 項目文件分配
     * @param tc
     * @param model
     * @return
     */
    private static TemplateConfig allocation(TemplateConfig tc, String model) {
        if (StringUtils.equals(MODELS[0], model)) {
            tc.setController(null);
            tc.setEntity(null);
        } else if (StringUtils.equals(MODELS[1], model)) {
            tc.setController(null);
            tc.setMapper(null);
            tc.setService(null);
            tc.setServiceImpl(null);
            tc.setXml(null);
        }  else if (StringUtils.equals(MODELS[2], model)) {
            tc.setMapper(null);
            tc.setService(null);
            tc.setServiceImpl(null);
            tc.setEntity(null);
            tc.setXml(null);
        }
        return tc;
    }

    /**
     * 读取控制台输入信息
     * @param tip
     * @return
     */
    private static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入" + tip + "");
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "");
    }

    /**
     * 获得项目路径
     * @param model
     * @return
     */
    private static String getPath(String model) {
        File file = new File(model);
        String path = file.getAbsolutePath();
        return path;
        // return path.substring(0, path.lastIndexOf(File.separator));
    }

    /**
     * 判断文件是否存在
     * @param path 路径
     * @return
     */
    private static boolean isExists(String path) {
        File file = new File(path);
        return file.exists();
    }

    /**
     * 删除文件
     * @param path
     */
    private static void delFile(String path) {
        File file = new File(path);
        if (file.exists()) {
            file.delete();
        }
    }

    /**
     * 替換字符
     * @param name
     * @param a
     * @param b
     * @return
     */
    private static String replace(String name, String a, String b) {
        return name.replace(a, b);
    }

    /**
     * 根据标识截取字符串
     * @param str
     * @param tab
     * @return
     */
    private static String lastSplit(String str, String tab) {
        return StringUtils.isEmpty(str) ? null : str.substring(str.lastIndexOf(tab) + 1, str.length());
    }

}

 

posted @ 2020-08-19 14:18  隐琳琥  阅读(1806)  评论(0编辑  收藏  举报