《質量效應》三部曲總監確認開發“全新科幻世界”
阿新 • • 發佈:2022-03-22
快速開始
- 官方文件
- 匯入相關依賴
<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映射了
- 現在只需要
- pojo類
- 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
-
如果需要配置主鍵自增
- 實體類欄位上
@TableId(type = IdType.AUTO)
- 資料庫欄位也要設定成自增,不然會報錯
自動填充
- 建立時間、修改時間都是自動化完成的,不希望手動建立
- 阿里巴巴開發手冊:所有的資料庫都需要包含表:gmt_create、gmt_modified,而且需要自動化
- 方式一:資料庫級別(工作中不允許你更改資料庫)
- 在表中新增欄位 create_time,update_time
- 建立資料庫的時候預設設定為 CURRENT_TIMESTAMP
- 在進行插入操作、更新操作的時候會自動更新這兩個欄位
- 方式二:程式碼級別
- 不設定預設值和更新
- 需要自己編寫填充邏輯(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
實現樂觀鎖
- 新增version欄位,預設值為1
- 對應實體類新增version
- @Version註解,代表這個欄位是一個樂觀鎖
- 註冊元件
- 寫一個config,如MybatisPlusConfig
- @Configuration宣告為配置類
- @EnableTransactionManagement事務管理輔助
- 在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);
}
分頁查詢
- 配置攔截器元件 (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);
}
- 接受前端引數、分頁查詢
public Page testPage(int pageNum,int pageSize){
Page page = userMapper.selectPage(new Page(pageNum, pageSize), null);
return page;
}
刪除
- 與查詢類似
邏輯刪除
- 邏輯刪除是為了方便資料恢復和保護資料本身價值等等的一種方案,但實際就是刪除。
- 如果你需要頻繁查出來看就不應使用邏輯刪除,而是以一個狀態去表示。
物理刪除:從資料庫中直接移除
邏輯刪除:資料庫中不移除,而是通過一個變數來讓該資料失效 delete 0 -> 1
-
類似於回收站
-
使用方式
- 資料庫中增加 delete 欄位
- 實體類中新增響應屬性並加上註解
@TableLogic
private Integer delete;
- 配置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列印
條件構造器
- 可以替代一些複雜的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>