Mybatis generator和mybatis-plus

一 Mybatis generator的实现

实现方法一:

依赖+配置文件+运行实现类

1.依赖

    
    
        org.mybatis.generator
        mybatis-generator-core
        1.3.3
    

2.配置文件


DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
  
  
  <classPathEntry
    location="D:\IDEAWork\mall\src\main\resources\mysql-connector-java-8.0.18.jar"/>
  <context id="MysqlTables" targetRuntime="MyBatis3">
    <property name="autoDelimitKeywords" value="true"/>
    
    <property name="beginningDelimiter" value="`"/>
    <property name="endingDelimiter" value="`"/>
    
    <commentGenerator>
      <property name="suppressDate" value="true"/>
      <property name="suppressAllComments" value="true"/>
    commentGenerator>
    
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
      connectionURL="jdbc:mysql://127.0.0.1:3306/imooc_mall?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai"
      userId="root"
      password="123456">
      <property name="nullCatalogMeansCurrent" value="true"/>
    jdbcConnection>
    
    <javaTypeResolver>
      <property name="forceBigDecimals" value="false"/>
    javaTypeResolver>
    
    <javaModelGenerator targetPackage="com.imooc.mall.model.pojo"
      targetProject="src/main/java">
      
      <property name="enableSubPackages" value="true"/>
      
      <property name="trimStrings" value="true"/>
      
      <property name="immutable" value="false"/>
    javaModelGenerator>
    
    <sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
      <property name="enableSubPackages" value="true"/>
    sqlMapGenerator>
    
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.imooc.mall.model.dao"
      targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
    javaClientGenerator>
    
    <table schema="root" tableName="imooc_mall_cart" domainObjectName="Cart"
      enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    table>
    <table tableName="imooc_mall_category" domainObjectName="Category" enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    table>
    <table tableName="imooc_mall_order" domainObjectName="Order" enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    table>
    <table tableName="imooc_mall_order_item" domainObjectName="OrderItem"
      enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    table>
    <table tableName="imooc_mall_product" domainObjectName="Product" enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    table>
    <table tableName="imooc_mall_user" domainObjectName="User" enableCountByExample="false"
      enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
      selectByExampleQueryId="false">
    table>

  context>
generatorConfiguration>

3.实现类

package com.macro.mall.tiny.mbg;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 用于生产MBG的代码
 * Created by macro on 2018/4/26.
 */
public class Generator {
    public static void main(String[] args) throws Exception {
        //MBG 执行过程中的警告信息
        List<String> warnings = new ArrayList<String>();
        //当生成的代码重复时,覆盖原代码
        boolean overwrite = true;
        //读取我们的 MBG 配置文件
        InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();

        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        //创建 MBG
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        //执行生成代码
        myBatisGenerator.generate(null);
        //输出警告信息
        for (String warning : warnings) {
            System.out.println(warning);
        }
    }
}

实现方法二:

插件+配置文件+运行插件

1.插件

<plugin>
  <groupId>org.mybatis.generator</groupId>
  <artifactId>mybatis-generator-maven-plugin</artifactId>
  <version>1.3.7</version>
  <configuration>
    <verbose>true</verbose>
    <overwrite>true</overwrite>
  </configuration>
</plugin>

2.配置文件同上

3.右边maven点击运行插件

二 mybatis-plus的实现

(1)引入依赖

        
            com.baomidou
            mybatis-plus-boot-starter
            3.0.5
        


        
            mysql
            mysql-connector-java
        

(2)手动创建mapper和pojo类

此处创建的mapper接口需要实现BaseMapper接口,才可以使用默认的CRUD方法Mybatis generator则不用实现接口,自动就写了接口的方法

public interface UserMapper extends BaseMapper<User> {
}

注意:不管用哪个都要在启动类上加mapper扫描

@MapperScan(basePackages = “com.imooc.mall.model.dao”)//告诉Mapper接口在哪,不然会报错说不知道

(3)输出日志

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

(4)mybatis-plus的主键策略

可以在pojo的主键上添加注解,进行指定主键指定主键策略
Mybatis generator和mybatis-plus_第1张图片

  • AUTO:自动
  • INPUT:手动输入
  • NONE:不使用MP的主键策略
  • UUID:随机生成UUID作为主键
  • ID_WORKER:根据算法生成全局序列(数字类型)
  • ID_WORKER_STR:根据算法生成全局序列(字符串类型)

如果不想给每个POJO都配置自增属性,也可以只写@TableId注解,然后自增策略写在配置文件

# 主键自增
mybatis-plus.global-config.db-config.id-type=auto

(5)MP的自动填充

比如创建时间和更新时间需要自动填充

做法:
1.在POJO属性上进行注释(说明什么时候自动添加)
Mybatis generator和mybatis-plus_第2张图片
2.实现元组件控制器(往什么里添加什么)
Mybatis generator和mybatis-plus_第3张图片

(6)乐观锁和悲观锁

  • 悲观锁:资源被使用,直接锁定,别人用不了
  • 乐观锁:通过版本号进行控制,版本号不对,进行回滚

关系型数据库都是悲观锁,非关系型数据库是乐观锁

MP如何实现乐观锁?
1.POJO和表添加version字段
2.version字段实现自动添加版本(在插入时候,添加默认版本)
3.在配置类添加乐观锁插件的bean
Mybatis generator和mybatis-plus_第4张图片
注意:在执行更新的时候,乐观锁不会生效,必须先查询出来,再更新,此时更新的sql是where id = ? and version = ?

(7)MP实现分页查询

1.配置类中添加分页插件bean

