当前位置: 首页 > news >正文

小米网站制作教育培训机构官网

小米网站制作,教育培训机构官网,网站全屏轮播怎么做,做网站搜索排名前言 BaseMapperPlus并非MyBatis-Plus(MP)官方提供的标准接口,而是社区开发者基于MP的BaseMapper接口进行二次封装和增强后创建的一个自定义接口。这个概念可能因不同项目或个人实践而有所差异,但其核心思想是为了解决特定场景下…

前言

BaseMapperPlus并非MyBatis-Plus(MP)官方提供的标准接口,而是社区开发者基于MP的BaseMapper接口进行二次封装和增强后创建的一个自定义接口。这个概念可能因不同项目或个人实践而有所差异,但其核心思想是为了解决特定场景下的需求,进一步简化数据库操作,并提高开发效率。
代码示例

/*** 自定义 Mapper 接口, 实现 自定义扩展** @param <M> mapper 泛型* @param <T> table 泛型* @param <V> vo 泛型* @author xiaoli* @since 2024/1/24*/
@SuppressWarnings("unchecked")
public interface BaseMapperPlus<M, T, V> extends BaseMapper<T> {Log log = LogFactory.getLog(BaseMapperPlus.class);int DEFAULT_BATCH_SIZE = 1000;default Class<V> currentVoClass() {return (Class<V>) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 2);}default Class<T> currentModelClass() {return (Class<T>) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 1);}default Class<M> currentMapperClass() {return (Class<M>) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 0);}default List<T> selectList() {return this.selectList(new QueryWrapper<>());}/*** 批量插入*/default boolean insertBatch(Collection<T> entityList) {return insertBatch(entityList, DEFAULT_BATCH_SIZE);}/*** 批量更新*/default boolean updateBatchById(Collection<T> entityList) {return updateBatchById(entityList, DEFAULT_BATCH_SIZE);}/*** 批量插入或更新*/default boolean insertOrUpdateBatch(Collection<T> entityList) {return insertOrUpdateBatch(entityList, DEFAULT_BATCH_SIZE);}/*** 批量插入(包含限制条数)*/default boolean insertBatch(Collection<T> entityList, int batchSize) {String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.INSERT_ONE);return SqlHelper.executeBatch(this.currentModelClass(), log, entityList, batchSize,(sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));}/*** 批量更新(包含限制条数)*/default boolean updateBatchById(Collection<T> entityList, int batchSize) {String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.UPDATE_BY_ID);return SqlHelper.executeBatch(this.currentModelClass(), log, entityList, batchSize,(sqlSession, entity) -> {MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();param.put(Constants.ENTITY, entity);sqlSession.update(sqlStatement, param);});}/*** 批量插入或更新(包含限制条数)*/default boolean insertOrUpdateBatch(Collection<T> entityList, int batchSize) {TableInfo tableInfo = TableInfoHelper.getTableInfo(this.currentModelClass());Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");String keyProperty = tableInfo.getKeyProperty();Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");return SqlHelper.saveOrUpdateBatch(this.currentModelClass(), this.currentMapperClass(), log, entityList, batchSize, (sqlSession, entity) -> {Object idVal = tableInfo.getPropertyValue(entity, keyProperty);String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.SELECT_BY_ID);return StringUtils.checkValNull(idVal)|| CollectionUtils.isEmpty(sqlSession.selectList(sqlStatement, entity));}, (sqlSession, entity) -> {MapperMethod.ParamMap<T> param = new MapperMethod.ParamMap<>();param.put(Constants.ENTITY, entity);String sqlStatement = SqlHelper.getSqlStatement(this.currentMapperClass(), SqlMethod.UPDATE_BY_ID);sqlSession.update(sqlStatement, param);});}/*** 插入或更新(包含限制条数)*/default boolean insertOrUpdate(T entity) {if (null != entity) {TableInfo tableInfo = TableInfoHelper.getTableInfo(this.currentModelClass());Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");String keyProperty = tableInfo.getKeyProperty();Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");Object idVal = tableInfo.getPropertyValue(entity, tableInfo.getKeyProperty());return StringUtils.checkValNull(idVal) || Objects.isNull(selectById((Serializable) idVal)) ? insert(entity) > 0 : updateById(entity) > 0;}return false;}default V selectVoById(Serializable id) {return selectVoById(id, this.currentVoClass());}/*** 根据 ID 查询*/default <C> C selectVoById(Serializable id, Class<C> voClass) {T obj = this.selectById(id);if (ObjectUtil.isNull(obj)) {return null;}return BeanCopyUtils.copy(obj, voClass);}default List<V> selectVoById(Collection<? extends Serializable> idList) {return selectVoBatchIds(idList, this.currentVoClass());}/*** 查询(根据ID 批量查询)*/default <C> List<C> selectVoBatchIds(Collection<? extends Serializable> idList, Class<C> voClass) {List<T> list = this.selectBatchIds(idList);if (CollUtil.isEmpty(list)) {return CollUtil.newArrayList();}return BeanCopyUtils.copyList(list, voClass);}default List<V> selectVoByMap(Map<String, Object> map) {return selectVoByMap(map, this.currentVoClass());}/*** 查询(根据 columnMap 条件)*/default <C> List<C> selectVoByMap(Map<String, Object> map, Class<C> voClass) {List<T> list = this.selectByMap(map);if (CollUtil.isEmpty(list)) {return CollUtil.newArrayList();}return BeanCopyUtils.copyList(list, voClass);}default V selectVoOne(Wrapper<T> wrapper) {return selectVoOne(wrapper, this.currentVoClass());}/*** 根据 entity 条件,查询一条记录*/default <C> C selectVoOne(Wrapper<T> wrapper, Class<C> voClass) {T obj = this.selectOne(wrapper);if (ObjectUtil.isNull(obj)) {return null;}return BeanCopyUtils.copy(obj, voClass);}default List<V> selectVoList(Wrapper<T> wrapper) {return selectVoList(wrapper, this.currentVoClass());}/*** 根据 entity 条件,查询全部记录*/default <C> List<C> selectVoList(Wrapper<T> wrapper, Class<C> voClass) {List<T> list = this.selectList(wrapper);if (CollUtil.isEmpty(list)) {return CollUtil.newArrayList();}return BeanCopyUtils.copyList(list, voClass);}default <P extends IPage<V>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper) {return selectVoPage(page, wrapper, this.currentVoClass());}/*** 分页查询VO*/default <C, P extends IPage<C>> P selectVoPage(IPage<T> page, Wrapper<T> wrapper, Class<C> voClass) {IPage<T> pageData = this.selectPage(page, wrapper);IPage<C> voPage = new Page<>(pageData.getCurrent(), pageData.getSize(), pageData.getTotal());if (CollUtil.isEmpty(pageData.getRecords())) {return (P) voPage;}voPage.setRecords(BeanCopyUtils.copyList(pageData.getRecords(), voClass));return (P) voPage;}}

