Springcloud學習筆記35--Mybatis-plus增刪改查功能例項應用(條件構造器使用)
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 staticfinal 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操作
(1)根據id刪除(deleteById方法)
這裡只給出service層的操作
@Override public boolean deleteByIdTest() { pmOsBucketMapper.deleteById(6); return true; }
postman測試:
此時,檢視資料庫表,id為6的記錄已經刪除。
(2)根據條件刪除(QueryWrapper)
建立條件構造器時傳入實體物件
設定的條件加入到Where語句中WHERE b
ucket_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操作
(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測試:
資料庫表更新前:
資料庫表更新後:
(2)根據條件更新
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
資料庫表更新前:
資料庫表更新後:
5 select操作
(1)根據id查詢()
<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
(2)根據條件查詢一條資料
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測試:
(3)根據查詢條件返回多條資料
<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
(4)通過id批量查詢
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)常用的查詢條件
<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(非常推薦)