Springcloud學習筆記35--Mybatis-plus增刪改查功能實例應用(條件構造器QueryWrapper使用)


0 Mapper 接口方法(CRUD)

【添加數據:(增)】
    int insert(T entity);              // 插入一條記錄
注:
    T         表示任意實體類型
    entity    表示實體對象

【刪除數據:(刪)】
    int deleteById(Serializable id);    // 根據主鍵 ID 刪除
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);  // 根據 map 定義字段的條件刪除
    int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); // 根據實體類定義的 條件刪除對象
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 進行批量刪除
注:
    id        表示 主鍵 ID
    columnMap 表示表字段的 map 對象
    wrapper   表示實體對象封裝操作類,可以為 null。
    idList    表示 主鍵 ID 集合(列表、數組),不能為 null 或 empty

【修改數據:(改)】
    int updateById(@Param(Constants.ENTITY) T entity); // 根據 ID 修改實體對象。
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); // 根據 updateWrapper 條件修改實體對象
注:
    update 中的 entity 為 set 條件,可以為 null。
    updateWrapper 表示實體對象封裝操作類(可以為 null,里面的 entity 用於生成 where 語句)

【查詢數據:(查)】
    T selectById(Serializable id); // 根據 主鍵 ID 查詢數據
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); // 進行批量查詢
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); // 根據表字段條件查詢
    T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 根據實體類封裝對象 查詢一條記錄
    Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查詢記錄的總條數
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查詢所有記錄(返回 entity 集合)
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查詢所有記錄(返回 map 集合)
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查詢所有記錄(但只保存第一個字段的值)
    <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查詢所有記錄(返回 entity 集合),分頁
    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); // 查詢所有記錄(返回 map 集合),分頁
注:
    queryWrapper 表示實體對象封裝操作類(可以為 null)
    page 表示分頁查詢條件

 

1.條件構造器

QueryWrapper是mybatis plus中實現查詢的對象封裝操作類,他的層級關系如下

 

Wrapper  條件構造抽象類
    -- AbstractWrapper 查詢條件封裝,用於生成 sql 中的 where 語句。
        -- QueryWrapper Entity 對象封裝操作類,用於查詢。
        -- UpdateWrapper Update 條件封裝操作類,用於更新。
        -- AbstractLambdaWrapper 使用 Lambda 表達式封裝 wrapper
            -- LambdaQueryWrapper 使用 Lambda 語法封裝條件,用於查詢。
            -- LambdaUpdateWrapper 使用 Lambda 語法封裝條件,用於更新。

2.插入一條記錄(insert)

需要操作的實體類:

@Data
@TableName("pm_os_bucket")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="pm_os_bucket對象", description="pm_os_bucket")
public class PmOsBucket implements Serializable {
    private static final long serialVersionUID = 1L;

    /**id*/
    @TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(value = "id")
    private java.lang.Integer id;
    /**桶名稱*/
    @Excel(name = "桶名稱", width = 15)
    @ApiModelProperty(value = "桶名稱")
    private java.lang.String bucketName;
    /**桶描述*/
    @Excel(name = "桶描述", width = 15)
    @ApiModelProperty(value = "桶描述")
    private java.lang.String bucketDesc;
    /**對象存儲名稱*/
    @Excel(name = "對象存儲名稱", width = 15)
    @ApiModelProperty(value = "對象存儲名稱")
    private java.lang.String osName;
    /**子系統編碼*/
    @Excel(name = "子系統編碼", width = 15)
    @ApiModelProperty(value = "子系統編碼")
    private java.lang.String subsysCode;
    /**狀態(1啟用,0不啟用)*/
    @Excel(name = "狀態(1啟用,0不啟用)", width = 15)
    @ApiModelProperty(value = "狀態(1啟用,0不啟用)")
    private java.lang.String status;
    /**創建人*/
    @ApiModelProperty(value = "創建人")
    private java.lang.String createBy;
    /**創建時間*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @ApiModelProperty(value = "創建時間")
    private java.util.Date createTime;
    /**修改人*/
    @ApiModelProperty(value = "修改人")
    private java.lang.String updateBy;
    /**修改時間*/
    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @ApiModelProperty(value = "修改時間")
    private java.util.Date updateTime;
}