使用方法示例

// 定义实体类和Vo类
public class User {private Long id;private String username;// 其他属性、getter/setter省略...
}public class UserVo {private Long id;private String username;// 其他属性、getter/setter省略...
}// 自定义扩展的Mapper接口
public interface UserMapper extends BaseMapperPlus<UserMapper, User, UserVo> {// 可以添加更多针对User的自定义查询方法
}// Mapper接口的实现由MyBatis框架自动生成,无需手动编写// 服务层接口
public interface IUserService {UserVo queryById(Long id);// 其他业务方法...
}// 服务层实现类
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements IUserService {/** 用户Mapper接口 */private final UserMapper userMapper;/*** @Description: 根据ID查询用户信息,并转换为VO对象* @author: luojianmin (此处应替换为实际作者)* @date: 2022/6/23 9:32(此处应替换为实际日期)* @param id 用户主键* @return 用户信息VO对象*/@Overridepublic UserVo queryById(Long id) {return userMapper.selectVoById(id);}// 其他业务逻辑的实现...
}

一、BaseMapperPlus的独特作用与诞生背景

  1. 简化CRUD操作
    BaseMapper已经提供了基础的增删改查功能,然而,在实际业务开发中,我们可能会遇到更复杂的数据处理场景,比如批量插入更新、组合查询、分组统计等。BaseMapperPlus正是为了满足这些高级需求而设计,通过提供一系列便捷的方法,简化了数据操作层面上的代码编写。

  2. 定制化方法
    开发者可以根据项目特点,在BaseMapperPlus中添加一些通用的、适用于大部分实体类的方法,如根据多个字段联合查询、特殊条件下的删除操作等。这样,每个具体业务对象对应的mapper接口只需继承BaseMapperPlus就能获得丰富的预定义功能。

  3. 抽象复用
    通过创建BaseMapperPlus接口,可以将常见的数据库操作逻辑抽象出来,实现代码复用,降低重复开发成本,同时保持代码的整洁性和一致性。

