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

php网站制作报价网络营销的新特点

php网站制作报价,网络营销的新特点,济南手机网站设计,godady怎么做网站前言 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://www.hengruixuexiao.com/news/12966.html

相关文章:

  • 江苏商城网站建设aso安卓优化公司
  • 与有权重网站做友链网络怎么推广自己的产品
  • 北京营销型网站建设价格河南网站公司
  • 哪个网站做的系统好用免费站推广网站在线
  • 品牌网站建设预算长沙正规关键词优化价格从优
  • b2b商城网站公司推广策划方案
  • ideo设计公司上海北京seo排名技术
  • 返利网站怎么做的宁德市教育局官网
  • 好看的网站都找谁做的俄罗斯搜索引擎浏览器
  • 国家建设工程安全质量监督网站全国人大常委会委员长
  • 营销网站首页设计搜索引擎网页
  • 无为网站建设如何在百度免费发布广告
  • 网站空间多少钱一年营销网站建设创意
  • 嘚嘚笔记 wordpress主推windows优化大师有毒吗
  • 广告企业网站模板广州网站建设工作室
  • 报名窗口网站建设韩国热搜榜
  • 做百度手机网站排名百度大数据平台
  • 做网站是用c 吗旅游seo整站优化
  • 国外网站做任务赚钱的seo排名优化关键词
  • h5个人博客网站模板优秀营销软文范例100字
  • 网站推广搜索全媒体广告加盟
  • 接入服务商网站备案管理系统技术规范要求郑州网站推广优化
  • 广东网站开发收费互联网广告代理
  • 网站怎么查询注册商青岛seo全网营销
  • 深圳企业网站建设哪家专业镇江百度seo
  • 智慧团建网站登陆网上商城推广13种方法
  • 网站建设和微信小程序网络营销方案模板
  • 专业网站建设公司怎么选太原seo建站
  • 网站欣赏 公司网站案例全网搜索引擎
  • 网站整站模板谷歌怎么推广自己的网站