常用注解說明:

【@TableName 】
    @TableName               用於定義表名
注:
    常用屬性:
        value                用於定義表名

【@TableId】
    @TableId                 用於定義表的主鍵
注:
    常用屬性:
        value           用於定義主鍵字段名
        type            用於定義主鍵類型(主鍵策略 IdType)

   主鍵策略:
      IdType.AUTO          主鍵自增,系統分配,不需要手動輸入
      IdType.NONE          未設置主鍵
      IdType.INPUT         需要自己輸入 主鍵值。
      IdType.ASSIGN_ID     系統分配 ID,用於數值型數據(Long,對應 mysql 中 BIGINT 類型)。
      IdType.ASSIGN_UUID   系統分配 UUID,用於字符串型數據(String,對應 mysql 中 varchar(32) 類型)。

【@TableField】  
    @TableField            用於定義表的非主鍵字段。
注:
    常用屬性:
        value                用於定義非主鍵字段名
        exist                用於指明是否為數據表的字段, true 表示是,false 為不是。
        fill                 用於指定字段填充策略(FieldFill)。
        
    字段填充策略:(一般用於填充 創建時間、修改時間等字段)
        FieldFill.DEFAULT         默認不填充
        FieldFill.INSERT          插入時填充
        FieldFill.UPDATE          更新時填充
        FieldFill.INSERT_UPDATE   插入、更新時填充。

【@TableLogic】
    @TableLogic           用於定義表的字段進行邏輯刪除(非物理刪除)
注:
    常用屬性:
        value            用於定義未刪除時字段的值
        delval           用於定義刪除時字段的值
        
【@Version】
    @Version             用於字段實現樂觀鎖

(1)controller

@Api(tags="bs_file_store")
@RestController
@RequestMapping("/test/bsFileStore")
@Slf4j
public class BsFileStoreController extends JeecgController<BsFileStore, IBsFileStoreService> {
    @Autowired
    private IBsFileStoreService bsFileStoreService;

     @RequestMapping(value = "/insertTest", method = RequestMethod.POST)
     public Result<?> insertTest(HttpServletRequest request, HttpServletResponse response) {
         return Result.OK(bsFileStoreService.insertTest()?Result.OK("添加成功"):Result.error("添加失敗!"));
     }
}

(2)service

@Service
@DS("multi-datasource1")
@Slf4j
public class BsFileStoreServiceImpl extends ServiceImpl<BsFileStoreMapper, BsFileStore> implements IBsFileStoreService {

    @Autowired
    private PmOsBucketMapper pmOsBucketMapper;


    @Override
    public boolean insertTest() {
        PmOsBucket pmOsBucket=new PmOsBucket();
        pmOsBucket.setBucketName("flep03");
        pmOsBucket.setStatus("1");
        pmOsBucket.setBucketDesc("桶測試");
        pmOsBucket.setOsName("fleposs2");
        pmOsBucketMapper.insert(pmOsBucket); return true;
    }
}

注意:mybatisplus會自動把當前插入對象在數據庫中的id寫回到該實體中

(3)postman測試

http://127.0.0.1:7009/test/bsFileStore/insertTest

 (4)數據庫表結果

3.delete操作

3.1 根據id刪除(deleteById方法)

這里只給出service層的操作

    @Override
    public boolean deleteByIdTest() {
        pmOsBucketMapper.deleteById(6);
        return true;
    }
       

postman測試:

 此時,查看數據庫表,id為6的記錄已經刪除。

3.2 根據條件刪除(QueryWrapper)

創建條件構造器時傳入實體對象

設置的條件加入到Where語句中WHERE bucket_name=? AND status=?