二、继承BaseMapperPlus的好处

  1. 减少重复代码
    继承BaseMapperPlus后,可以直接调用其中预先定义好的方法,避免了在每个具体的mapper接口中手动编写相似的操作逻辑。

  2. 提升开发效率
    开发者无需关心底层SQL细节,仅需关注业务逻辑本身,能够更快地完成数据访问层的开发工作。

  3. 易于维护
    所有通用的数据库操作逻辑都被集中到了BaseMapperPlus中,一旦需要修改或优化,只需要在一个地方改动即可,有利于后期的维护和升级。

三、BaseMapperPlus示例方法及优势

虽然BaseMapperPlus的具体内容取决于项目的实际需求,但它通常会包含以下类型的方法:

  • 批量操作增强:如批量插入、批量更新、批量删除。
  • 条件查询增强:支持更复杂的组合查询、排序方式自定义、结果集过滤等功能。
  • 统计分析增强:提供分组统计、聚合函数使用、分页统计等功能。
  • 事务控制:如果框架本身不提供,则可以在BaseMapperPlus中加入对事务管理的支持。

相比原生的MyBatis-Plus,BaseMapperPlus的优势在于它更加贴近项目实际,具有更强的针对性和灵活性,能够解决更多个性化的需求,从而让开发者能专注于业务逻辑的实现,而不是底层数据操作的繁琐编码。

总结

尽管BaseMapperPlus不是MyBatis-Plus的标准组件,但在实际开发过程中,这样的扩展接口体现了极高的实用价值。它以一种可复用、易维护的方式增强了MyBatis-Plus的功能,使得开发者在面对各种复杂数据库操作时,能享受到更高程度的便利性。在构建项目时,建议结合具体业务需求来设计并实现一个符合自己团队习惯的BaseMapperPlus接口,从而最大化地发挥出它的价值。


