新浪微博 搭建网站,哪个做网站的公司好,建设跨境网站,六间房直播大厅官网实现思路
分层封装#xff1a;按 Entity、Mapper、Service、Controller 四层分别封装通用基类泛型约束#xff1a;全程使用泛型 T 约束实体类型#xff0c;保证类型安全通用能力#xff1a;封装增删改查、分页、条件查询等核心操作#xff0c;业务层只需继承即可使用标准化…实现思路分层封装按 Entity、Mapper、Service、Controller 四层分别封装通用基类泛型约束全程使用泛型 T 约束实体类型保证类型安全通用能力封装增删改查、分页、条件查询等核心操作业务层只需继承即可使用标准化接口提供 RESTful 风格的通用接口业务 Controller 直接继承即可对外暴露接口完整代码实现必要依赖Maven!-- MyBatis-Plus --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3.1/version/dependency!-- Lombok简化实体类编写 --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency!-- Web依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency配置 MyBatis-Plus 分页插件同前文。1. 通用实体基类BaseEntityimportcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableLogic;importlombok.Data;importjava.io.Serializable;importjava.time.LocalDateTime;/** * 所有实体类的基类封装通用字段 * param ID 主键类型 */DatapublicclassBaseEntityIDextendsSerializableimplementsSerializable{privatestaticfinallongserialVersionUID1L;/** * 主键ID */TableId(typeIdType.AUTO)privateIDid;/** * 创建时间 */privateLocalDateTimecreateTime;/** * 更新时间 */privateLocalDateTimeupdateTime;/** * 逻辑删除标识0-未删除1-已删除 */TableLogicprivateIntegerisDeleted;}2. 通用 Mapper 基类BaseMapperimportcom.baomidou.mybatisplus.core.mapper.BaseMapper;importorg.apache.ibatis.annotations.Param;importjava.io.Serializable;importjava.util.List;/** * 通用Mapper基类继承MyBatis-Plus的BaseMapper并扩展通用方法 * param T 实体类型 */publicinterfaceBaseMapperTextendsBaseEntity?extendscom.baomidou.mybatisplus.core.mapper.BaseMapperT{/** * 批量插入自定义可选 */intinsertBatch(Param(list)ListTlist);}3. 通用 Service 接口IBaseServiceimportcom.baomidou.mybatisplus.core.conditions.Wrapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.extension.service.IService;importjava.io.Serializable;importjava.util.List;/** * 通用Service接口 * param T 实体类型 */publicinterfaceIBaseServiceTextendsBaseEntity?extendsIServiceT{// 新增booleanadd(Tentity);booleanaddBatch(ListTentityList);// 删除booleandeleteById(Serializableid);booleandeleteBatchByIds(List?extendsSerializableids);booleandelete(WrapperTqueryWrapper);// 更新booleanupdate(Tentity);booleanupdate(Tentity,WrapperTupdateWrapper);// 查询TgetById(Serializableid);ListTlistAll();ListTlist(WrapperTqueryWrapper);IPageTpageList(IntegerpageNum,IntegerpageSize);IPageTpageList(IntegerpageNum,IntegerpageSize,WrapperTqueryWrapper);TgetOne(WrapperTqueryWrapper);longcount(WrapperTqueryWrapper);}4. 通用 Service 实现类BaseServiceImplimportcom.baomidou.mybatisplus.core.conditions.Wrapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.core.toolkit.Wrappers;importcom.baomidou.mybatisplus.extension.plugins.pagination.Page;importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importorg.springframework.stereotype.Service;importjava.io.Serializable;importjava.util.List;/** * 通用Service实现类 * param M Mapper类型 * param T 实体类型 */ServicepublicclassBaseServiceImplMextendsBaseMapperT,TextendsBaseEntity?extendsServiceImplM,TimplementsIBaseServiceT{Overridepublicbooleanadd(Tentity){returnsave(entity);}OverridepublicbooleanaddBatch(ListTentityList){returnsaveBatch(entityList);}OverridepublicbooleandeleteById(Serializableid){returnremoveById(id);}OverridepublicbooleandeleteBatchByIds(List?extendsSerializableids){returnremoveByIds(ids);}Overridepublicbooleandelete(WrapperTqueryWrapper){returnremove(queryWrapper);}Overridepublicbooleanupdate(Tentity){returnupdateById(entity);}Overridepublicbooleanupdate(Tentity,WrapperTupdateWrapper){returnupdate(entity,updateWrapper);}OverridepublicTgetById(Serializableid){returngetBaseMapper().selectById(id);}OverridepublicListTlistAll(){returnlist(Wrappers.emptyWrapper());}OverridepublicListTlist(WrapperTqueryWrapper){returnsuper.list(queryWrapper);}OverridepublicIPageTpageList(IntegerpageNum,IntegerpageSize){PageTpagenewPage(pageNum,pageSize);returnpage(page,Wrappers.emptyWrapper());}OverridepublicIPageTpageList(IntegerpageNum,IntegerpageSize,WrapperTqueryWrapper){PageTpagenewPage(pageNum,pageSize);returnpage(page,queryWrapper);}OverridepublicTgetOne(WrapperTqueryWrapper){returngetOne(queryWrapper,false);}Overridepubliclongcount(WrapperTqueryWrapper){returnsuper.count(queryWrapper);}}5. 通用 Controller 基类BaseControllerimportcom.baomidou.mybatisplus.core.conditions.Wrapper;importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.core.toolkit.Wrappers;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.*;importjava.io.Serializable;importjava.util.List;/** * 通用Controller基类提供RESTful风格的通用接口 * param T 实体类型 * param S Service类型 */publicabstractclassBaseControllerTextendsBaseEntity?,SextendsIBaseServiceT{AutowiredprotectedSservice;/** * 新增 */PostMapping(/add)publicbooleanadd(RequestBodyTentity){returnservice.add(entity);}/** * 批量新增 */PostMapping(/add/batch)publicbooleanaddBatch(RequestBodyListTentityList){returnservice.addBatch(entityList);}/** * 根据ID删除 */DeleteMapping(/{id})publicbooleandeleteById(PathVariableSerializableid){returnservice.deleteById(id);}/** * 批量删除 */DeleteMapping(/batch)publicbooleandeleteBatchByIds(RequestParamList?extendsSerializableids){returnservice.deleteBatchByIds(ids);}/** * 更新 */PutMapping(/update)publicbooleanupdate(RequestBodyTentity){returnservice.update(entity);}/** * 根据ID查询 */GetMapping(/{id})publicTgetById(PathVariableSerializableid){returnservice.getById(id);}/** * 查询所有 */GetMapping(/list)publicListTlistAll(){returnservice.listAll();}/** * 分页查询 */GetMapping(/page)publicIPageTpageList(RequestParamIntegerpageNum,RequestParamIntegerpageSize){returnservice.pageList(pageNum,pageSize);}/** * 条件查询示例根据字段名和值查询 */GetMapping(/list/condition)publicListTlistByCondition(RequestParamStringfieldName,RequestParamStringvalue){LambdaQueryWrapperTwrapperWrappers.lambdaQuery();// 通用条件查询示例实际可根据业务扩展wrapper.eq(true,fieldName,value);returnservice.list(wrapper);}/** * 条件分页查询 */GetMapping(/page/condition)publicIPageTpageListByCondition(RequestParamIntegerpageNum,RequestParamIntegerpageSize,RequestParamStringfieldName,RequestParamStringvalue){LambdaQueryWrapperTwrapperWrappers.lambdaQuery();wrapper.eq(true,fieldName,value);returnservice.pageList(pageNum,pageSize,wrapper);}}业务层使用示例1. 业务实体类Userimportlombok.Data;importlombok.EqualsAndHashCode;/** * 用户实体类 */DataEqualsAndHashCode(callSupertrue)publicclassUserextendsBaseEntityLong{/** * 用户名 */privateStringuserName;/** * 密码 */privateStringpassword;/** * 手机号 */privateStringphone;/** * 邮箱 */privateStringemail;}2. 业务 MapperUserMapper/** * 用户Mapper */publicinterfaceUserMapperextendsBaseMapperUser{// 无需编写基础CRUD方法直接继承即可}3. 业务 Service 接口IUserService/** * 用户Service接口 */publicinterfaceIUserServiceextendsIBaseServiceUser{// 可扩展自定义业务方法UsergetUserByUserName(StringuserName);}4. 业务 Service 实现类UserServiceImplimportorg.springframework.stereotype.Service;/** * 用户Service实现类 */ServicepublicclassUserServiceImplextendsBaseServiceImplUserMapper,UserimplementsIUserService{OverridepublicUsergetUserByUserName(StringuserName){returngetOne(Wrappers.UserlambdaQuery().eq(User::getUserName,userName));}}5. 业务 ControllerUserControllerimportorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;/** * 用户Controller */RestControllerRequestMapping(/user)publicclassUserControllerextendsBaseControllerUser,IUserService{// 无需编写基础接口直接继承即可// 可扩展自定义接口GetMapping(/name/{userName})publicUsergetUserByUserName(PathVariableStringuserName){returnservice.getUserByUserName(userName);}}总结整套封装基于泛型 T 实现了从 Entity 到 Controller 的全层通用化所有业务模块只需继承对应基类即可拥有完整的基础 CRUD 能力。BaseEntity 封装了通用字段ID、创建时间、更新时间、逻辑删除避免各实体重复定义BaseController 提供了标准化的 RESTful 接口无需重复编写。保留了扩展能力业务层可在继承基类的基础上灵活扩展自定义的业务方法和接口。