BsFileStoreServiceImpl類中的方法:

    @Override
    public boolean deleteByContionTest() {
        //QueryWrapper傳入實體類,刪除bucketName為flep04,status為0的記錄
        PmOsBucket pmOsBucket=new PmOsBucket();
        pmOsBucket.setBucketName("flep04");
        pmOsBucket.setStatus("0");
        QueryWrapper<PmOsBucket> queryWrapper=new QueryWrapper<>(pmOsBucket);
        pmOsBucketMapper.delete(queryWrapper);
        return false;
    }

postman測試:

 數據庫表:

刪除前

 刪除后:

4.update操作

4.1 updateById方法

BsFileStoreServiceImpl類中的方法:

    @Override
    public boolean updateByIdTest() {
        PmOsBucket pmOsBucket=new PmOsBucket();
        pmOsBucket.setId(5);
        pmOsBucket.setBucketName("flep05");
        pmOsBucket.setBucketDesc("update測試flep05");
        pmOsBucket.setStatus("1");
        pmOsBucketMapper.updateById(pmOsBucket);
        return true;
    }

postman測試:

 數據庫表更新前:

 數據庫表更新后:

4.2 根據條件更新(QueryWrapper)

BsFileStoreServiceImpl類中的方法:

    @Override
    public boolean updateByContidionTest() {
        QueryWrapper<PmOsBucket> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("os_name","fleposs1")
                .eq("status","1" );
        PmOsBucket pmOsBucket=new PmOsBucket();
        pmOsBucket.setBucketName("flep06");
        pmOsBucket.setCreateBy("admin");
        pmOsBucketMapper.update(pmOsBucket,queryWrapper );
        return true;
    }

注意:該案例表示把os_name為fleposs1,status為1的所有記錄更新為pmOsBucket中設置的信息。

postman測試:http://127.0.0.1:7009/test/bsFileStore/updateByContidionTest

 數據庫表更新前:

 數據庫表更新后:

4.3 根據條件更新(LambdaQueryWrapper)

引入lambda,避免我們在代碼中寫類似的於os_name的硬編碼

需求:查詢student表中名為“lucky”,年齡為14的所有記錄;

    @PostMapping("/getStuInfo")
    public List<Student> getStuInfo(String name, String gender){
        LambdaQueryWrapper<Student> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(Student::getName,"lucky" )
                .eq(Student::getAge,14 );


        List<Student> students = studentMapper.selectList(lambdaQueryWrapper);
        log.info("111");
        return null;
    }

postman調用:

5 select操作

5.1 根據id查詢(selectById)

<1>controller層

@Api(tags="bs_file_store")
@RestController
@RequestMapping("/test/bsFileStore")
@Slf4j
public class BsFileStoreController extends JeecgController<BsFileStore, IBsFileStoreService> {
    @Autowired
    private IBsFileStoreService bsFileStoreService;

     @RequestMapping(value = "/queryByIdTest", method = RequestMethod.POST)
     public Result<?> queryByIdTest(@RequestParam(name="id",required=true) String id) {
         PmOsBucket pmOsBucket = bsFileStoreService.queryByIdTest(id);
         if(pmOsBucket==null) {
             return Result.error("未找到對應數據");
         }
         return Result.OK(pmOsBucket);
     }
}

<2>service層

BsFileStoreServiceImpl類中的方法:

  @Override
    public PmOsBucket queryByIdTest(String id) {
        return pmOsBucketMapper.selectById(id);
    }

postman測試:http://127.0.0.1:7009/test/bsFileStore/queryByIdTest

5.2 根據條件查詢一條數據(selectOne)

BsFileStoreServiceImpl類中的方法:

    @Override
    public PmOsBucket queryOneTest() {
        PmOsBucket pmOsBucket=new PmOsBucket();
        pmOsBucket.setId(4);
        pmOsBucket.setBucketName("flep02");
        QueryWrapper<PmOsBucket> queryWrapper=new QueryWrapper<>(pmOsBucket);
        //若是數據庫中符合傳入的條件的記錄有多條,那就不能用這個方法,會報錯
        return pmOsBucketMapper.selectOne(queryWrapper);
    }