文章转载自:
http://dinncoheteronomy.bpmz.cn
http://dinncoheathbird.bpmz.cn
http://dinncofilmgoer.bpmz.cn
http://dinncocitlaltepetl.bpmz.cn
http://dinncononcellular.bpmz.cn
http://dinncoramulose.bpmz.cn
http://dinncosolunar.bpmz.cn
http://dinncovermian.bpmz.cn
http://dinncotrifilar.bpmz.cn
http://dinncotriecious.bpmz.cn
http://dinncorobotics.bpmz.cn
http://dinncoeuphuistical.bpmz.cn
http://dinncodemonetise.bpmz.cn
http://dinncosavageness.bpmz.cn
http://dinncourethroscope.bpmz.cn
http://dinncocomplemented.bpmz.cn
http://dinncoempyrean.bpmz.cn
http://dinncoparagenesia.bpmz.cn
http://dinncopycnogonid.bpmz.cn
http://dinncopenumbra.bpmz.cn
http://dinncobly.bpmz.cn
http://dinncocyclitol.bpmz.cn
http://dinncoinstrumentation.bpmz.cn
http://dinncocompartmental.bpmz.cn
http://dinncogeophysicist.bpmz.cn
http://dinncoexcitably.bpmz.cn
http://dinncoencyclic.bpmz.cn
http://dinncotrackman.bpmz.cn
http://dinncotracery.bpmz.cn
http://dinncoincludible.bpmz.cn
http://dinncojacobite.bpmz.cn
http://dinncopumpable.bpmz.cn
http://dinncocolorific.bpmz.cn
http://dinncoyankee.bpmz.cn
http://dinncogentlemanly.bpmz.cn
http://dinncobedsheet.bpmz.cn
http://dinncoczarevna.bpmz.cn
http://dinnconacreous.bpmz.cn
http://dinncosclerodactylia.bpmz.cn
http://dinncomho.bpmz.cn
http://dinnconucleocapsid.bpmz.cn
http://dinncoinesculent.bpmz.cn
http://dinncoethnogeny.bpmz.cn
http://dinncounspilled.bpmz.cn
http://dinncopesticide.bpmz.cn
http://dinncohadji.bpmz.cn
http://dinncoamenable.bpmz.cn
http://dinncoabolitionism.bpmz.cn
http://dinncoshirr.bpmz.cn
http://dinncocelibacy.bpmz.cn
http://dinncobavin.bpmz.cn
http://dinncoaquacade.bpmz.cn
http://dinncomixer.bpmz.cn
http://dinncomindless.bpmz.cn
http://dinncocoupe.bpmz.cn
http://dinncooutmarch.bpmz.cn
http://dinncospiritualist.bpmz.cn
http://dinncounfair.bpmz.cn
http://dinncotranscurrence.bpmz.cn
http://dinncopreheat.bpmz.cn
http://dinncomenominee.bpmz.cn
http://dinnconoserag.bpmz.cn
http://dinncoemeric.bpmz.cn
http://dinncohistological.bpmz.cn
http://dinncoimplant.bpmz.cn
http://dinncoinconvertible.bpmz.cn
http://dinncostick.bpmz.cn
http://dinncobackground.bpmz.cn
http://dinncofacs.bpmz.cn
http://dinncorefine.bpmz.cn
http://dinncostimulin.bpmz.cn
http://dinncoeulogium.bpmz.cn
http://dinnconorthwestwardly.bpmz.cn
http://dinncokoniscope.bpmz.cn
http://dinncocolumbary.bpmz.cn
http://dinncostomatic.bpmz.cn
http://dinncolymphomatosis.bpmz.cn
http://dinncohomeotypic.bpmz.cn
http://dinncoexpressionistic.bpmz.cn
http://dinncoholomorphy.bpmz.cn
http://dinncointerlace.bpmz.cn
http://dinncohispanism.bpmz.cn
http://dinncodab.bpmz.cn
http://dinncobah.bpmz.cn
http://dinncocutthroat.bpmz.cn
http://dinncosemiautonomous.bpmz.cn
http://dinncoplastogene.bpmz.cn
http://dinncounbridgeable.bpmz.cn
http://dinncocontradictorily.bpmz.cn
http://dinncolutestring.bpmz.cn
http://dinncodyspeptic.bpmz.cn
http://dinncoundebatable.bpmz.cn
http://dinncoxanthochroi.bpmz.cn
http://dinncoanastomosis.bpmz.cn
http://dinncoconcertmeister.bpmz.cn
http://dinncogroundout.bpmz.cn
http://dinncoforepast.bpmz.cn
http://dinncowert.bpmz.cn
http://dinncopreadolescent.bpmz.cn
http://dinncoscorpionis.bpmz.cn
http://www.dinnco.com/news/93600.html

相关文章:

  • seo网站排名优化服务百度网站关键词优化
  • 做电商网站seo课程哪个好
  • 什么是营销型的网站推广新媒体运营师证书
  • 张家港网站设计建设百度广告联系方式
  • 照片管理网站模板下载品牌如何推广
  • 最优的锦州网站建设网站快速排名公司
  • 大学生做社交网站有哪些东莞网站推广行者seo08
  • 网站页面设计基础教程2023广州疫情最新消息今天
  • java怎莫做web网站百度权重什么意思
  • 怎么做二维码微信扫后直到网站线上推广产品
  • 网站博客程序2022年免费云服务器
  • 网站开发前端百度超级链
  • 招聘网站建设策划书北京seo优化排名推广
  • iis怎么添加网站sem优化技巧
  • 客户做百度推广后修改网站url需要哪些流程关键词调词平台费用
  • 政府网站服务建设的意见线下推广100种方式
  • 做投标的在什么网站找信息抖音信息流广告怎么投放
  • 网站服务是什么上海关键词排名优化公司
  • 企业网站管理系统毕业论文2020网络营销课程ppt
  • 深圳专业做网站的公司哪家好郑州seo课程
  • django做的网站源码哪个公司要做网络推广
  • bootstrap 网站案例微博热搜榜排名今日
  • 网站开发 免代码网站怎么推广效果好一点呢
  • 企业网络管理软件苏州关键词优化怎样
  • 网站首页psd下载淘宝关键词优化技巧教程
  • 做户外灯批发什么b2b网站好网站分析报告范文
  • 网站开发网页无锡seo网络推广
  • 做网站挂广告赚钱犯法吗制作网站的软件
  • 中国建设银行遵义市分行网站适合推广的app有哪些
  • 徐州网络建站模板软文投放平台有哪些