<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      MyBatis-Plus入門教程及基本API使用案例

      一、MyBatisPlus簡介

      1. 入門案例

      問題導(dǎo)入

      MyBatisPlus環(huán)境搭建的步驟?

      1.1 SpringBoot整合MyBatisPlus入門程序

      ①:創(chuàng)建新模塊,選擇Spring初始化,并配置模塊相關(guān)基礎(chǔ)信息
      ②:選擇當(dāng)前模塊需要使用的技術(shù)集(僅保留JDBC)

      ③:手動添加MyBatisPlus起步依賴
      <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-boot-starter</artifactId>
          <version>3.4.1</version>
      </dependency>
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.1.16</version>
      </dependency>
      

      注意事項1:由于mp并未被收錄到idea的系統(tǒng)內(nèi)置配置,無法直接選擇加入

      注意事項2:如果使用Druid數(shù)據(jù)源,需要導(dǎo)入對應(yīng)坐標(biāo)

      ④:制作實體類與表結(jié)構(gòu)

      (類名與表名對應(yīng),屬性名與字段名對應(yīng))

      create database if not exists mybatisplus_db character set utf8;
      use mybatisplus_db;
      CREATE TABLE user (
                  id bigint(20) primary key auto_increment,
                  name varchar(32) not null,
                  password  varchar(32) not null,
                  age int(3) not null ,
                  tel varchar(32) not null
      );
      insert into user values(null,'tom','123456',12,'12345678910');
      insert into user values(null,'jack','123456',8,'12345678910');
      insert into user values(null,'jerry','123456',15,'12345678910');
      insert into user values(null,'tom','123456',9,'12345678910');
      insert into user values(null,'snake','123456',28,'12345678910');
      insert into user values(null,'張益達','123456',22,'12345678910');
      insert into user values(null,'張大炮','123456',16,'12345678910');
      
      public class User {
          private Long id;
          private String name;
          private String password;
          private Integer age;
          private String tel;
          //自行添加getter、setter、toString()等方法
      }
      
      ⑤:設(shè)置Jdbc參數(shù)(application.yml
      spring:
        datasource:
          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
          username: root
          password: root
      
      ⑥:定義數(shù)據(jù)接口,繼承BaseMapper
      package com.itheima.dao;
      
      import com.baomidou.mybatisplus.core.mapper.BaseMapper;
      import com.itheima.domain.User;
      import org.apache.ibatis.annotations.Mapper;
      
      @Mapper
      public interface UserDao extends BaseMapper<User> {
      }
      
      
      ⑦:測試類中注入dao接口,測試功能
      package com.itheima;
      
      import com.itheima.dao.UserDao;
      import com.itheima.domain.User;
      import org.junit.jupiter.api.Test;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      
      import java.util.List;
      
      @SpringBootTest
      public class Mybatisplus01QuickstartApplicationTests {
      
          @Autowired
          private UserDao userDao;
      
          @Test
          void testGetAll() {
              List<User> userList = userDao.selectList(null);
              System.out.println(userList);
          }
      }
      

      2. MyBatisPlus概述

      問題導(dǎo)入

      通過入門案例制作,MyBatisPlus的優(yōu)點有哪些?

      2.1 MyBatis介紹

      2.2 MyBatisPlus特性

      • 無侵入:只做增強不做改變,不會對現(xiàn)有工程產(chǎn)生影響
      • 強大的 CRUD 操作:內(nèi)置通用 Mapper,少量配置即可實現(xiàn)單表CRUD 操作
      • 支持 Lambda:編寫查詢條件無需擔(dān)心字段寫錯
      • 支持主鍵自動生成
      • 內(nèi)置分頁插件
      • ……

      二、標(biāo)準數(shù)據(jù)層開發(fā)

      1. MyBatisPlus的CRUD操作

      package com.itheima;
      
      import com.itheima.dao.UserDao;
      import com.itheima.domain.User;
      import org.junit.jupiter.api.Test;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      
      import java.util.List;
      
      @SpringBootTest
      class Mybatisplus01QuickstartApplicationTests {
      
          @Autowired
          private UserDao userDao;
      
          @Test
          void testSave() {
              User user = new User();
              user.setName("黑馬程序員");
              user.setPassword("itheima");
              user.setAge(12);
              user.setTel("4006184000");
              userDao.insert(user);
          }
      
          @Test
          void testDelete() {
              userDao.deleteById(1401856123725713409L);
          }
      
          @Test
          void testUpdate() {
              User user = new User();
              user.setId(1L);
              user.setName("Tom888");
              user.setPassword("tom888");
              userDao.updateById(user);
          }
      
          @Test
          void testGetById() {
              User user = userDao.selectById(2L);
              System.out.println(user);
          }
      
      
          @Test
          void testGetAll() {
              List<User> userList = userDao.selectList(null);
              System.out.println(userList);
          }
      }
      
      

      2. Lombok插件介紹

      問題導(dǎo)入

      有什么簡單的辦法可以自動生成實體類的GET、SET方法?

      • Lombok,一個Java類庫,提供了一組注解,簡化POJO實體類開發(fā)。
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.12</version>
      </dependency>
      
      • 常用注解:@Data,為當(dāng)前實體類在編譯期設(shè)置對應(yīng)的get/set方法,無參/無參構(gòu)造方法,toString方法,hashCode方法,equals方法等
      package com.itheima.domain;
      
      import lombok.*;
      /*
          1 生成getter和setter方法:@Getter、@Setter
            生成toString方法:@ToString
            生成equals和hashcode方法:@EqualsAndHashCode
      
          2 統(tǒng)一成以上所有:@Data
      
          3 生成空參構(gòu)造: @NoArgsConstructor
            生成全參構(gòu)造: @AllArgsConstructor
      
          4 lombok還給我們提供了builder的方式創(chuàng)建對象,好處就是可以鏈式編程。 @Builder【擴展】
       */
      @Data
      public class User {
          private Long id;
          private String name;
          private String password;
          private Integer age;
          private String tel;
      }
      
      

      3. MyBatisPlus分頁功能

      問題導(dǎo)入

      思考一下Mybatis分頁插件是如何用的?

      3.1 分頁功能接口

      3.2 MyBatisPlus分頁使用

      ①:設(shè)置分頁攔截器作為Spring管理的bean

      package com.itheima.config;
      
      import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
      import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      @Configuration
      public class MybatisPlusConfig {
          
          @Bean
          public MybatisPlusInterceptor mybatisPlusInterceptor(){
              //1 創(chuàng)建MybatisPlusInterceptor攔截器對象
              MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
              //2 添加分頁攔截器
              mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
              return mpInterceptor;
          }
      }
      

      ②:執(zhí)行分頁查詢

      //分頁查詢
      @Test
      void testSelectPage(){
          //1 創(chuàng)建IPage分頁對象,設(shè)置分頁參數(shù)
          IPage<User> page=new Page<>(1,3);
          //2 執(zhí)行分頁查詢
          userDao.selectPage(page,null);
          //3 獲取分頁結(jié)果
          System.out.println("當(dāng)前頁碼值:"+page.getCurrent());
          System.out.println("每頁顯示數(shù):"+page.getSize());
          System.out.println("總頁數(shù):"+page.getPages());
          System.out.println("總條數(shù):"+page.getTotal());
          System.out.println("當(dāng)前頁數(shù)據(jù):"+page.getRecords());
      }
      

      3.3 開啟MyBatisPlus日志

      spring:
        datasource:
          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
          username: root
          password: root
      # 開啟mp的日志(輸出到控制臺)
      mybatis-plus:
        configuration:
          log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      

      3.4 解決日志打印過多問題

      3.4.1 取消初始化spring日志打印

      做法:在resources下新建一個logback.xml文件,名稱固定,內(nèi)容如下:

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
      
      </configuration>
      

      關(guān)于logback參考播客:https://www.jianshu.com/p/75f9d11ae011

      3.4.2 取消SpringBoot啟動banner圖標(biāo)

      spring:
        main:
          banner-mode: off # 關(guān)閉SpringBoot啟動圖標(biāo)(banner)
      
      3.4.3 取消MybatisPlus啟動banner圖標(biāo)

      # mybatis-plus日志控制臺輸出
      mybatis-plus:
        configuration:
          log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
        global-config:
          banner: off # 關(guān)閉mybatisplus啟動圖標(biāo)
      

      三、DQL編程控制

      1. 條件查詢方式

      • MyBatisPlus將書寫復(fù)雜的SQL查詢條件進行了封裝,使用編程的形式完成查詢條件的組合

      1.1 條件查詢

      1.1.1 方式一:按條件查詢
      //方式一:按條件查詢
      QueryWrapper<User> qw=new QueryWrapper<>();
      qw.lt("age", 18);
      List<User> userList = userDao.selectList(qw);
      System.out.println(userList);
      
      1.1.2 方式二:lambda格式按條件查詢
      //方式二:lambda格式按條件查詢
      QueryWrapper<User> qw = new QueryWrapper<User>();
      qw.lambda().lt(User::getAge, 10);
      List<User> userList = userDao.selectList(qw);
      System.out.println(userList);
      
      1.1.3 方式三:lambda格式按條件查詢(推薦)
      //方式三:lambda格式按條件查詢
      LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      lqw.lt(User::getAge, 10);
      List<User> userList = userDao.selectList(lqw);
      System.out.println(userList);
      

      1.2 組合條件

      1.2.1 并且關(guān)系(and)
      //并且關(guān)系
      LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      //并且關(guān)系:10到30歲之間
      lqw.lt(User::getAge, 30).gt(User::getAge, 10);
      List<User> userList = userDao.selectList(lqw);
      System.out.println(userList);
      
      1.2.2 或者關(guān)系(or)
      //或者關(guān)系
      LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      //或者關(guān)系:小于10歲或者大于30歲
      lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
      List<User> userList = userDao.selectList(lqw);
      System.out.println(userList);
      

      1.3 NULL值處理

      問題導(dǎo)入

      如下搜索場景,在多條件查詢中,有條件的值為空應(yīng)該怎么解決?

      1.3.1 if語句控制條件追加
      Integer minAge=10;  //將來有用戶傳遞進來,此處簡化成直接定義變量了
      Integer maxAge=null;  //將來有用戶傳遞進來,此處簡化成直接定義變量了
      LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      if(minAge!=null){
          lqw.gt(User::getAge, minAge);
      }
      if(maxAge!=null){
          lqw.lt(User::getAge, maxAge);
      }
      List<User> userList = userDao.selectList(lqw);
      userList.forEach(System.out::println);
      
      1.3.2 條件參數(shù)控制
      Integer minAge=10;  //將來有用戶傳遞進來,此處簡化成直接定義變量了
      Integer maxAge=null;  //將來有用戶傳遞進來,此處簡化成直接定義變量了
      LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      //參數(shù)1:如果表達式為true,那么查詢才使用該條件
      lqw.gt(minAge!=null,User::getAge, minAge);
      lqw.lt(maxAge!=null,User::getAge, maxAge);
      List<User> userList = userDao.selectList(lqw);
      userList.forEach(System.out::println);
      
      1.3.3 條件參數(shù)控制(鏈式編程)
      Integer minAge=10;  //將來有用戶傳遞進來,此處簡化成直接定義變量了
      Integer maxAge=null;  //將來有用戶傳遞進來,此處簡化成直接定義變量了
      LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      //參數(shù)1:如果表達式為true,那么查詢才使用該條件
      lqw.gt(minAge!=null,User::getAge, minAge)
         .lt(maxAge!=null,User::getAge, maxAge);
      List<User> userList = userDao.selectList(lqw);
      userList.forEach(System.out::println);
      

      2. 查詢投影-設(shè)置【查詢字段、分組、分頁】

      2.1 查詢結(jié)果包含模型類中部分屬性

      /*LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      lqw.select(User::getId, User::getName, User::getAge);*/
      //或者
      QueryWrapper<User> lqw = new QueryWrapper<User>();
      lqw.select("id", "name", "age", "tel");
      List<User> userList = userDao.selectList(lqw);
      System.out.println(userList);
      

      2.2 查詢結(jié)果包含模型類中未定義的屬性

      QueryWrapper<User> lqw = new QueryWrapper<User>();
      lqw.select("count(*) as count, tel");
      lqw.groupBy("tel");
      List<Map<String, Object>> userList = userDao.selectMaps(lqw);
      System.out.println(userList);
      

      3. 查詢條件設(shè)定

      問題導(dǎo)入

      多條件查詢有哪些組合?

      • 范圍匹配(> 、 = 、between)
      • 模糊匹配(like)
      • 空判定(null)
      • 包含性匹配(in)
      • 分組(group)
      • 排序(order)
      • ……

      3.1 查詢條件

      • 用戶登錄(eq匹配)
      LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      //等同于=
      lqw.eq(User::getName, "Jerry").eq(User::getPassword, "jerry");
      User loginUser = userDao.selectOne(lqw);
      System.out.println(loginUser);
      
      • 購物設(shè)定價格區(qū)間、戶籍設(shè)定年齡區(qū)間(le ge匹配 或 between匹配)
      LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      //范圍查詢 lt le gt ge eq between
      lqw.between(User::getAge, 10, 30);
      List<User> userList = userDao.selectList(lqw);
      System.out.println(userList);
      
      • 查信息,搜索新聞(非全文檢索版:like匹配)
      LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
      //模糊匹配 like
      lqw.likeLeft(User::getName, "J");
      List<User> userList = userDao.selectList(lqw);
      System.out.println(userList);
      
      • 統(tǒng)計報表(分組查詢聚合函數(shù))
      QueryWrapper<User> qw = new QueryWrapper<User>();
      qw.select("gender","count(*) as nums");
      qw.groupBy("gender");
      List<Map<String, Object>> maps = userDao.selectMaps(qw);
      System.out.println(maps);
      

      3.2 查詢API

      3.3 練習(xí):MyBatisPlus練習(xí)

      題目:基于MyBatisPlus_Ex1模塊,完成Top5功能的開發(fā)。

      • 說明:

        ①:Top5指根據(jù)銷售量排序(提示:對銷售量進行降序排序)

        ②:Top5是僅獲取前5條數(shù)據(jù)(提示:使用分頁功能控制數(shù)據(jù)顯示數(shù)量)

      4. 字段映射與表名映射

      問題導(dǎo)入

      思考表的字段和實體類的屬性不對應(yīng),查詢會怎么樣?

      4.1 問題一:表字段與編碼屬性設(shè)計不同步

      • 在模型類屬性上方,使用@TableField屬性注解,通過value屬性,設(shè)置當(dāng)前屬性對應(yīng)的數(shù)據(jù)庫表中的字段關(guān)系。

      4.2 問題二:編碼中添加了數(shù)據(jù)庫中未定義的屬性

      • 在模型類屬性上方,使用@TableField注解,通過exist屬性,設(shè)置屬性在數(shù)據(jù)庫表字段中是否存在,默認為true。此屬性無法與value合并使用。

      4.3 問題三:采用默認查詢開放了更多的字段查看權(quán)限

      • 在模型類屬性上方,使用@TableField注解,通過select屬性:設(shè)置該屬性是否參與查詢。此屬性與select()映射配置不沖突。

      4.4 問題四:表名與編碼開發(fā)設(shè)計不同步

      • 模型類上方,使用@TableName注解,通過value屬性,設(shè)置當(dāng)前類對應(yīng)的數(shù)據(jù)庫表名稱。

      @Data
      @TableName("tbl_user")
      public class User {
          /*
              id為Long類型,因為數(shù)據(jù)庫中id為bigint類型,
              并且mybatis有自己的一套id生成方案,生成出來的id必須是Long類型
           */
          private Long id;
          private String name;
          @TableField(value = "pwd",select = false)
          private String password;
          private Integer age;
          private String tel;
          @TableField(exist = false) //表示online字段不參與CRUD操作
          private Boolean online;
      }
      

      四、DML編程控制

      1. id生成策略控制(Insert)

      問題導(dǎo)入

      主鍵生成的策略有哪幾種方式?

      不同的表應(yīng)用不同的id生成策略

      • 日志:自增(1,2,3,4,……)
      • 購物訂單:特殊規(guī)則(FQ23948AK3843)
      • 外賣單:關(guān)聯(lián)地區(qū)日期等信息(10 04 20200314 34 91)
      • 關(guān)系表:可省略id
      • ……

      1.1 id生成策略控制(@TableId注解)

      • 名稱:@TableId

      • 類型:屬性注解

      • 位置:模型類中用于表示主鍵的屬性定義上方

      • 作用:設(shè)置當(dāng)前類中主鍵屬性的生成策略

      • 相關(guān)屬性

        ? type:設(shè)置主鍵屬性的生成策略,值參照IdType枚舉值

      1.2 全局策略配置

      mybatis-plus:
        global-config:
          db-config:
            id-type: assign_id
            table-prefix: tbl_
      
      id生成策略全局配置

      表名前綴全局配置

      2. 多記錄操作(批量Delete/Select)

      問題導(dǎo)入

      MyBatisPlus是否支持批量操作?

      2.1 按照主鍵刪除多條記錄

      //刪除指定多條數(shù)據(jù)
      List<Long> list = new ArrayList<>();
      list.add(1402551342481838081L);
      list.add(1402553134049501186L);
      list.add(1402553619611430913L);
      
      userDao.deleteBatchIds(list);
      

      2.2 根據(jù)主鍵查詢多條記錄

      //查詢指定多條數(shù)據(jù)
      List<Long> list = new ArrayList<>();
      list.add(1L);
      list.add(3L);
      list.add(4L);
      userDao.selectBatchIds(list);
      

      3. 邏輯刪除(Delete/Update)

      問題導(dǎo)入

      在實際環(huán)境中,如果想刪除一條數(shù)據(jù),是否會真的從數(shù)據(jù)庫中刪除該條數(shù)據(jù)?

      • 刪除操作業(yè)務(wù)問題:業(yè)務(wù)數(shù)據(jù)從數(shù)據(jù)庫中丟棄

      • 邏輯刪除:為數(shù)據(jù)設(shè)置是否可用狀態(tài)字段,刪除時設(shè)置狀態(tài)字段為不可用狀態(tài),數(shù)據(jù)保留在數(shù)據(jù)庫中

      3.1 邏輯刪除案例

      ①:數(shù)據(jù)庫表中添加邏輯刪除標(biāo)記字段

      ②:實體類中添加對應(yīng)字段,并設(shè)定當(dāng)前字段為邏輯刪除標(biāo)記字段
      package com.itheima.domain;
      
      import com.baomidou.mybatisplus.annotation.*;
      
      import lombok.Data;
      
      @Data
      public class User {
      
          private Long id;
          
          //邏輯刪除字段,標(biāo)記當(dāng)前記錄是否被刪除
          @TableLogic
          private Integer deleted;
          
      }
      
      ③:配置邏輯刪除字面值
      mybatis-plus:
        global-config:
          db-config:
            table-prefix: tbl_
            # 邏輯刪除字段名
            logic-delete-field: deleted
            # 邏輯刪除字面值:未刪除為0
            logic-not-delete-value: 0
            # 邏輯刪除字面值:刪除為1
            logic-delete-value: 1
      

      邏輯刪除本質(zhì):邏輯刪除的本質(zhì)其實是修改操作。如果加了邏輯刪除字段,查詢數(shù)據(jù)時也會自動帶上邏輯刪除字段。

      4. 樂觀鎖(Update)

      問題導(dǎo)入

      樂觀鎖主張的思想是什么?

      • 業(yè)務(wù)并發(fā)現(xiàn)象帶來的問題:秒殺

      4.1 樂觀鎖案例

      ①:數(shù)據(jù)庫表中添加鎖標(biāo)記字段

      ②:實體類中添加對應(yīng)字段,并設(shè)定當(dāng)前字段為邏輯刪除標(biāo)記字段
      package com.itheima.domain;
      
      import com.baomidou.mybatisplus.annotation.TableField;
      import com.baomidou.mybatisplus.annotation.TableLogic;
      import com.baomidou.mybatisplus.annotation.Version;
      import lombok.Data;
      
      @Data
      public class User {
      
      	private Long id;
      	
          @Version
          private Integer version;
      }
      
      
      ③:配置樂觀鎖攔截器實現(xiàn)鎖機制對應(yīng)的動態(tài)SQL語句拼裝
      package com.itheima.config;
      
      import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
      import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
      import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      @Configuration
      public class MpConfig {
          @Bean
          public MybatisPlusInterceptor mpInterceptor() {
              //1.定義Mp攔截器
              MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
      
              //2.添加樂觀鎖攔截器
              mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
              
              return mpInterceptor;
          }
      }
      
      
      ④:使用樂觀鎖機制在修改前必須先獲取到對應(yīng)數(shù)據(jù)的verion方可正常進行
      @Test
      public void testUpdate() {
          /*User user = new User();
          user.setId(3L);
          user.setName("Jock666");
          user.setVersion(1);
          userDao.updateById(user);*/
          
          //1.先通過要修改的數(shù)據(jù)id將當(dāng)前數(shù)據(jù)查詢出來
          //User user = userDao.selectById(3L);
          //2.將要修改的屬性逐一設(shè)置進去
          //user.setName("Jock888");
          //userDao.updateById(user);
          
          //1.先通過要修改的數(shù)據(jù)id將當(dāng)前數(shù)據(jù)查詢出來
          User user = userDao.selectById(3L);     //version=3
          User user2 = userDao.selectById(3L);    //version=3
          user2.setName("Jock aaa");
          userDao.updateById(user2);              //version=>4
          user.setName("Jock bbb");
          userDao.updateById(user);               //verion=3?條件還成立嗎?
      }
      

      五、快速開發(fā)-代碼生成器

      問題導(dǎo)入

      如果只給一張表的字段信息,能夠推演出Domain、Dao層的代碼?

      1. MyBatisPlus提供模板

      • Mapper接口模板

      • 實體對象類模板

      2. 工程搭建和基本代碼編寫

      • 第一步:創(chuàng)建SpringBoot工程,添加代碼生成器相關(guān)依賴,其他依賴自行添加
      <!--代碼生成器-->
      <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-generator</artifactId>
          <version>3.4.1</version>
      </dependency>
      
      <!--velocity模板引擎-->
      <dependency>
          <groupId>org.apache.velocity</groupId>
          <artifactId>velocity-engine-core</artifactId>
          <version>2.3</version>
      </dependency>
      
      • 第二步:編寫代碼生成器類
      package com.itheima;
      
      import com.baomidou.mybatisplus.generator.AutoGenerator;
      import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
      
      public class Generator {
          public static void main(String[] args) {
              //1. 創(chuàng)建代碼生成器對象,執(zhí)行生成代碼操作
              AutoGenerator autoGenerator = new AutoGenerator();
      
              //2. 數(shù)據(jù)源相關(guān)配置:讀取數(shù)據(jù)庫中的信息,根據(jù)數(shù)據(jù)庫表結(jié)構(gòu)生成代碼
              DataSourceConfig dataSource = new DataSourceConfig();
              dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
              dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
              dataSource.setUsername("root");
              dataSource.setPassword("root");
              autoGenerator.setDataSource(dataSource);
      
               //3. 執(zhí)行生成操作
              autoGenerator.execute();
          }
      }
      
      

      3. 開發(fā)者自定義配置

      • 設(shè)置全局配置
      //設(shè)置全局配置
      GlobalConfig globalConfig = new GlobalConfig();
      globalConfig.setOutputDir(System.getProperty("user.dir")+"/mybatisplus_04_generator/src/main/java");    //設(shè)置代碼生成位置
      globalConfig.setOpen(false);    //設(shè)置生成完畢后是否打開生成代碼所在的目錄
      globalConfig.setAuthor("黑馬程序員");    //設(shè)置作者
      globalConfig.setFileOverride(true);     //設(shè)置是否覆蓋原始生成的文件
      globalConfig.setMapperName("%sDao");    //設(shè)置數(shù)據(jù)層接口名,%s為占位符,指代模塊名稱
      globalConfig.setIdType(IdType.ASSIGN_ID);   //設(shè)置Id生成策略
      autoGenerator.setGlobalConfig(globalConfig);
      
      • 設(shè)置包名相關(guān)配置
      //設(shè)置包名相關(guān)配置
      PackageConfig packageInfo = new PackageConfig();
      packageInfo.setParent("com.aaa");   //設(shè)置生成的包名,與代碼所在位置不沖突,二者疊加組成完整路徑
      packageInfo.setEntity("domain");    //設(shè)置實體類包名
      packageInfo.setMapper("dao");   //設(shè)置數(shù)據(jù)層包名
      autoGenerator.setPackageInfo(packageInfo);
      
      • 策略設(shè)置
      //策略設(shè)置
      StrategyConfig strategyConfig = new StrategyConfig();
      strategyConfig.setInclude("tbl_user");  //設(shè)置當(dāng)前參與生成的表名,參數(shù)為可變參數(shù)
      strategyConfig.setTablePrefix("tbl_");  //設(shè)置數(shù)據(jù)庫表的前綴名稱,模塊名 = 數(shù)據(jù)庫表名 - 前綴名  例如: User = tbl_user - tbl_
      strategyConfig.setRestControllerStyle(true);    //設(shè)置是否啟用Rest風(fēng)格
      strategyConfig.setVersionFieldName("version");  //設(shè)置樂觀鎖字段名
      strategyConfig.setLogicDeleteFieldName("deleted");  //設(shè)置邏輯刪除字段名
      strategyConfig.setEntityLombokModel(true);  //設(shè)置是否啟用lombok
      autoGenerator.setStrategy(strategyConfig);
      
      posted @ 2022-06-11 17:58  染沁  閱讀(3065)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产午夜无码视频在线观看| 亚洲美免无码中文字幕在线| 海盐县| 肉大捧一进一出免费视频| 久久夜色撩人精品国产av| 8av国产精品爽爽ⅴa在线观看| 久久AV中文综合一区二区| 国产成人综合久久亚洲av| 亚洲精品麻豆一二三区| 99re在线视频观看| 国产成人精品国产成人亚洲| 日韩在线视频线观看一区| jizz国产免费观看| 国产亚洲精品VA片在线播放| 91久久偷偷做嫩草影院免费看| 国产精品永久免费成人av| a片在线免费观看| 成人亚洲a片v一区二区三区动漫| 亚洲免费成人av一区| 麻豆亚洲精品一区二区| 国产成人精品亚洲一区二区 | 国产av寂寞骚妇| 强奷漂亮人妻系列老师| 久久精品国产久精国产| 国产成人精品性色av麻豆| 亚洲自偷自拍熟女另类| 国产精品无码无在线观看| 亚洲av永久无码精品水牛影视| 成人亚洲狠狠一二三四区| 成A人片亚洲日本久久| 中文字幕日韩区二区三区| 91中文字幕在线一区| 日日碰狠狠添天天爽超碰97| 巨胸美乳无码人妻视频漫画| 成人看的污污超级黄网站免费| 被黑人伦流澡到高潮HNP动漫 | 亚洲中文字幕久久精品品| 亚洲国产精品成人无码区| 一个色综合亚洲热色综合| 熟妇的奶头又大又长奶水视频| 视频一区二区三区四区不卡|