注意:這個方法的sql語句就是where id = 4 and bucket_name = "flep02",若是符合這個條件的記錄不止一條,那么就會報錯。

postman測試:

5.3 根據查詢條件返回多條數據(selectList)

<1>controller層

@Api(tags="bs_file_store")
@RestController
@RequestMapping("/test/bsFileStore")
@Slf4j
public class BsFileStoreController extends JeecgController<BsFileStore, IBsFileStoreService> {
    @Autowired
    private IBsFileStoreService bsFileStoreService;

     @RequestMapping(value = "/queryManyTest", method = RequestMethod.POST)
     public Result<?> queryManyTest(HttpServletRequest request, HttpServletResponse response) {
         List<PmOsBucket> pmOsBucketList= bsFileStoreService.queryManyTest();
         return Result.OK(pmOsBucketList);

     }
}

<2>service層

    @Override
    public List<PmOsBucket> queryManyTest() {
        //01 新建一個QueryWrapper對象,類型為PmOsBucket對象,也就是你需要查詢的實體數據
        QueryWrapper<PmOsBucket> queryWrapper = new QueryWrapper<>();
        //02 PmOsBucket對象對應的數據庫表中的os_name,os_name字段值要為fleposs1
        queryWrapper.eq("os_name", "fleposs1");
        queryWrapper.eq("status", "1");
        //03 調用pmOsBucketMapper.selectList方法,入參就為前面新建好的查詢對象封裝類
        List<PmOsBucket> pmOsBucketList = pmOsBucketMapper.selectList(queryWrapper);
        return pmOsBucketList;
    }

postman測試:http://127.0.0.1:7009/test/bsFileStore/queryManyTest

5.4 通過id批量查詢(selectBatchIds)

BsFileStoreServiceImpl類中的方法:

    @Override
    public List<PmOsBucket> queryBatchByIdsTest() {
        List<Integer> idList = new ArrayList<>();
        idList.add(1);
        idList.add(5);
        List<PmOsBucket> pmOsBucketList = pmOsBucketMapper.selectBatchIds(idList);
        return pmOsBucketList;
    }

postman測試:http://127.0.0.1:7009/test/bsFileStore/queryBatchByIdsTest

5.5 返回查詢的符合條件的總記錄數(selectCount)

需求:查找薪水大於3500 名字里有“小”的 員工的個數

sql實現:select count(*) from t_employee where salary>3500 and name like '%小%'

    QueryWrapper<Employee> queryWrapper=new QueryWrapper();
    queryWrapper.gt("salary",3500).like("name","小");
    Integer count = employeeMapper.selectCount(queryWrapper);
    System.out.println(count);

5.6 常用的查詢條件

<1>比較大小: ( =, <>, >, >=, <, <= )

    eq(R column, Object val); // 等價於 =,例: eq("name", "老王") ---> name = '老王'
    ne(R column, Object val); // 等價於 <>,例: ne("name", "老王") ---> name <> '老王'
    gt(R column, Object val); // 等價於 >,例: gt("name", "老王") ---> name > '老王'
    ge(R column, Object val); // 等價於 >=,例: ge("name", "老王") ---> name >= '老王'
    lt(R column, Object val); // 等價於 <,例: lt("name", "老王") ---> name < '老王'
    le(R column, Object val); // 等價於 <=,例: le("name", "老王") ---> name <= '老王'

<2>范圍:(between、not between、in、not in)

   between(R column, Object val1, Object val2); // 等價於 between a and b, 例: between("age", 18, 30) ---> age between 18 and 30
   notBetween(R column, Object val1, Object val2); // 等價於 not between a and b, 例: notBetween("age", 18, 30) ---> age not between 18 and 30
   in(R column, Object... values); // 等價於 字段 IN (v0, v1, ...),例: in("age",{1,2,3}) ---> age in (1,2,3)
   notIn(R column, Object... values); // 等價於 字段 NOT IN (v0, v1, ...), 例: notIn("age",{1,2,3}) ---> age not in (1,2,3)
   inSql(R column, Object... values); // 等價於 字段 IN (sql 語句), 例: inSql("id", "select id from table where id < 3") ---> id in (select id from table where id < 3)
   notInSql(R column, Object... values); // 等價於 字段 NOT IN (sql 語句)

