日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

mybatisplus查询今天的数据_MybatisPlus(CRUD)

發(fā)布時間:2025/1/21 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatisplus查询今天的数据_MybatisPlus(CRUD) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

插入功能

//測試插入@Testpublic void testInsert(){ User user = new User(); user.setName("ironman"); user.setAge(3); user.setEmail("123456@qq.com"); System.out.println(user); System.out.println("======================"); System.out.println(userMapper.insert(user));//會自動生成id,并回填}

數(shù)據(jù)庫默認插入的id為:全局的唯一id

主鍵生成策略

分布式系統(tǒng)唯一id生成:https://www.cnblogs.com/liujianping/p/10401842.html

雪花算法:

snowflake是Twitter開源的分布式ID生成算法,結果是一個long型的ID。其核心思想是:使用41bit作為毫秒數(shù),10bit作為機器的ID(5個bit是數(shù)據(jù)中心,5個bit的機器ID),12bit作為毫秒內(nèi)的流水號(意味著每個節(jié)點在每毫秒可以產(chǎn)生 4096 個 ID),最后還有一個符號位,永遠是0。

主鍵自增

  • 實體類字段上添加@TableId(type = IdType.AUTO)

  • 數(shù)據(jù)庫字段一定得是自增

  • 這兩個條件缺一不可,否則就會報錯

  • 再次插入實現(xiàn)自增

  • 其余的源碼解釋

    public enum IdType { AUTO(0), //數(shù)據(jù)庫id自增 NONE(1), //未設置主鍵 INPUT(2), //手動輸入 ASSIGN_ID(3), ASSIGN_UUID(4), /** @deprecated */ @Deprecated ID_WORKER(3), //默認的全局唯一id /** @deprecated */ @Deprecated ID_WORKER_STR(3), //ID_WORKER字符串表示法 /** @deprecated */ @Deprecated UUID(4); //全局唯一id}

    更新操作

    //測試更新 @Test public void testUpdate(){ User user = new User(); //通過條件自動拼接動態(tài)SQL user.setId(1L); user.setName("i m ironman"); // 雖然名字是byID,但是實際上參數(shù)是一個對象 System.out.println(userMapper.updateById(user)); }

    所有的SQL都是自動的進行動態(tài)設置

    自動填充

    創(chuàng)建時間,修改時間!這些個操作一般都是自動化完成的,我們不希望手動更新。(gmt_create,gmt_modified)

    方式一:數(shù)據(jù)庫級別

  • 在表中新增字段create_time,update_time

  • 再次測試插入方法,先把實體類同步

  • private?Date?createTime;private?Date?updateTime;

    方法二:代碼級別

  • 刪除數(shù)據(jù)庫的默認值,更新操作

  • 實體類字段屬性上需要增加注釋

  • //字段添加填充內(nèi)容@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;
  • 編寫處理器處理注解

  • package com.zhang.mybatis_plus.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;import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;@Slf4j@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler { //插入是的更新策略 @Override public void insertFill(MetaObject metaObject) { log.info("start insert ......."); //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject) this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } //更新時的填充策略 @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime",new Date(),metaObject); }}
  • 測試插入

  • 樂觀鎖

    樂觀鎖:顧名思義,總是十分樂觀,總是認為不會出現(xiàn)問題,無論干什么都不去上鎖,如果出現(xiàn)了問題,再次更新測試(version ,new version)

    悲觀鎖:顧名思義,總是十分悲觀,總是認為會出現(xiàn)問題,無論干什么都會上鎖,再去操作。

    意圖:

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

    樂觀鎖實現(xiàn)方式:

    • 取出記錄時,獲取當前version

    • 更新時,帶上這個version

    • 執(zhí)行更新時, set version = newVersion where version = oldVersion

    • 如果version不對,就更新失敗

    樂觀鎖:1.先查詢,獲得版本號 version =1 ----線程Aupdate user set name = "ironman",version = version + 1 where id = 2 and version = 1 ----線程B搶先完成,這個時候version = 2,會導致A線線程修改失敗update user set name = "ironman",version = version + 1 where id = 2 and version = 1

    測試MP的樂觀鎖插件

  • 數(shù)據(jù)庫增加version字段

  • 實體類增加對應的字段

  • @Version //代表樂觀鎖注解private Integer version;
  • 注冊組件

  • package com.zhang.mybatis_plus.config;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.transaction.annotation.EnableTransactionManagement;@MapperScan("com.zhang.mybatis_plus.mapper")@EnableTransactionManagement@Configuration //配置類public class MybatisPlusConfig { //注冊樂觀鎖插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor(); }}

    測試一下

    //測試樂觀鎖成功@Testpublic void testOptimisticLocker(){ //1.查詢用戶信息 User user = userMapper.selectById(1L); //2.修改用戶信息 user.setName("zhang"); user.setEmail("123456@qq.com"); //3. 執(zhí)行更新操作 userMapper.updateById(user);}//測試樂觀鎖失敗@Testpublic void testOptimisticLocker2(){ //線程1 //1.查詢用戶信息 User user = userMapper.selectById(1L); //2.修改用戶信息 user.setName("zhang"); user.setEmail("123456@qq.com"); //線程2 //1.查詢用戶信息 User user2 = userMapper.selectById(1L); //2.修改用戶信息 user2.setName("zhangxi"); user2.setEmail("123456@qq.com"); //3. 執(zhí)行更新操作 userMapper.updateById(user2); userMapper.updateById(user);//如果沒有樂觀鎖,就會覆蓋插隊線程的值}

    查詢操作

    //測試查詢@Testpublic void testSelectById(){ /*User user = userMapper.selectById(1L); System.out.println(user);*/ //批量查詢 List users = userMapper.selectBatchIds(Arrays.asList(1,2,3)); users.forEach(System.out::println);}//測試條件查詢@Testpublic void testSelectById3(){ HashMapmap = new HashMap<>(); //自定義查詢 map.put("name","Jack"); List users = userMapper.selectByMap(map); users.forEach(System.out::println);}

    分頁查詢

  • 原始的limit分頁

  • pageHelper第三方插件

  • MP內(nèi)置的分頁插件

  • 步驟:

  • 配置攔截器組件

  • @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 設置請求的頁面大于最大頁后操作, true調(diào)回到首頁,false 繼續(xù)請求 默認false // paginationInterceptor.setOverflow(false); // 設置最大單頁限制數(shù)量,默認 500 條,-1 不受限制 // paginationInterceptor.setLimit(500); // 開啟 count 的 join 優(yōu)化,只針對部分 left join paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); return paginationInterceptor; }
  • 直接使用page對象即可

  • //測試分頁查詢@Testpublic void testPage(){ //參數(shù)1:當前頁 //參數(shù)2:頁面大小 Page page = new Page<>(1, 5); userMapper.selectPage(page,null); page.getRecords().forEach(System.out::println); System.out.println(page.getTotal());}

    刪除操作

    //測試刪除@Testpublic void testDeleteById(){ userMapper.deleteById(1287313900072681476L);}//批量刪除@Testpublic void testDeleteBatchId(){ userMapper.deleteBatchIds(Arrays.asList(1287313900072681477L,1287313900072681478L));}//map刪除@Testpublic void testDeleteMap(){ HashMapmap = new HashMap<>(); map.put("name","ironman"); userMapper.deleteByMap(map);}

    邏輯刪除

    物理刪除:從數(shù)據(jù)庫中直接移除

    邏輯刪除:在數(shù)據(jù)庫中隱藏,沒有被移除,而是通過一個變量來讓他失效!deleted =0 ==》 deleted=1

    管理員可以查看被刪除的記錄!防止數(shù)據(jù)的丟失,類似于回收站!

    測試:

  • 在數(shù)據(jù)庫字段中添加deleted字段

  • pojo實體類中增加屬性

  • @TableLogic //邏輯刪除private Integer deleted;
  • 配置

  • //注冊bean,從3.1.1后,這一步已經(jīng)不再需要@Beanpublic ISqlInjector sqlInjector(){ return new LogicSqlInjector();}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)
  • 測試刪除

  • 記錄依舊在數(shù)據(jù)庫,但是值已經(jīng)發(fā)生了變化

    總結

    以上是生活随笔為你收集整理的mybatisplus查询今天的数据_MybatisPlus(CRUD)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。