MybatisPlus快速入手-----逆向工程

public class getCode {
    @Test
    public void main1() {
       // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();
        // 2、全局配置
       GlobalConfig gc = new GlobalConfig();
      String projectPath = System.getProperty("user.dir");
        System.out.println(projectPath);
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("atguigu");
        gc.setOpen(false); //生成后是否打开资源管理器
        gc.setFileOverride(false); //重新生成时文件是否覆盖
        /*
         * mp生成service层代码,默认接口名称第一个字母有 I
         * UcenterService
         * */
        gc.setServiceName("%sService"); //去掉Service接口的首字母I
        gc.setIdType(IdType.ID_WORKER); //主键策略
        gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
        gc.setSwagger2(true);//开启Swagger2模式
        mpg.setGlobalConfig(gc);
        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/guli?serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
       dsc.setPassword("root");
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);
     // 4、包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("serviceedu"); //模块名
        pc.setParent("com.atguigu");
        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();
    }
}
SQL性能分析插件:

/**
     * SQL 执行性能分析插件
     * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
     */
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {
    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
    performanceInterceptor.setMaxTime(1000);//ms,超过此处设置的ms则sql不执行
    performanceInterceptor.setFormat(true);
    return performanceInterceptor;
}
逻辑删除插件:

/**
      * 逻辑删除插件
      */
@Bean
public ISqlInjector sqlInjector() {
   return new LogicSqlInjector();
}

跨域配置
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域 。前后端分离开发中,需要考虑ajax跨域的问题。
这里我们可以从服务端解决这个问题

在Controller类上添加注解:@CrossOrigin //跨域



主键策略
(1)ID_WORKER
MyBatis-Plus默认的主键策略是:ID_WORKER  全局唯一ID
参考资料:分布式系统唯一ID生成方案汇总:https://www.cnblogs.com/haoxinyue/p/5208136.html
2)自增策略

    要想主键自增需要配置如下主键策略
        需要在创建数据表的时候设置主键自增
        实体字段中配置 @TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private Long id;
要想影响所有实体的配置,可以设置全局主键配置
#全局设置主键生成策略

mybatis-plus.global-config.db-config.id-type=auto

自动填充
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。
我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:

(1)数据库表中添加自动填充字段
在User表中添加datetime类型的新的字段 create_time、update_time

(2)实体上添加注解

@Data
public class User {
   ......

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    //@TableField(fill = FieldFill.UPDATE)

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;


}

实现元对象处理器接口

@Component

public class MyMetaObjectHandler implements MetaObjectHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);

    @Override
    public void insertFill(MetaObject metaObject) {
        LOGGER.info("start insert fill ....");
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        LOGGER.info("start update fill ....");
        this.setFieldValByName("updateTime", new Date(), metaObject);

    }
}

乐观锁
主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

乐观锁实现方式:

    取出记录时,获取当前version
    更新时,带上这个version
    执行更新时, set version = newVersion where version = oldVersion
    如果version不对,就更新失败

    实体类添加version字段

    并添加 @Version 注解


    @Version
    @TableField(fill = FieldFill.INSERT) 
    private Integer version;

    元对象处理器接口添加version的insert默认值

    @Override
    public void insertFill(MetaObject metaObject) {
        ......
        this.setFieldValByName("version", 1, metaObject);
    }

    特别说明:
        支持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime
        整数类型下 newVersion = oldVersion + 1
        newVersion 会回写到 entity 中
        仅支持 updateById(id) 与 update(entity, wrapper) 方法
        在 update(entity, wrapper) 方法下, wrapper 不能复用!!!

 我的另一个博客网站(隔壁老郭):http://gtnotgod.xyz/index.php/article/48.html

posted on 2020-08-09 22:31  白嫖老郭  阅读(283)  评论(0编辑  收藏  举报

导航