1. 程式人生 > 其它 >vue使用百度地圖vue-bmap-gl

vue使用百度地圖vue-bmap-gl

MybatisPlus

官方文件很詳細!
MybatisPlus官方文件:https://baomidou.com

主鍵生成策略

分散式系統唯一ID生成:https://zhuanlan.zhihu.com/p/107939861

雪花演算法

snowflake是Twitter開源的分散式ID生成演算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數,10bit作為機器的ID(5個bit是資料中心,5個bit的機器ID),12bit作為毫秒內的流水號(意味著每個節點在每毫秒可以產生 4096 個 ID),最後還有一個符號位,永遠是0。具體實現的程式碼可以參看https://github.com/twitter/snowflake。

主鍵自增

  1. 實體類欄位上添加註解 @TableId(type = IdType.AUTO)
  2. 資料庫對應欄位必須設定自增

自動填充

  1. 註解填充欄位 @TableField(.. fill = FieldFill.INSERT)

    // 欄位新增填充
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    
    @TableField(fill = FieldFill.UPDATE)
    private Date updateTime;
    
  2. 自定義實現類 MyMetaObjectHandler 進行策略修改

    package com.test.handler;
    
    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.ibatis.reflection.MetaObject;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    
    @Slf4j
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            log.info("插入填充");
            this.setFieldValByName("createTime",new Date(),metaObject);
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            log.info("更新填充");
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    }
    
    

樂觀鎖外掛

當要更新一條記錄的時候,希望這條記錄沒有被別人更新

樂觀鎖實現方式:

  • 取出記錄時,獲取當前 version
  • 更新時,帶上這個 version
  • 執行更新時, set version = newVersion where version = oldVersion
  • 如果 version 不對,就更新失敗
  1. 資料表增加version欄位

  2. 對應實體類新增欄位

    @Version  // 樂觀鎖註解
    private Integer version;
    
  3. 註冊元件

    package com.test.config;
    
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @EnableTransactionManagement  // 自動管理事務
    @MapperScan("com.test.mapper")
    @Configuration
    public class MybatisPlusConfig {
        // 註冊樂觀鎖外掛
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
            mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
            return mybatisPlusInterceptor;
        }
    }
    
  4. 測試

    @Test
    void testVersion(){
       // 執行緒1
       User user = userMapper.selectById(1L);
       user.setName("niu");
       user.setEmail("3123131");
    
       // 執行緒2 插隊
       User user2 = userMapper.selectById(1L);
       user2.setName("yah");
       user2.setEmail("yes");
       userMapper.updateById(user2);
    
       // 自旋鎖多次嘗試提交
       userMapper.updateById(user);  // 如果沒有樂觀鎖,執行緒1就會執行成功覆蓋執行緒2的值
    }
    

分頁外掛

  1. 配置攔截器元件

    // 分頁外掛
    @Bean
    public MybatisPlusInterceptor Interceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
        return interceptor;
    }
    
  2. 測試

    	// 查詢
    	@Test
    	void selectUser(){
    		User user = userMapper.selectById(1L);
    		System.out.println(user);
    		List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
    		users.forEach(System.out::println);
    
    		// 條件查詢 Map
    		HashMap<String, Object> map = new HashMap<>();
    
    		// 自定義 查詢條件
    		map.put("name","JOJO");
    
    		List<User> list = userMapper.selectByMap(map);
    		list.forEach(System.out::println);
    	}
    
    	// 分頁查詢
    	@Test
    	void selectPage(){
    		/**
    		 * 引數1:當前頁  引數2:頁面大小
    		 */
    		Page<User> page = new Page<>(1,5);
    		userMapper.selectPage(page,null);
    
    		System.out.println(page.getTotal());
    		page.getRecords().forEach(System.out::println);
    	}
    

邏輯刪除

  1. 資料表中增加deleted刪除標記欄位

  2. 對應實體類新增欄位

    @TableLogic  // 刪除標記註解
    private Integer deleted;
    
  3. 配置檔案

    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: flag # 全域性邏輯刪除的實體欄位名(since 3.3.0,配置後可以忽略不配置步驟2)
          logic-delete-value: 1 # 邏輯已刪除值(預設為 1)
          logic-not-delete-value: 0 # 邏輯未刪除值(預設為 0)
    

邏輯刪除實際上就是修改表中刪除標記的欄位值

條件構造器

@Test
void contextLoads() {
   // 查詢 name email 不為空 , age > 5
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
            .isNotNull("name")
            .isNotNull("email")
            .ge("age",4);
    userMapper.selectList(queryWrapper).forEach(System.out::println);
}
@Test
void Test() {
    // 查詢 name 為 Tom
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name","Tom");
    System.out.println(userMapper.selectOne(queryWrapper));
}
@Test
void Test1() {
    // 查詢 10 < age < 25 的人數
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.between("age",10,25);
    userMapper.selectList(queryWrapper).forEach(System.out::println);
    System.out.println(userMapper.selectCount(queryWrapper));
}
@Test
void Test2() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
            // 萬用字元在左右   %e%
            .notLike("name","e")
            // 萬用字元在右    t%
            .likeRight("email","t");

    List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
    maps.forEach(System.out::println);
}
@Test
void Test3() {
    // 查詢 name 不包含 e , email 以 e 開頭
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // id 子查詢
    // 相當於
    // SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND (id IN (select id from user where id < 3))
    queryWrapper.inSql("id","select id from user where id < 3");

    List<Object> objects = userMapper.selectObjs(queryWrapper);
    objects.forEach(System.out::println);
}
@Test
void Test4() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    // 通過 id 進行降序排序
    queryWrapper.orderByDesc("id");
    userMapper.selectList(queryWrapper).forEach(System.out::println);
}

程式碼生成器

  1. 引入依賴

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.5.2</version>
    </dependency>
    
  2. 快速生成

    FastAutoGenerator.create("url", "username", "password")
        .globalConfig(builder -> {
            builder.author("baomidou") // 設定作者
                .enableSwagger() // 開啟 swagger 模式
                .fileOverride() // 覆蓋已生成檔案
                .outputDir("D://"); // 指定輸出目錄
        })
        .packageConfig(builder -> {
            builder.parent("com.baomidou.mybatisplus.samples.generator") // 設定父包名
                .moduleName("system") // 設定父包模組名
                .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")); // 設定mapperXml生成路徑
        })
        .strategyConfig(builder -> {
            builder.addInclude("t_simple") // 設定需要生成的表名
                .addTablePrefix("t_", "c_"); // 設定過濾表字首
        })
        .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,預設的是Velocity引擎模板
        .execute();