@Bean
public PaginationInterceptor  paginationInterceptor() {        
    return new PaginationInterceptor();
}
 public IPage<Book> paging(Long category,String order,String author,Integer page, Integer rows) {
		//Ipage是分页接口,page是具体实现
		Page<Book> page1 = new Page<Book>(page, rows);
        QueryWrapper<Book> queryWrapper = new QueryWrapper<Book>();
        IPage<Book> pageObject = bookMapper.selectPage(page1, queryWrapper);
        return pageObject;
 

(8)MP实现逻辑删除

数据并不是直接删除,而是进行更新,修改标记删除的字段

1.添加标记删除的字段
2.为标记删除的字段添加字段添加(插入时默认为未删除0)
3.为字段添加逻辑删除注解
Mybatis generator和mybatis-plus_第5张图片
4.添加配置,为MP指明未删除和删除的表示
Mybatis generator和mybatis-plus_第6张图片
5.添加逻辑删除插件
Mybatis generator和mybatis-plus_第7张图片
6.在执行Mapper的删除操作时候,实际上执行的是update

(9)条件查询构造器Wrapper

Mybatis generator和mybatis-plus_第8张图片

eq:equals,等于
gt:greater than ,大于 >
ge:greater than or equals,大于等于≥
lt:less than,小于<
le:less than or equals,小于等于≤
between:相当于SQL中的BETWEEN
like:模糊匹配。like(“name”,“黄”),相当于SQL的name like ‘%黄%’
likeRight:模糊匹配右半边。likeRight(“name”,“黄”),相当于SQL的name like ‘黄%’
likeLeft:模糊匹配左半边。likeLeft(“name”,“黄”),相当于SQL的name like ‘%黄’
notLike:notLike(“name”,“黄”),相当于SQL的name not like ‘%黄%’
isNull
isNotNull
and:SQL连接符AND
or:SQL连接符OR
in: in(“age",{1,2,3})相当于 age in(1,2,3)
groupBy: groupBy(“id”,“name”)相当于 group by id,name
orderByAsc :orderByAsc(“id”,“name”)相当于 order by id ASC,name ASC
orderByDesc :orderByDesc (“id”,“name”)相当于 order by id DESC,name DESC

(10)mybatis-plus的逆向生成工具

  • 依赖

官网有

    
        org.springframework.boot
        spring-boot-starter-web
    
    
    
        com.baomidou
        mybatis-plus-boot-starter
        3.4.1
    
    
    
        com.baomidou
        mybatis-plus-generator
        3.4.1
    
    
    
        org.freemarker
        freemarker
    
    
    
        mysql
        mysql-connector-java
        runtime
    
  • 生成器类
package com.liu.generator;

import com.baomidou.mybatisplus.annotation.DbType;
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.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;

/**
 * @author long
 */
public class CodeGenerator {

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        //设置代码的生成位置,磁盘的目录
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/yeb-server/src/main/java");

        gc.setAuthor("long");
        gc.setOpen(false); //生成后是否打开资源管理器
        gc.setFileOverride(false); //重新生成时文件是否覆盖

        gc.setBaseResultMap(true); //xml开启 BaseResultMap
        gc.setBaseColumnList(true); //xml 开启BaseColumnList

        gc.setServiceName("%sService"); //去掉Service接口的首字母I
        gc.setSwagger2(true); //开启Swagger2模式

        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/yeb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.hwl")
                .setModuleName("server")
                .setEntity("entity")
                .setMapper("mapper")
                .setService("service")
                .setServiceImpl("service.impl")
                .setController("controller");
        mpg.setPackageInfo(pc);

        // 自定义配置
        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 projectPath + "/yeb-server/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper"
                        + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);

        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();

        strategy.setNaming(NamingStrategy.underline_to_camel) //数据库表映射到实体的命名策略,驼峰命名规则
                .setTablePrefix("t_") //生成实体时去掉表前缀
                .setColumnNaming(NamingStrategy.no_change) //数据库表字段映射到实体的命名策略
                .setEntityLombokModel(true)  //lombok模型
                .setRestControllerStyle(true) //restful api风格控制器
                .setControllerMappingHyphenStyle(true); //url中驼峰转连字符

        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        //执行代码的生成
        mpg.execute();
    }

}

(1)代码生成器方法二

1.依赖

        <!-- velocity 模板引擎, Mybatis Plus 代码生成器需要 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
        </dependency>

2.生成类
和方法一差不多,就是使用的模板不一样
要修改:

  • 生成的路径:gc.setOutputDir(projectPath + “/service/service_edu/src/main/java”);
  • 主键策略:gc.setIdType(IdType.ID_WORKER_STR); 主键为字符串还是数字?
  • 数据库账号和密码,数据库名字
  • 配置包pc.setModuleName(“serviceedu”); //模块名
    pc.setParent(“com.liu”);
  • 要生成的表strategy.setInclude(“edu_teacher”);//指定表名
package com.liu.serviceedu.Generator;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
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.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.Test;

/**
 * @author
 * @since 2018/12/13
 */
public class CodeGenerator {

    public static void main(String[] args) {
        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/service/service_edu/src/main/java");
        gc.setAuthor("liu");
        gc.setOpen(false); //生成后是否打开资源管理器
        gc.setFileOverride(false); //重新生成时文件是否覆盖
        gc.setServiceName("%sService");	//去掉Service接口的首字母I
        gc.setIdType(IdType.ID_WORKER_STR); //主键策略
        gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
        gc.setSwagger2(true);//开启Swagger2模式

        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/education?serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
//        com.liu.service_edu
        pc.setModuleName("serviceedu"); //模块名
        pc.setParent("com.liu");
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude("edu_teacher");//指定表名
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
        strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀

        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作

        strategy.setRestControllerStyle(true); //restful api风格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符

        mpg.setStrategy(strategy);


        // 6、执行
        mpg.execute();
    }
}

你可能感兴趣的:(JAVA,java)