Mybatis-Plus的使用方法(一) 安装和使用代码生成

问题引发:

       我们在做后台管理系统时,是否经常会遇到这样的问题:这么多的模块....真的多吗?很多的模块下边基本都是一些简单的对于单表的增删改查,呢这些重复的工作我们是否需要继续写呢,每次当我们做一个后台管理系统时,相对于单表的CURD都是一直写mapper层,service层,controller层? NO,这样会浪费我们的开发时间,非常的浪费.好在互联网上有很多的好心人,将这些繁琐的事情封装了起来,请看Mybatis-Plus

解决问题:

Mybatis-Plus 官方简介

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

愿景

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

#特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
  • 内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击

#框架结构

framework

使用:

本章节只说代码生成器的使用:

1 创建springboot项目(略):

2 添加maven依赖:

<!--MyBatis-Plus 从 3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.1.1</version>
</dependency>

<!-- 添加 模板引擎 依赖,MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎,如果都不满足您的要求,可以采用自定义模板引擎-->
<!--Velocity(默认) -->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.1</version>
</dependency>

这里我们使用默认的配置,如果需要使用其他配置,请自行查看.

编码配置 :

  这一点说实话有点不爽,代码生成的配置是在java代码中写的,官方也没有看见xml配置之类的,没有办法,为了自己方便,只好将配置封装一下,只需要修改配置就可以了,这样的话,扩展性可能会有些差,一些配置写死了基本上就必须是这样的了,如果需要自行扩展的话,可以自己去扩展,

配置常量定义类:

package com.learn;

/**
 * @author ##
 * @Description 代码生成相关常量
 * @Date19-5-15 下午5:26
 * @Version V1.0
 **/
public interface GeneratorConstants {

    /**
     * 是否支持AR模式,这个配置需要自行百度
     */
    final String ACTIVE_RECORD = "ACTIVE_RECORD";

    /**
     * 作者信息
     */
    final String AUTHOR = "AUTHOR";
    /**
     * 生成文件目录
     */
    final String OUTPUT_DIR = "OUTPUT_DIR";

    /**
     * 文件是否覆盖 默认值false
     */
    final String FILE_OVEERRIDE = "FILE_OVEERRIDE";

    /**
     * 开启swagger2 模式
     *
     */
    final String SWAGGER2 = "SWAGGER2";
    /**
     * 是否打开输出目录 默认值true
     */
    final String ISOPEN = "ISOPEN";

    /**
     * 主键策略
     */
    final String ID_TYPE = "ID_TYPE";

    /**
     * 设置生成的service接口
     */
    final String SERVICE_NAME = "SERVICE_NAME";

    /**
     * 设置是否生成基本的ResultMap
     */
    final String BASE_RESULT_MAP = "BASE_RESULT_MAP";

    /**
     * 设置是否生成基本的SQL片段
     */
    final String BASE_COLUMN_LSIT = "BASE_COLUMN_LSIT";


    /**
     * 设置数据库类型
     */
    final String DB_TYPE = "DB_TYPE";

    /**
     * 驱动类名
     */
    final String DB_DRIVER_NAME = "DB_DRIVER_NAME";
    /**
     * db url
     */
    final String DB_URL = "DB_URL";
    /**
     * db username
     */
    final String DB_USERNAME = "DB_USERNAME";
    /**
     * db password
     */
    final String DB_PASSWORD = "DB_PASSWORD";

    /**
     * 全局大写命名
     */
    final String CAPITALMODE = "CAPITALMODE";
    /**
     * 是否支持lombok
     */
    final String LOMBOK = "LOMBOK";

    /**
     *  数据库表映射到实体的命名策略
     */
    final String NAMING = "NAMING";

    /**
     * 生成的表
     */
    final String INCLUDE = "INCLUDE";

    /**
     * 父包名称
     */
    final String PACKAGE_PARENT="PACKAGE_PARENT";

    /**
     * mapper层包名
     */
    final String PACKAGE_MAPPER="PACKAGE_MAPPER";
    /**
     * service 包名
     */
    final String PACKAGE_SERVICE="PACKAGE_SERVICE";
    /**
     * controller 包名
     */
    final String PACKAGE_CONTROLLER="PACKAGE_CONTROLLER";
    /**
     * 实体bean 包名
     */
    final String PACKAGE_ENTITY="PACKAGE_ENTITY";
    /**
     * xml 后缀
     */
    final String PACKAGE_MAPPERXML="PACKAGE_MAPPERXML";

}

在resource 目录下新建一个generator.properties

#是否支持AR模式
ACTIVE_RECORD=true
#作者信息
AUTHOR=##
#生成文件目录
OUTPUT_DIR=/opt/export/data/logdemo/learning-mybatis-plus/src/main/java
#文件是否覆盖默认值false
FILE_OVEERRIDE=true
#开启swagger2模式
SWAGGER2=false
#是否打开输出目录默认值true
ISOPEN=false
#主键策略
#    AUTO(0),
#    NONE(1),
#    INPUT(2),
#    ID_WORKER(3),
#    UUID(4),
#    ID_WORKER_STR(5);
ID_TYPE=AUTO
#设置生成的service接口
SERVICE_NAME=%sService
#设置lombok
LOMBOK=true
#设置是否生成基本的ResultMap
BASE_RESULT_MAP=true
#设置是否生成基本的SQL片段
BASE_COLUMN_LSIT=true
#设置数据库类型
DB_TYPE=MYSQL
#驱动类名
DB_DRIVER_NAME=com.mysql.cj.jdbc.Driver
#dburl
DB_URL=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=CTT
#dbusername
DB_USERNAME=root
#dbpassword
DB_PASSWORD=root
#全局大写命名
CAPITALMODE=true
#数据库表映射到实体的命名策略 详情看NamingStrategy
NAMING=underline_to_camel
#生成的表
INCLUDE=user
#父包名称
PACKAGE_PARENT=com.learn
#mapper层包名
PACKAGE_MAPPER=mapper
#service包名
PACKAGE_SERVICE=service
#controller包名
PACKAGE_CONTROLLER=controller
#实体bean包名
PACKAGE_ENTITY=bean
#xml后缀
PACKAGE_MAPPERXML=mapper

提供一个解析properties的工具类

 private static final Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);

    private static Properties prop = new Properties();

    static {
        InputStream in = PropertiesUtil.class.getClassLoader().getResourceAsStream("generator.properties");
        try {

            prop.load(new InputStreamReader(in, "utf-8"));
        } catch (Exception e) {
            logger.error("读取 properties出错:" + e);
        }
    }

    /**
     * 获取String 参数
     */
    public static String getProperty(String key) {

        try {
            String value = prop.getProperty(key);
            return value;
        } catch (Exception e) {
            logger.error("获取" + key + "的value出错" + e);
            return null;
        }

    }

    /**
     * 获取数组参数
     *
     * @param key
     * @return
     */
    public static String[] getStringArrProperties(String key) {
        try {

            String value = prop.getProperty(key);
            String[] split = value.split(",");
            if (split.length >=1){
                return split;

            }else {
                throw new RuntimeException("表配置不可为空,请检查include配置");
            }


        } catch (Exception e) {
            logger.error("获取" + key + "的value出错" + e);
            return null;
        }
    }


    /**
     * 获取数组参数
     *
     * @param key
     * @return
     */
    public static Boolean getBooleanValue(String key) {
        try {
            String result = prop.getProperty(key);
            return Boolean.parseBoolean(result);
        } catch (Exception e) {
            logger.error("获取" + key + "的value出错" + e);
            return null;
        }
    }



    /**
     * 获取枚举类型参数
     */
    public    T   getENUMValue(String key,Class clazz) {
        try {
            String result = prop.getProperty(key);

            T t = (T) Enum.valueOf(clazz, result);
            return t;

        } catch (Exception e) {
            logger.error("获取" + key + "的value出错" + e);
            return null;
        }
    }

代码生成的配置:

public static void main(String[] args) {

        //========全局配置===========
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setActiveRecord(PropertiesUtil.getBooleanValue(GeneratorConstants.ACTIVE_RECORD))

                .setAuthor(PropertiesUtil.getProperty(GeneratorConstants.AUTHOR))

                .setOutputDir(PropertiesUtil.getProperty(GeneratorConstants.OUTPUT_DIR))

                .setFileOverride(PropertiesUtil.getBooleanValue(GeneratorConstants.FILE_OVEERRIDE))

                .setIdType(new PropertiesUtil<IdType>().getENUMValue(GeneratorConstants.ID_TYPE, IdType.class))

                .setServiceName(PropertiesUtil.getProperty(GeneratorConstants.SERVICE_NAME))

                .setBaseResultMap(PropertiesUtil.getBooleanValue(GeneratorConstants.BASE_RESULT_MAP))

                .setBaseColumnList(PropertiesUtil.getBooleanValue(GeneratorConstants.BASE_COLUMN_LSIT));

        //========数据源配置===========
        DataSourceConfig dataSourceConfig = new DataSourceConfig();

        dataSourceConfig.setDbType(new PropertiesUtil<DbType>().getENUMValue(GeneratorConstants.DB_TYPE, DbType.class))

                .setDriverName(PropertiesUtil.getProperty(GeneratorConstants.DB_DRIVER_NAME))

                .setUrl(PropertiesUtil.getProperty(GeneratorConstants.DB_URL))

                .setUsername(PropertiesUtil.getProperty(GeneratorConstants.DB_USERNAME))

                .setPassword(PropertiesUtil.getProperty(GeneratorConstants.DB_PASSWORD));


        StrategyConfig strategyConfig = new StrategyConfig();

        String[] tableNames = PropertiesUtil.getStringArrProperties(GeneratorConstants.INCLUDE);

        strategyConfig.setCapitalMode(PropertiesUtil.getBooleanValue(GeneratorConstants.CAPITALMODE))

                .setNaming(new PropertiesUtil<NamingStrategy>().getENUMValue(GeneratorConstants.NAMING, NamingStrategy.class))

                .setEntityLombokModel(PropertiesUtil.getBooleanValue(GeneratorConstants.LOMBOK))

                .setInclude(tableNames);


        //========包配置===========
        PackageConfig packageConfig = new PackageConfig();
        packageConfig
                .setParent(PropertiesUtil.getProperty(GeneratorConstants.PACKAGE_PARENT))
                .setMapper(PropertiesUtil.getProperty(GeneratorConstants.PACKAGE_MAPPER))
                .setService(PropertiesUtil.getProperty(GeneratorConstants.PACKAGE_SERVICE))
                .setController(PropertiesUtil.getProperty(GeneratorConstants.PACKAGE_CONTROLLER))
                .setEntity(PropertiesUtil.getProperty(GeneratorConstants.PACKAGE_ENTITY))
                .setXml(PropertiesUtil.getProperty(GeneratorConstants.PACKAGE_MAPPERXML));


        //========自动生成配置,将之前的配置全部加入===========
        AutoGenerator autoGenerator = new AutoGenerator();


        autoGenerator.setGlobalConfig(globalConfig)
                .setDataSource(dataSourceConfig)
                .setStrategy(strategyConfig)
                .setPackageInfo(packageConfig);
        autoGenerator.execute();
    }

生成完成:

controller需要我们自己写,service 和Mapper 以及Bean都是现成的,

附录:

官方文档地址说明:

https://mp.baomidou.com/guide/#%E7%89%B9%E6%80%A7

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值