1. 程式人生 > 實用技巧 >MybatisPlus快速入手-----逆向工程

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