<3>模糊匹配:(like)

    like(R column, Object val); // 等價於 LIKE '%值%',例: like("name", "王") ---> name like '%王%'
    notLike(R column, Object val); // 等價於 NOT LIKE '%值%',例: notLike("name", "王") ---> name not like '%王%'
    likeLeft(R column, Object val); // 等價於 LIKE '%值',例: likeLeft("name", "王") ---> name like '%王'
    likeRight(R column, Object val); // 等價於 LIKE '值%',例: likeRight("name", "王") ---> name like '王%'

<4>空值比較:(isNull、isNotNull)

    isNull(R column); // 等價於 IS NULL,例: isNull("name") ---> name is null
    isNotNull(R column); // 等價於 IS NOT NULL,例: isNotNull("name") ---> name is not null

<5>分組、排序:(group、having、order)

    groupBy(R... columns); // 等價於 GROUP BY 字段, ..., 例: groupBy("id", "name") ---> group by id,name
    orderByAsc(R... columns); // 等價於 ORDER BY 字段, ... ASC, 例: orderByAsc("id", "name") ---> order by id ASC,name ASC
    orderByDesc(R... columns); // 等價於 ORDER BY 字段, ... DESC, 例: orderByDesc("id", "name") ---> order by id DESC,name DESC
    having(String sqlHaving, Object... params); // 等價於 HAVING ( sql語句 ), 例: having("sum(age) > {0}", 11) ---> having sum(age) > 11

6.條件構造器常用案例

6.1 分頁查詢年齡在18 - 50且gender為0、姓名為tom的用戶:

List<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(1,3),
     new EntityWrapper<Employee>()
        .between("age",18,50)
        .eq("gender",0)
        .eq("last_name","tom")
);
注:由此案例可知,分頁查詢和之前一樣,new 一個page對象傳入分頁信息即可。至於分頁條件,new 一個EntityWrapper對象,調用該對象的相關方法即可。between方法三個參數,分別是column、value1、value2,該方法表示column的值要在value1和value2之間;eq是equals的簡寫,該方法兩個參數,column和value,表示column的值和value要相等。注意column是數據表對應的字段,而非實體類屬性字段。

6.2 查詢gender為0且名字中帶有老師、或者郵箱中帶有a的用戶

List<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
               .eq("gender",0)
               .like("last_name","老師")
                //.or()//和or new 區別不大
               .orNew()
               .like("email","a")
);
注:未說分頁查詢,所以用selectList即可,用EntityWrapper的like方法進行模糊查詢,like方法就是指column的值包含value值,此處like方法就是查詢last_name中包含“老師”字樣的記錄;“或者”用or或者orNew方法表示,這兩個方法區別不大,用哪個都可以,可以通過控制台的sql語句自行感受其區別。

6.3 查詢gender為0,根據age排序,簡單分頁:

List<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
                .eq("gender",0)
                .orderBy("age")//直接orderby 是升序,asc
                .last("desc limit 1,3")//在sql語句后面追加last里面的內容(改為降序,同時分頁)
);
注:簡單分頁是指不用page對象進行分頁。orderBy方法就是根據傳入的column進行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是將last方法里面的value值追加到sql語句的后面,在該案例中,最后的sql語句就變為 select ······ order by desc limit 1, 3,追加了 desc limit 1,3所以可以進行降序排序和分頁。

參考文獻:

https://blog.csdn.net/bird_tp/article/details/105587582

https://www.jianshu.com/p/52600e85af64

https://www.jianshu.com/p/c5537559ae3a(非常推薦)

https://www.jianshu.com/p/ceb1df475021(非常非常推薦)

https://blog.csdn.net/llllllkkkkkooooo/article/details/108216957(非常推薦)

https://www.cnblogs.com/l-y-h/p/12859477.html----推薦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM