IService.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. /*
  2. * Copyright (c) 2011-2023, baomidou (jobob@qq.com).
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.baomidou.mybatisplus.extension.service;
  17. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  18. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  19. import com.baomidou.mybatisplus.core.metadata.IPage;
  20. import com.baomidou.mybatisplus.core.toolkit.Assert;
  21. import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  22. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  23. import com.baomidou.mybatisplus.extension.conditions.query.ChainQuery;
  24. import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
  25. import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
  26. import com.baomidou.mybatisplus.extension.conditions.update.ChainUpdate;
  27. import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
  28. import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
  29. import com.baomidou.mybatisplus.extension.kotlin.KtQueryChainWrapper;
  30. import com.baomidou.mybatisplus.extension.kotlin.KtUpdateChainWrapper;
  31. import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers;
  32. import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
  33. import org.springframework.transaction.annotation.Transactional;
  34. import java.io.Serializable;
  35. import java.util.*;
  36. import java.util.function.Function;
  37. import java.util.stream.Collectors;
  38. /**
  39. * 顶级 Service
  40. *
  41. * @author hubin
  42. * @since 2018-06-23
  43. */
  44. public interface IService<T> {
  45. /**
  46. * 默认批次提交数量
  47. */
  48. int DEFAULT_BATCH_SIZE = 1000;
  49. /**
  50. * 插入一条记录(选择字段,策略插入)
  51. *
  52. * @param entity 实体对象
  53. */
  54. default boolean save(T entity) {
  55. return SqlHelper.retBool(getBaseMapper().insert(entity));
  56. }
  57. /**
  58. * 插入(批量)
  59. *
  60. * @param entityList 实体对象集合
  61. */
  62. @Transactional(rollbackFor = Exception.class)
  63. default boolean saveBatch(Collection<T> entityList) {
  64. return saveBatch(entityList, DEFAULT_BATCH_SIZE);
  65. }
  66. /**
  67. * 插入(批量)
  68. *
  69. * @param entityList 实体对象集合
  70. * @param batchSize 插入批次数量
  71. */
  72. boolean saveBatch(Collection<T> entityList, int batchSize);
  73. /**
  74. * 批量修改插入
  75. *
  76. * @param entityList 实体对象集合
  77. */
  78. @Transactional(rollbackFor = Exception.class)
  79. default boolean saveOrUpdateBatch(Collection<T> entityList) {
  80. return saveOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE);
  81. }
  82. /**
  83. * 批量修改插入
  84. *
  85. * @param entityList 实体对象集合
  86. * @param batchSize 每次的数量
  87. */
  88. boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
  89. /**
  90. * 根据 ID 删除
  91. *
  92. * @param id 主键ID
  93. */
  94. default boolean removeById(Serializable id) {
  95. return SqlHelper.retBool(getBaseMapper().deleteById(id));
  96. }
  97. /**
  98. * 根据 ID 删除
  99. *
  100. * @param id 主键(类型必须与实体类型字段保持一致)
  101. * @param useFill 是否启用填充(为true的情况,会将入参转换实体进行delete删除)
  102. * @return 删除结果
  103. * @since 3.5.0
  104. */
  105. default boolean removeById(Serializable id, boolean useFill) {
  106. throw new UnsupportedOperationException("不支持的方法!");
  107. }
  108. /**
  109. * 根据实体(ID)删除
  110. *
  111. * @param entity 实体
  112. * @since 3.4.4
  113. */
  114. default boolean removeById(T entity) {
  115. return SqlHelper.retBool(getBaseMapper().deleteById(entity));
  116. }
  117. /**
  118. * 根据 columnMap 条件,删除记录
  119. *
  120. * @param columnMap 表字段 map 对象
  121. */
  122. default boolean removeByMap(Map<String, Object> columnMap) {
  123. Assert.notEmpty(columnMap, "error: columnMap must not be empty");
  124. return SqlHelper.retBool(getBaseMapper().deleteByMap(columnMap));
  125. }
  126. /**
  127. * 根据 entity 条件,删除记录
  128. *
  129. * @param queryWrapper 实体包装类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  130. */
  131. default boolean remove(Wrapper<T> queryWrapper) {
  132. return SqlHelper.retBool(getBaseMapper().delete(queryWrapper));
  133. }
  134. /**
  135. * 删除(根据ID 批量删除)
  136. *
  137. * @param list 主键ID或实体列表
  138. */
  139. default boolean removeByIds(Collection<?> list) {
  140. if (CollectionUtils.isEmpty(list)) {
  141. return false;
  142. }
  143. return SqlHelper.retBool(getBaseMapper().deleteBatchIds(list));
  144. }
  145. /**
  146. * 批量删除
  147. *
  148. * @param list 主键ID或实体列表
  149. * @param useFill 是否填充(为true的情况,会将入参转换实体进行delete删除)
  150. * @return 删除结果
  151. * @since 3.5.0
  152. */
  153. @Transactional(rollbackFor = Exception.class)
  154. default boolean removeByIds(Collection<?> list, boolean useFill) {
  155. if (CollectionUtils.isEmpty(list)) {
  156. return false;
  157. }
  158. if (useFill) {
  159. return removeBatchByIds(list, true);
  160. }
  161. return SqlHelper.retBool(getBaseMapper().deleteBatchIds(list));
  162. }
  163. /**
  164. * 批量删除(jdbc批量提交)
  165. *
  166. * @param list 主键ID或实体列表(主键ID类型必须与实体类型字段保持一致)
  167. * @return 删除结果
  168. * @since 3.5.0
  169. */
  170. @Transactional(rollbackFor = Exception.class)
  171. default boolean removeBatchByIds(Collection<?> list) {
  172. return removeBatchByIds(list, DEFAULT_BATCH_SIZE);
  173. }
  174. /**
  175. * 批量删除(jdbc批量提交)
  176. *
  177. * @param list 主键ID或实体列表(主键ID类型必须与实体类型字段保持一致)
  178. * @param useFill 是否启用填充(为true的情况,会将入参转换实体进行delete删除)
  179. * @return 删除结果
  180. * @since 3.5.0
  181. */
  182. @Transactional(rollbackFor = Exception.class)
  183. default boolean removeBatchByIds(Collection<?> list, boolean useFill) {
  184. return removeBatchByIds(list, DEFAULT_BATCH_SIZE, useFill);
  185. }
  186. /**
  187. * 批量删除(jdbc批量提交)
  188. *
  189. * @param list 主键ID或实体列表
  190. * @param batchSize 批次大小
  191. * @return 删除结果
  192. * @since 3.5.0
  193. */
  194. default boolean removeBatchByIds(Collection<?> list, int batchSize) {
  195. throw new UnsupportedOperationException("不支持的方法!");
  196. }
  197. /**
  198. * 批量删除(jdbc批量提交)
  199. *
  200. * @param list 主键ID或实体列表
  201. * @param batchSize 批次大小
  202. * @param useFill 是否启用填充(为true的情况,会将入参转换实体进行delete删除)
  203. * @return 删除结果
  204. * @since 3.5.0
  205. */
  206. default boolean removeBatchByIds(Collection<?> list, int batchSize, boolean useFill) {
  207. throw new UnsupportedOperationException("不支持的方法!");
  208. }
  209. /**
  210. * 根据 ID 选择修改
  211. *
  212. * @param entity 实体对象
  213. */
  214. default boolean updateById(T entity) {
  215. return SqlHelper.retBool(getBaseMapper().updateById(entity));
  216. }
  217. /**
  218. * 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
  219. * <p>此方法无法进行自动填充,如需自动填充请使用{@link #update(Object, Wrapper)}</p>
  220. *
  221. * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
  222. */
  223. default boolean update(Wrapper<T> updateWrapper) {
  224. return update(null, updateWrapper);
  225. }
  226. /**
  227. * 根据 whereEntity 条件,更新记录
  228. *
  229. * @param entity 实体对象(当entity为空时无法进行自动填充)
  230. * @param updateWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
  231. */
  232. default boolean update(T entity, Wrapper<T> updateWrapper) {
  233. return SqlHelper.retBool(getBaseMapper().update(entity, updateWrapper));
  234. }
  235. /**
  236. * 根据ID 批量更新
  237. *
  238. * @param entityList 实体对象集合
  239. */
  240. @Transactional(rollbackFor = Exception.class)
  241. default boolean updateBatchById(Collection<T> entityList) {
  242. return updateBatchById(entityList, DEFAULT_BATCH_SIZE);
  243. }
  244. /**
  245. * 根据ID 批量更新
  246. *
  247. * @param entityList 实体对象集合
  248. * @param batchSize 更新批次数量
  249. */
  250. boolean updateBatchById(Collection<T> entityList, int batchSize);
  251. /**
  252. * TableId 注解存在更新记录,否插入一条记录
  253. *
  254. * @param entity 实体对象
  255. */
  256. boolean saveOrUpdate(T entity);
  257. /**
  258. * 根据 ID 查询
  259. *
  260. * @param id 主键ID
  261. */
  262. default T getById(Serializable id) {
  263. return getBaseMapper().selectById(id);
  264. }
  265. /**
  266. * 根据 ID 查询,返回一个Option对象
  267. *
  268. * @param id 主键ID
  269. * @return {@link Optional}
  270. */
  271. default Optional<T> getOptById(Serializable id) {
  272. return Optional.ofNullable(getBaseMapper().selectById(id));
  273. }
  274. /**
  275. * 查询(根据ID 批量查询)
  276. *
  277. * @param idList 主键ID列表
  278. */
  279. default List<T> listByIds(Collection<? extends Serializable> idList) {
  280. return getBaseMapper().selectBatchIds(idList);
  281. }
  282. /**
  283. * 查询(根据 columnMap 条件)
  284. *
  285. * @param columnMap 表字段 map 对象
  286. */
  287. default List<T> listByMap(Map<String, Object> columnMap) {
  288. return getBaseMapper().selectByMap(columnMap);
  289. }
  290. /**
  291. * 根据 Wrapper,查询一条记录 <br/>
  292. * <p>结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")</p>
  293. *
  294. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  295. */
  296. default T getOne(Wrapper<T> queryWrapper) {
  297. return getOne(queryWrapper, true);
  298. }
  299. /**
  300. * 根据 Wrapper,查询一条记录 <br/>
  301. * <p>结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")</p>
  302. *
  303. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  304. * @return {@link Optional} 返回一个Optional对象
  305. */
  306. default Optional<T> getOneOpt(Wrapper<T> queryWrapper) {
  307. return getOneOpt(queryWrapper, true);
  308. }
  309. /**
  310. * 根据 Wrapper,查询一条记录
  311. *
  312. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  313. * @param throwEx 有多个 result 是否抛出异常
  314. */
  315. T getOne(Wrapper<T> queryWrapper, boolean throwEx);
  316. /**
  317. * 根据 Wrapper,查询一条记录
  318. *
  319. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  320. * @param throwEx 有多个 result 是否抛出异常
  321. * @return {@link Optional} 返回一个Optional对象
  322. */
  323. Optional<T> getOneOpt(Wrapper<T> queryWrapper, boolean throwEx);
  324. /**
  325. * 根据 Wrapper,查询一条记录
  326. *
  327. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  328. */
  329. Map<String, Object> getMap(Wrapper<T> queryWrapper);
  330. /**
  331. * 根据 Wrapper,查询一条记录
  332. *
  333. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  334. * @param mapper 转换函数
  335. */
  336. <V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
  337. /**
  338. * 查询指定条件是否存在数据
  339. *
  340. * @see Wrappers#emptyWrapper()
  341. */
  342. default boolean exists(Wrapper<T> queryWrapper) {
  343. return getBaseMapper().exists(queryWrapper);
  344. }
  345. /**
  346. * 查询总记录数
  347. *
  348. * @see Wrappers#emptyWrapper()
  349. */
  350. default long count() {
  351. return count(Wrappers.emptyWrapper());
  352. }
  353. /**
  354. * 根据 Wrapper 条件,查询总记录数
  355. *
  356. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  357. */
  358. default long count(Wrapper<T> queryWrapper) {
  359. return SqlHelper.retCount(getBaseMapper().selectCount(queryWrapper));
  360. }
  361. /**
  362. * 查询列表
  363. *
  364. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  365. */
  366. default List<T> list(Wrapper<T> queryWrapper) {
  367. return getBaseMapper().selectList(queryWrapper);
  368. }
  369. /**
  370. * 查询列表
  371. *
  372. * @param page 分页条件
  373. * @param queryWrapper queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  374. * @return 列表数据
  375. * @since 3.5.3.2
  376. */
  377. default List<T> list(IPage<T> page, Wrapper<T> queryWrapper) {
  378. return getBaseMapper().selectList(page, queryWrapper);
  379. }
  380. /**
  381. * 查询所有
  382. *
  383. * @see Wrappers#emptyWrapper()
  384. */
  385. default List<T> list() {
  386. return list(Wrappers.emptyWrapper());
  387. }
  388. /**
  389. * 分页查询单表数据
  390. *
  391. * @param page 分页条件
  392. * @return 列表数据
  393. * @since 3.5.3.2
  394. */
  395. default List<T> list(IPage<T> page) {
  396. return list(page, Wrappers.emptyWrapper());
  397. }
  398. /**
  399. * 翻页查询
  400. *
  401. * @param page 翻页对象
  402. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  403. */
  404. default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {
  405. return getBaseMapper().selectPage(page, queryWrapper);
  406. }
  407. /**
  408. * 无条件翻页查询
  409. *
  410. * @param page 翻页对象
  411. * @see Wrappers#emptyWrapper()
  412. */
  413. default <E extends IPage<T>> E page(E page) {
  414. return page(page, Wrappers.emptyWrapper());
  415. }
  416. /**
  417. * 查询列表
  418. *
  419. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  420. */
  421. default List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper) {
  422. return getBaseMapper().selectMaps(queryWrapper);
  423. }
  424. /**
  425. * 查询列表
  426. *
  427. * @param page 分页条件
  428. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  429. * @return 列表数据
  430. * @since 3.5.3.2
  431. */
  432. default List<Map<String, Object>> listMaps(IPage<? extends Map<String, Object>> page, Wrapper<T> queryWrapper) {
  433. return getBaseMapper().selectMaps(page, queryWrapper);
  434. }
  435. /**
  436. * 查询所有列表
  437. *
  438. * @see Wrappers#emptyWrapper()
  439. */
  440. default List<Map<String, Object>> listMaps() {
  441. return listMaps(Wrappers.emptyWrapper());
  442. }
  443. /**
  444. * 查询列表
  445. *
  446. * @param page 分页条件
  447. * @see Wrappers#emptyWrapper()
  448. */
  449. default List<Map<String, Object>> listMaps(IPage<? extends Map<String, Object>> page) {
  450. return listMaps(page, Wrappers.emptyWrapper());
  451. }
  452. /**
  453. * 查询全部记录
  454. */
  455. default <E> List<E> listObjs() {
  456. return getBaseMapper().selectObjs(null);
  457. }
  458. /**
  459. * 查询全部记录
  460. *
  461. * @param mapper 转换函数
  462. */
  463. default <V> List<V> listObjs(Function<? super Object, V> mapper) {
  464. return listObjs(Wrappers.emptyWrapper(), mapper);
  465. }
  466. /**
  467. * 根据 Wrapper 条件,查询全部记录
  468. *
  469. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  470. */
  471. default <E> List<E> listObjs(Wrapper<T> queryWrapper) {
  472. return getBaseMapper().selectObjs(queryWrapper);
  473. }
  474. /**
  475. * 根据 Wrapper 条件,查询全部记录
  476. *
  477. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  478. * @param mapper 转换函数
  479. */
  480. default <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
  481. return getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
  482. }
  483. /**
  484. * 翻页查询
  485. *
  486. * @param page 翻页对象
  487. * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
  488. */
  489. default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper<T> queryWrapper) {
  490. return getBaseMapper().selectMapsPage(page, queryWrapper);
  491. }
  492. /**
  493. * 无条件翻页查询
  494. *
  495. * @param page 翻页对象
  496. * @see Wrappers#emptyWrapper()
  497. */
  498. default <E extends IPage<Map<String, Object>>> E pageMaps(E page) {
  499. return pageMaps(page, Wrappers.emptyWrapper());
  500. }
  501. /**
  502. * 获取对应 entity 的 BaseMapper
  503. *
  504. * @return BaseMapper
  505. */
  506. BaseMapper<T> getBaseMapper();
  507. /**
  508. * 获取 entity 的 class
  509. *
  510. * @return {@link Class<T>}
  511. */
  512. Class<T> getEntityClass();
  513. /**
  514. * 以下的方法使用介绍:
  515. *
  516. * 一. 名称介绍
  517. * 1. 方法名带有 query 的为对数据的查询操作, 方法名带有 update 的为对数据的修改操作
  518. * 2. 方法名带有 lambda 的为内部方法入参 column 支持函数式的
  519. * 二. 支持介绍
  520. *
  521. * 1. 方法名带有 query 的支持以 {@link ChainQuery} 内部的方法名结尾进行数据查询操作
  522. * 2. 方法名带有 update 的支持以 {@link ChainUpdate} 内部的方法名为结尾进行数据修改操作
  523. *
  524. * 三. 使用示例,只用不带 lambda 的方法各展示一个例子,其他类推
  525. * 1. 根据条件获取一条数据: `query().eq("column", value).one()`
  526. * 2. 根据条件删除一条数据: `update().eq("column", value).remove()`
  527. *
  528. */
  529. /**
  530. * 链式查询 普通
  531. *
  532. * @return QueryWrapper 的包装类
  533. */
  534. default QueryChainWrapper<T> query() {
  535. return ChainWrappers.queryChain(getBaseMapper());
  536. }
  537. /**
  538. * 链式查询 lambda 式
  539. * <p>注意:不支持 Kotlin </p>
  540. *
  541. * @return LambdaQueryWrapper 的包装类
  542. */
  543. default LambdaQueryChainWrapper<T> lambdaQuery() {
  544. return ChainWrappers.lambdaQueryChain(getBaseMapper(), getEntityClass());
  545. }
  546. /**
  547. * 链式查询 lambda 式
  548. * <p>注意:不支持 Kotlin </p>
  549. *
  550. * @param entity 实体对象
  551. * @return LambdaQueryWrapper 的包装类
  552. */
  553. default LambdaQueryChainWrapper<T> lambdaQuery(T entity) {
  554. return ChainWrappers.lambdaQueryChain(getBaseMapper(), entity);
  555. }
  556. /**
  557. * 链式查询 lambda 式
  558. * kotlin 使用
  559. *
  560. * @return KtQueryWrapper 的包装类
  561. */
  562. default KtQueryChainWrapper<T> ktQuery() {
  563. return ChainWrappers.ktQueryChain(getBaseMapper(), getEntityClass());
  564. }
  565. /**
  566. * 链式查询 lambda 式
  567. * kotlin 使用
  568. *
  569. * @return KtQueryWrapper 的包装类
  570. */
  571. default KtUpdateChainWrapper<T> ktUpdate() {
  572. return ChainWrappers.ktUpdateChain(getBaseMapper(), getEntityClass());
  573. }
  574. /**
  575. * 链式更改 普通
  576. *
  577. * @return UpdateWrapper 的包装类
  578. */
  579. default UpdateChainWrapper<T> update() {
  580. return ChainWrappers.updateChain(getBaseMapper());
  581. }
  582. /**
  583. * 链式更改 lambda 式
  584. * <p>注意:不支持 Kotlin </p>
  585. *
  586. * @return LambdaUpdateWrapper 的包装类
  587. */
  588. default LambdaUpdateChainWrapper<T> lambdaUpdate() {
  589. return ChainWrappers.lambdaUpdateChain(getBaseMapper());
  590. }
  591. /**
  592. * <p>
  593. * 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
  594. * 此次修改主要是减少了此项业务代码的代码量(存在性验证之后的saveOrUpdate操作)
  595. * </p>
  596. * <p>
  597. * 该方法不推荐在多线程并发下使用,并发可能存在间隙锁的问题,可以采用先查询后判断是否更新或保存。
  598. * </p>
  599. * <p>
  600. * 该方法存在安全隐患将在后续大版本删除
  601. * </p>
  602. *
  603. * @param entity 实体对象
  604. */
  605. @Deprecated
  606. default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {
  607. return update(entity, updateWrapper) || saveOrUpdate(entity);
  608. }
  609. }