<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Mybatis-Plus學(xué)習(xí)總結(jié)(超詳細整理)

          共 33127字,需瀏覽 67分鐘

           ·

          2021-04-23 20:07

          原文鏈接: https://blog.csdn.net/Lzy410992/article/details/115750291

          MyBatis-Plus(簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生。

          基本特性

          • 無侵入:只做增強不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑

          • 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向?qū)ο蟛僮?/span>

          • 強大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強大的條件構(gòu)造器,滿足各類使用需求

          • 支持 Lambda 形式調(diào)用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯

          • 支持主鍵自動生成:支持多達 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題

          • 支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作

          • 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )

          • 內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用

          • 內(nèi)置分頁插件:基于 MyBatis 物理分頁,開發(fā)者無需關(guān)心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢

          • 分頁插件支持多種數(shù)據(jù)庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數(shù)據(jù)庫

          • 內(nèi)置性能分析插件:可輸出 Sql 語句以及其執(zhí)行時間,建議開發(fā)測試時啟用該功能,能快速揪出慢查詢

          • 內(nèi)置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預(yù)防誤操作

          快速入門

          1、創(chuàng)建數(shù)據(jù)庫 mybatis_plus

          現(xiàn)有一張 User 表,其表結(jié)構(gòu)如下:


          其對應(yīng)的數(shù)據(jù)庫 Schema 腳本,數(shù)據(jù)庫 Data 腳本如下:

          DROP TABLE IF EXISTS user;

          CREATE TABLE user
          (
           id BIGINT(20) NOT NULL COMMENT '主鍵ID',
           name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
           age INT(11) NULL DEFAULT NULL COMMENT '年齡',
           email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
           PRIMARY KEY (id)
          );
          -- 真實開發(fā)中,version(樂觀鎖),deleted(邏輯刪除)、gmt_create、gem_mo


          DELETE FROM user;

          INSERT INTO user (id, name, age, email) VALUES
          (1, 'Jone', 18, '[email protected]'),
          (2, 'Jack', 20, '[email protected]'),
          (3, 'Tom', 28, '[email protected]'),
          (4, 'Sandy', 21, '[email protected]'),
          (5, 'Billie', 24, '[email protected]');


          2、新建Maven工程


          導(dǎo)入相關(guān)依賴

          <?xml version="1.0" encoding="UTF-8"?>
          <project xmlns="http://maven.apache.org/POM/4.0.0"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
              <modelVersion>4.0.0</modelVersion>

              <parent>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-parent</artifactId>
                  <version>2.3.4.RELEASE</version>
                  <relativePath/> <!-- lookup parent from repository -->
              </parent>

              <groupId>com.ly</groupId>
              <artifactId>mybatis-plus</artifactId>
              <version>1.0-SNAPSHOT</version>
              <name>mybatis-plus</name>
              <description>Demo project for Spring Boot</description>
              
              <properties>
                  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
                  <java.version>1.8</java.version>
              </properties>

              <dependencies>

                  <!--mybatis-plus 是自己開發(fā)的,非官方的!-->
                  <dependency>
                      <groupId>com.baomidou</groupId>
                      <artifactId>mybatis-plus-boot-starter</artifactId>
                      <version>3.3.1.tmp</version>
                  </dependency>

                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-web</artifactId>
                  </dependency>

                  <dependency>
                      <groupId>mysql</groupId>
                      <artifactId>mysql-connector-java</artifactId>
                      <scope>runtime</scope>
                  </dependency>

                  <dependency>
                      <groupId>org.projectlombok</groupId>
                      <artifactId>lombok</artifactId>
                  </dependency>

                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-test</artifactId>
                      <scope>test</scope>
                      <exclusions>
                          <exclusion>
                              <groupId>org.junit.vintage</groupId>
                              <artifactId>junit-vintage-engine</artifactId>
                          </exclusion>
                      </exclusions>
                  </dependency>

              </dependencies>

              <build>
                  <plugins>
                      <plugin>
                          <groupId>org.springframework.boot</groupId>
                          <artifactId>spring-boot-maven-plugin</artifactId>
                      </plugin>
                  </plugins>
              </build>

          </project>

          說明:我們使用mybatis-plus可以節(jié)省我們大量的代碼,盡量不要同時導(dǎo)入mybatis和mybatis-plus!版本的差異!


          3、配置文件application.yml

          spring:
            #配置數(shù)據(jù)源
            datasource:
              driver-class-name: com.mysql.cj.jdbc.Driver
              url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
              username: root
              password: 123456

          #配置日志,我們所用的sql現(xiàn)在是不可見的,我們希望知道他是怎么執(zhí)行的,所以我們必須要查看日志!
          mybatis-plus:
            configuration:
              log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

          4、編寫代碼

          mybatis-plus的使用步驟:引入依賴 -> 創(chuàng)建pojo -> 實現(xiàn)dao接口(不用寫mapper.xml文件,只需要在啟動器上配置 mapper 掃描路徑即可)-> 基本使用


          編寫實體類 User.java,這里使用了Lombok插件

          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          public class User {
              private Long id;
              private String name;
              private Integer age;
              private String email;
          }

          編寫Mapper類 UserMapper.java

          //在對應(yīng)的Mapper上繼承基本的類baseMapper
          public interface UserMapper extends BaseMapper<User> {
              //所有的CRUD已經(jīng)編寫完成
              //不需要像以前的配置一些xml

          }

          新建 Spring Boot 啟動類中添加 @MapperScan 注解,掃描 Mapper 文件夾:

          @SpringBootApplication
          @MapperScan("com.ly.mapper")//掃描mapper文件夾
          public class MybatisPlusApplication {

              public static void main(String[] args) {
                  SpringApplication.run(MybatisPlusApplication.class, args);
              }

          }

          工程目錄:


          添加測試類,進行功能測試:

          @RunWith(SpringRunner.class)
          @SpringBootTest
          public class MybatisPlusTest {

              //繼承了BaseMapper,所有方法都來自父類
              //我們可以編寫自己的拓展方法
              @Autowired
              private UserMapper userMapper;

              @Test
              public void testSelect() {
                  System.out.println(("----- selectAll method test ------"));
                  //參數(shù)是一個Wrapper,條件結(jié)構(gòu)器,這里先不用 填null
                  //查詢所有的用戶 
                  List<User> userList = userMapper.selectList(null);
                  userList.forEach(System.out::println);
              }

          }

          UserMapper 中的 selectList() 方法的參數(shù)為 MP 內(nèi)置的條件封裝器 Wrapper,所以不填寫就是無任何條件


          控制臺輸出:

          實現(xiàn)CRUD

          插入操作:

          插入一條記錄: int insert(T entity);

          插入類型T:實體對象

          舉例測試:

          @Test
          public void testInsert() {

              User user = new User();
              user.setName("LY");
              user.setAge(100);
              user.setEmail("[email protected]");

              int result = userMapper.insert(user);  //幫我們生成id
              System.out.println(result);      //受影響的行數(shù)
              System.out.println(user);       //發(fā)現(xiàn)id會自動回填
          }

          運行結(jié)果:mybatis-plus實現(xiàn)了主鍵自動生成

          主鍵生成策略:

          數(shù)據(jù)庫插入的id為全局默認的id(ID_WORKER),我們需要配置主鍵自增,在實體類字段上添加注解:@TableId(type =IdType.AUTO),數(shù)據(jù)庫字段一定要是自增的。

          public enum IdType {
              AUTO(0),   //數(shù)據(jù)可id自增
              NONE(1),   //未設(shè)置主鍵
              INPUT(2),   //手動輸入
              ID_WORKER(3), //默認的全局唯一id
              UUID(4),  //全局唯一id uuid
              ID_WORKER_STR(5); // ID_WORKEK 字符串表示法

              private int key;

              private IdType(int key) {
                  this.key = key;
              }

              public int getKey() {
                  return this.key;
              }
          }

          添加過注解,并將數(shù)據(jù)庫id字段設(shè)置為自增后,測試插入數(shù)據(jù):


          雪花算法:

          SnowFlake 算法,是 Twitter 開源的分布式 id 生成算法。其核心思想就是:使用一個 64 bit 的 long 型的數(shù)字作為全局唯一 id。在分布式系統(tǒng)中的應(yīng)用十分廣泛,且ID 引入了時間戳,基本上保持自增的。

          這 64 個 bit 中,其中 1 個 bit 是不用的,然后用其中的 41 bit 作為毫秒數(shù),用 10 bit 作為工作機器 id,12 bit 作為序列號。


          更新操作

          // 根據(jù) whereEntity 條件,更新記錄
          int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
          // 根據(jù) ID 修改
          int updateById(@Param(Constants.ENTITY) T entity);


          #參數(shù)說明
          類型     參數(shù)名         描述
          T     entity         實體對象 (set 條件值,可為 null)
          Wrapper updateWrapper 實體對象封裝操作類(可以為 null,里面的 entity 用于生成 where 語句)

          舉例測試:

          @Test
          public void testUpdate() {
              //sql自動動態(tài)配置
              User user = new User();
              user.setName=("ZZ");
              user.setId(3L);
              user.setAge("50");
              
              //注意:updateById的參數(shù)是一個對象
              userMapper.updateById(user);
          }

          運行結(jié)果:


          自動填充

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


          阿里巴巴開發(fā)手冊:所有的數(shù)據(jù)庫表:gmt_create\gmt_modified幾乎所有的表都要配置上!而且需要自動化


          方式一:數(shù)據(jù)庫級別 (工作中不允許)

          在表中新增字段 create_time 、update_time,設(shè)為默認CURRENT_TIMESIAMP


          方式二:代碼級別

          在表中新增字段 create_time 、update_time:


          實體類上的屬性需要增加注解 @TableField

          @Data
          @AllArgsConstructor
          @NoArgsConstructor
          public class User {
              @TableId(type = IdType.AUTO)
              private Long id;
              private String name;
              private Integer age;
              private String email;
              
           //創(chuàng)建時間,插入數(shù)據(jù)時操作
           @TableField(fill = FieldFill.INSERT)
           private Date createTime; 
           //更新時間,插入和更新是操作
           @TableField(fill = FieldFill.INSERT_UPDATE)
           private Date updateTime;
          }

          編寫處理器來處理這個注釋:

          @Slf4j
          @Component //不要忘記吧處理器加到IOC容器中
          public class MyMetaObjectHandler implements MetaObjectHandler {

              //插入時候的填充策略
              @Override
              public void insertFill(MetaObject metaObject) {
                  log.info("start insert fill ....");  //日志
                  //設(shè)置字段的值(String fieldName字段名,Object fieldVal要傳遞的值,MetaObject metaObject)
                  this.setFieldValByName("createTime",new Date(),metaObject);
                  this.setFieldValByName("updateTime",new Date(),metaObject);
                  
              }

              //更新時間的填充策略
              @Override
              public void updateFill(MetaObject metaObject) {
                  log.info("start update fill ....");
                  this.setFieldValByName("updateTime",new Date(),metaObject);
                  
              }
          }

          測試插入一條數(shù)據(jù):

          數(shù)據(jù)庫中的數(shù)據(jù):


          樂觀鎖

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


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


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

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

          • 更新時,帶上這個version

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

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

          樂觀鎖:1、先查詢,獲得版本號 version=1
          --A
          update user set name ="shuishui" ,version =version+1
          where id =2 and version=1

          --B 如果線程搶先完成,這個時候version=2,會導(dǎo)致A修改失敗
          update user set name ="shuishui" ,version =version+1
          where id =2 and version=1

          測試樂觀鎖:

          1、表中創(chuàng)建樂觀鎖字段version 默認值為1

          2、同步實體類

          @Version //樂觀鎖Version注解
          private Integer version;

          3、注冊組件 (config包下)

          @EnableTransactionManagement
          @MapperScan("com.ly.mapper")
          @Configuration//配置類
          public class MyBatisPlusConfig{
              //注冊樂觀鎖插件
              @Bean
           public OptimisticLockerInterceptor optimisticLockerInterceptor() {
               return new OptimisticLockerInterceptor();
           }
          }

          測試樂觀鎖成功:

          //測試樂觀鎖成功
          @Test
          public void testOptimisticLocker(){
              //1、查詢用戶信息
              User user = userMapper.selectById(1L);
              //2、修改用戶信息
              user.setName("LZY");
              user.setEmail("[email protected]");
              //執(zhí)行更新操作
              userMapper.updateById(user);
          }


          模擬樂觀鎖失敗:

          //測試樂觀鎖失敗
          @Test
          public void testOptimisticLocker2(){
              //1、查詢用戶信息
              User user = userMapper.selectById(1L);
              //2、修改用戶信息
              user.setName("LZY1");
              user.setEmail("[email protected]");

              //1、模擬另一個線程執(zhí)行了插隊操作
              User user2 = userMapper.selectById(1L);
              //2、修改用戶信息
              user2.setName("LZY2");
              user2.setEmail("[email protected]");

              //執(zhí)行更新操作
              userMapper.updateById(user2);

              //執(zhí)行更新操作
              userMapper.updateById(user); //如果沒有樂觀鎖就會覆蓋插隊線程的值
          }


          查詢操作

          根據(jù) ID 查詢:T selectById(Serializable id);

          根據(jù) entity 條件,查詢一條記錄:T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);

          查詢(根據(jù)ID 批量查詢):List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

          根據(jù) entity 條件,查詢?nèi)坑涗洠?/span>List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);

          查詢(根據(jù) columnMap 條件):List selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

          根據(jù) Wrapper 條件,查詢?nèi)坑涗洠?/span>List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper);

          根據(jù) Wrapper 條件,查詢?nèi)坑涗洝W⒁猓?/span>只返回第一個字段的值:List selectObjs(@Param(Constants.WRAPPER) Wrapper queryWrapper);

          根據(jù) entity 條件,查詢?nèi)坑涗洠ú⒎摚?/span>IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

          根據(jù) Wrapper 條件,查詢?nèi)坑涗洠ú⒎摚?/span>IPage<Map<String, Object>> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

          根據(jù) Wrapper 條件,查詢總記錄數(shù):Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);


          參數(shù)類型說明:

          • Serializable:主鍵ID

          • Wrapper :實體對象封裝操作類(可以為 null)

          • Collection<? extends Serializable>:主鍵ID列表(不能為 null 以及 empty)

          • Map<String, Object>:表字段 map 對象

          • IPage:分頁查詢條件(可以為 RowBounds.DEFAULT)

          實例測試:

          @Test
          public void testSelectById(){
              User user =userMapper.selectById(1);
              System.out.println(user);
          }

          //測試批量查詢
          @Test
          public void testSelectByBatchId(){
              List<User> users =userMapper.selectBatchIds(Arrays.asList(1,2,3));
              users.forEach(System.out::println);
          }

          //條件查詢
          public void testSelectByBatchIds(){
              HashMap<String,Object> map=new HashMap<>();
              //自定義查詢
              map.put("name","LZY");
              map.put("age",18);

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

          分頁查詢

          Mybatis-Plus中內(nèi)置了分頁插件,配置攔截器組件即可:

          @EnableTransactionManagement
          @Configuration
          @MapperScan("com.ly.mapper")
          public class MybatisPlusConfig {

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

          測試分頁:

          //測試分頁查詢
          @Test
          public void testPage(){
              // 參數(shù)一:當前頁
              // 參數(shù)二:頁面大小
              // 使用了分頁插件之后,所有的分頁操作也變得簡單了
              Page<User> page =new Page<>(2,5);
              userMapper.selectPage(page,null);

              page.getRecords().forEach(System.out::println);
              //獲取總數(shù)
              page.getTotal();
          }

          刪除操作

          根據(jù) entity 條件,刪除記錄:int delete(@Param(Constants.WRAPPER) Wrapper wrapper);

          刪除(根據(jù)ID 批量刪除):int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

          根據(jù) ID 刪除:int deleteById(Serializable id);

          根據(jù) columnMap 條件,刪除記錄:int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

          參數(shù)類型說明:

          • Wrapper:實體對象封裝操作類(可以為 null)

          • Collection<? extends Serializable>:主鍵ID列表(不能為 null 以及 empty)

          • Serializable:主鍵ID

          • Map<String, Object>:表字段 map 對象

          測試刪除:

          @Test
          public void testDeleteById(){
              userMapper.deleteById(1);
          }

          //批量刪除
          @Test
          public void testDeleteBatchId(){
              userMapper.deleteBatchIds(Arrays.asList(1,2));
          }

          //條件刪除
          @Test
          public void testDeleteMap(){
              HashMap<String,Object> map = new HashMap<>();
              map.put("name","LZY");
              userMapper.deleteByMap(map);
          }

          邏輯刪除

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


          邏輯刪除:方便數(shù)據(jù)恢復(fù)和保護數(shù)據(jù)本身價值的一種方案,在數(shù)據(jù)庫中沒有被移出,而是通過一個變量來讓他失效!deleted=0 ==>deleted =1(失效)


          在數(shù)據(jù)庫中增加deleted字段:

          實體類中增加屬性,并添加@TableLogic注解:

          @TableLogic  //3.1.1開始可以不用這一步,但如果實體類上有 @TableLogic 則以實體上的為準,忽略全局
          private Integer deleted;

          application.yml 加入配置:

          mybatis-plus:
            global-config:
              db-config:
                logic-delete-field: flag  #全局邏輯刪除字段值 3.3.0開始支持,詳情看下面。
                logic-delete-value: 1     # 邏輯已刪除值(默認為 1)
                logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)

          效果: 使用mp自帶方法刪除和查找都會附帶邏輯刪除功能 (自己寫的xml不會)

          條件構(gòu)造器Wrapper

          1.查詢name不為null的用戶,并且郵箱不為null的永不,年齡大于等于35的用戶

          @Test
          public void findByAgeLessThan(){
              // 查詢name不為null的用戶,并且郵箱不為null的永不,年齡大于等于35的用戶
              QueryWrapper<User> wrapper =new QueryWrapper<>();
              wrapper.isNotNull("name");
              wrapper.isNotNull("email");
              wrapper.ge("age",35);
              userMapper.selectList(wrapper).forEach(System.out::println);
          }

          執(zhí)行結(jié)果:


          2.查詢name為LY的用戶

          @Test
          public void findByName(){
              // 查詢name為LZY的用戶
              QueryWrapper<User> wrapper =new QueryWrapper<>();
              wrapper.eq("name","LY");
              User user=userMapper.selectOne(wrapper);
              System.out.println(user);
          }

          執(zhí)行結(jié)果:

          3.查詢年齡在10~30歲之間的用戶

          @Test
          public void findByAgeBetween(){
              // 查詢年齡在10~30歲之間的用戶
              QueryWrapper<User> wrapper =new QueryWrapper<>();
              wrapper.between("age",10,30);
              Integer count =userMapper.selectCount(wrapper);//查詢結(jié)果數(shù)
              System.out.println(count);
          }

          執(zhí)行結(jié)果:


          4.測試模糊查詢

          //模糊查詢
          @Test
          public void findByLink(){
              QueryWrapper<User> wrapper =new QueryWrapper<>();

              wrapper.notLike("name","Z");//相當于NOT LIKE '%Z%'
              wrapper.likeLeft("email","@qq.com");//相當于LIKE '%@qq.com'
              List<Map<String,Object>> maps =userMapper.selectMaps(wrapper);//查詢結(jié)果數(shù)
              maps.forEach(System.out::println);
          }

          測試結(jié)果:


          5.測試子查詢

          @Test
          public void findById() {
              QueryWrapper<User> wrapper = new QueryWrapper<>();
              //子查詢
              wrapper.inSql("id""select id from user where id<5");
              List<Object> objects = userMapper.selectObjs(wrapper);
              objects.forEach(System.out::println);
          }

          測試結(jié)果:


          6.通過id進行排序

          @Test
          public void findByIdOrderByIdAsc(){
              QueryWrapper<User> wrapper =new QueryWrapper<>();
              //通過id進行排序
              wrapper.orderByAsc("id");
              List<User> users =userMapper.selectList(wrapper);
              users.forEach(System.out::println);
          }

          執(zhí)行結(jié)果:


          代碼自動生成器

          AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各個模塊的代碼,極大的提升了開發(fā)效率。


          基本使用:

          新建一個springboot工程:

          在pom.xml中添加相關(guān)依賴:

          <!--在之前pom.xml文件的基礎(chǔ)上添加-->
          <!--代碼生成器依賴.3.0.3以后需要添加該依賴-->
          <dependency>
              <groupId>com.baomidou</groupId>
              <artifactId>mybatis-plus-generator</artifactId>
              <version>3.3.1</version>
          </dependency>
          <!--默認的模板引擎velocity-->
          <dependency>
              <groupId>org.apache.velocity</groupId>
              <artifactId>velocity-engine-core</artifactId>
              <version>2.3</version>
          </dependency>

          編寫yml文件,直接使用之前的即可:

          spring:
            #配置數(shù)據(jù)源
            datasource:
              driver-class-name: com.mysql.cj.jdbc.Driver
              url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
              username: root
              password: 123456
            #設(shè)置開發(fā)環(huán)境
            profiles:
              active: dev
          #配置日志,我們所用的sql現(xiàn)在是不可見的,我們希望知道他是怎么執(zhí)行的,所以我們必須要查看日志!
          mybatis-plus:
            configuration:
              log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
            global-config:
              db-config:
                logic-delete-field: flag  # 全局邏輯刪除的實體字段名(since 3.3.0,配置后可以忽略不配置步驟2)
                logic-delete-value: 1 # 邏輯已刪除值(默認為 1)
                logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)
          server:
            port: 8010

          編寫代碼生成器:

          /**
           * @Author: Ly
           * @Date: 2021-04-16 09:06
           */
          import com.baomidou.mybatisplus.annotation.DbType;
          import com.baomidou.mybatisplus.annotation.FieldFill;
          import com.baomidou.mybatisplus.annotation.IdType;

          import com.baomidou.mybatisplus.generator.AutoGenerator;
          import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
          import com.baomidou.mybatisplus.generator.config.GlobalConfig;
          import com.baomidou.mybatisplus.generator.config.PackageConfig;
          import com.baomidou.mybatisplus.generator.config.StrategyConfig;
          import com.baomidou.mybatisplus.generator.config.po.TableFill;
          import com.baomidou.mybatisplus.generator.config.rules.DateType;
          import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
          import java.util.ArrayList;

          // 代碼自動生成器
          public class MyBatisPlusGenerator {
              public static void main(String[] args) {
                  // 需要構(gòu)建一個 代碼自動生成器 對象
                  AutoGenerator mpg = new AutoGenerator();
                  // 配置策略
                  // 1、全局配置
                  GlobalConfig gc = new GlobalConfig();
                  //獲取當前項目路徑
                  String projectPath = System.getProperty("user.dir");
                  gc.setOutputDir(projectPath+"/src/main/java");
                  gc.setAuthor("龍源lll");
                  gc.setOpen(false);
                  gc.setFileOverride(false);  // 是否覆蓋
                  gc.setServiceName("%sService"); // 去Service的I前綴
                  gc.setIdType(IdType.AUTO);
                  gc.setDateType(DateType.ONLY_DATE);
                  gc.setSwagger2(true);
                  mpg.setGlobalConfig(gc);

                  //2、設(shè)置數(shù)據(jù)源
                  DataSourceConfig dsc = new DataSourceConfig();
                  dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
                  dsc.setDriverName("com.mysql.cj.jdbc.Driver");
                  dsc.setUsername("root");
                  dsc.setPassword("520992");
                  dsc.setDbType(DbType.MYSQL);
                  mpg.setDataSource(dsc);

                  //3、包的配置
                  PackageConfig pc = new PackageConfig();
                  pc.setModuleName("blog");
                  pc.setParent("com.ly");
                  pc.setEntity("entity");
                  pc.setMapper("mapper");
                  pc.setService("service");
                  pc.setController("controller");
                  mpg.setPackageInfo(pc);

                  //4、策略配置
                  StrategyConfig strategy = new StrategyConfig();
                  //strategy.setInclude("table1","table2",...); // 設(shè)置要映射的表名
                  strategy.setInclude("user"); // 設(shè)置要映射的表名
                  strategy.setNaming(NamingStrategy.underline_to_camel);
                  strategy.setColumnNaming(NamingStrategy.underline_to_camel);
                  // 自動lombok
                  strategy.setEntityLombokModel(true);
                  strategy.setLogicDeleteFieldName("deleted");
                  // 自動填充配置
                  TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
                  TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
                  ArrayList<TableFill> tableFills = new ArrayList<>();
                  tableFills.add(gmtCreate);
                  tableFills.add(gmtModified);
                  strategy.setTableFillList(tableFills);
                  // 樂觀鎖
                  strategy.setVersionFieldName("version");
                  strategy.setRestControllerStyle(true);
                  strategy.setControllerMappingHyphenStyle(true);
                  // localhost:8080/hello_id_2
                  mpg.setStrategy(strategy);
                  mpg.execute();
                  //執(zhí)行
              }
          }

          運行后的效果圖:



          Shiro + JWT + Spring Boot Restful 簡易教程
          吊炸天的 Docker 圖形化工具:Portainer,必須推薦給你!
          請謹慎使用Arrays.asList、ArrayList的subList
          19張圖帶你梳理SpringCloud體系中的重要技術(shù)點!
          Spring Boot 整合 Spring Security 實戰(zhàn)!
          Java + Vue 實現(xiàn)的在線考試系統(tǒng)
          日志采集系統(tǒng)都用到哪些技術(shù)?
          點擊閱讀全文前往微服務(wù)電商教程
          瀏覽 67
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲伊人大香蕉 | 天天视频国产 | 亚洲最大的成人 | 日本亚洲免费在线视频 | 亚洲久久久 |