1. 程式人生 > 遊戲 >《質量效應》三部曲總監確認開發“全新科幻世界”

《質量效應》三部曲總監確認開發“全新科幻世界”

快速開始

  • 官方文件
  • 匯入相關依賴
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

最好不要和 mybatis 的依賴一起引入,防止報錯

  • 配置資料庫
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db2?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8
    # mysql8 之前是不需要設定時區的
    username: root
    password: 123456
  • 不需要再寫xml檔案做mapper映射了

    • 現在只需要
      1. pojo類
      2. mapper類 extends BaseMapper<對應泛型>
  • 要在MybatisPlusConfig類上配置掃描包的mapper

@MapperScan("com.example.demo3.mapper") //掃描mapper資料夾

配置日誌

  • 所有的sql現在是不可見的,如果要看它是怎麼執行的,就需要看日誌
# 配置日誌
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

CRUD擴充套件

資料庫插入id的預設值

  • 雪花演算法---預設生成全域性唯一的id

    預設 ID_WORKER 全域性唯一id

    雪花演算法是Twitter開源的分散式ID演算法,用於生成唯一的Long型id

  • 如果需要配置主鍵自增

  1. 實體類欄位上 @TableId(type = IdType.AUTO)
  2. 資料庫欄位也要設定成自增,不然會報錯

自動填充

  • 建立時間、修改時間都是自動化完成的,不希望手動建立
  • 阿里巴巴開發手冊:所有的資料庫都需要包含表:gmt_create、gmt_modified,而且需要自動化
  1. 方式一:資料庫級別(工作中不允許你更改資料庫)
  • 在表中新增欄位 create_time,update_time
  • 建立資料庫的時候預設設定為 CURRENT_TIMESTAMP
  • 在進行插入操作、更新操作的時候會自動更新這兩個欄位
  1. 方式二:程式碼級別
  • 不設定預設值和更新
  • 需要自己編寫填充邏輯(mybatis-plus官方文件有提供)
  • 在實體類欄位上加上註解 @TableField(fill = FieldFIll.INSERT) 在插入的時候填充
  • @TableField(fill = FieldFIll.UPDATE) 在更新的時候填充

樂觀鎖、悲觀鎖

  • 面試過程中進場被提起

  • 樂觀鎖:總是認為不會出現問題,無論幹什麼都不上鎖,出了問題再更新值測試

  • 悲觀鎖:總是認為會出現問題,無論幹什麼都上鎖,之後再去操作

  • 樂觀鎖實現方式:

    • 取出記錄的時候,獲取當前version
    • 更新時帶上這個version
    • 執行更新時,set version = newVersion where version = oldVersion
    • 如果version不對,酒更新失敗
樂觀鎖:1、先查詢、獲得版本號 version = 1
-- 執行緒A
update user set name = "kuangshen",version = version + 1
where id = 2 and version = 1

-- 執行緒B 搶先完成,version = 2,會導致 A 修改失敗
update user set name = "kuangshen",version = version + 1
where id = 2 and version = 1

實現樂觀鎖

  1. 新增version欄位,預設值為1
  2. 對應實體類新增version
  3. @Version註解,代表這個欄位是一個樂觀鎖
  4. 註冊元件
    1. 寫一個config,如MybatisPlusConfig
    2. @Configuration宣告為配置類
    3. @EnableTransactionManagement事務管理輔助
    4. 在config類中配置樂觀鎖外掛
@MapperScan("com.example.demo3.mapper") //掃描mapper資料夾
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {

    //註冊樂觀鎖外掛
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

查詢操作

  • 例子
public void selectOne(){
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }

    //多id查詢
    public void selectByBatchId(){
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        users.forEach(System.out::println);
    }

    //map查詢,複雜的一般用Wrapper封裝而不是map
    public void testSelect(){
        HashMap<String, Object> map = new HashMap<>();

        map.put("name","zhangsan");
        map.put("age",3);

        List<User> users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }

分頁查詢

  1. 配置攔截器元件 (config檔案中)
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
    return interceptor;
}

@Bean
public ConfigurationCustomizer configurationCustomizer() {
    return configuration -> configuration.setUseDeprecatedExecutor(false);
}
  1. 接受前端引數、分頁查詢
public Page testPage(int pageNum,int pageSize){
    Page page = userMapper.selectPage(new Page(pageNum, pageSize), null);
    return page;
}

刪除

  • 與查詢類似

邏輯刪除

  • 邏輯刪除是為了方便資料恢復和保護資料本身價值等等的一種方案,但實際就是刪除。
  • 如果你需要頻繁查出來看就不應使用邏輯刪除,而是以一個狀態去表示。

物理刪除:從資料庫中直接移除

邏輯刪除:資料庫中不移除,而是通過一個變數來讓該資料失效 delete 0 -> 1

  • 類似於回收站

  • 使用方式

  1. 資料庫中增加 delete 欄位
  2. 實體類中新增響應屬性並加上註解
@TableLogic
private Integer delete;
  1. 配置yml檔案
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)
  • 應用邏輯刪除過後刪除就相當於更新 delete = 1
  • 之後查詢的時候會自動過濾被邏輯刪除的欄位,但依然儲存在資料庫中

效能分析外掛

  • 用於檢測慢sql的存在
  • 已經被移除了,建議使用第三方外掛進行sql列印

條件構造器

//Wrapper查詢的一些運用
public void WrapperTest1(){
    //查詢名字不為空
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.isNotNull("name")   //name 不為空
        .isNotNull("email") //email 不為空
        .ge("age",12);  //年齡 ge 12
    userMapper.selectList(wrapper).forEach(System.out::println);
}

public void WrapperTest2(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("name","zhang");
    System.out.println(userMapper.selectOne(wrapper));
}

//20 ~ 30 之間的人數查詢
public void WrapperTest3() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.between("age",20,30);

    userMapper.selectCount(wrapper);
}

//模糊查詢
public void WrapperTest4(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.like("name","zhang")
        .likeRight("email","t")     //t開頭的查詢
        .likeLeft("email","com");   //com結尾的查詢

    userMapper.selectList(wrapper).forEach(System.out::println);
}

//sql語句子查詢
public void WrapperTest5(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.inSql("id","select id from user where id < 3");

    userMapper.selectObjs(wrapper).forEach(System.out::println);
}

//通過id進行排序
public void WrapperTest6(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.orderByDesc("id");

    userMapper.selectList(wrapper).forEach(System.out::println);
}

程式碼自動生成器

  • 新增依賴
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.0</version>
</dependency>