文章目录结构实体类 UserMapper 接口UserMapper.javaMapper XML 文件UserMapper.xmlService 接口IUserService.javaService 实现类UserServiceImpl.java测试类UserServiceTest.java数据库总结结构src/main/java/com/example/demo/ ├── DemoApplication.java // 启动类 ├── entity/User.java // 实体类 ├── mapper/UserMapper.java // Mapper 接口含自定义SQL ├── service/IUserService.java // Service 接口自定义方法声明 └── service/impl/UserServiceImpl.java // Service 实现类自定义方法实现 src/main/resources/ ├── application.yml // 配置文件 └── mapper/UserMapper.xml // 自定义SQL的XML文件如需 src/test/java/com/example/demo/ └── UserServiceTest.java // 测试类实体类 Userimportcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableName;importlombok.Data;DataTableName(t_user)// 对应数据库表名publicclassUser{TableId(typeIdType.AUTO)privateLongid;// 主键自增privateStringusername;// 用户名privateStringemail;// 邮箱privateIntegerage;// 年龄privateIntegerstatus;// 状态1-正常 0-禁用}Mapper 接口UserMapper.javaimportcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.example.demo.entity.User;importorg.apache.ibatis.annotations.Param;importjava.util.List;importjava.util.Map;publicinterfaceUserMapperextendsBaseMapperUser{ 自定义SQL根据年龄范围查询也可通过Wrapper实现这里演示XML方式 ListUserselectByAgeRange(Param(minAge)IntegerminAge,Param(maxAge)IntegermaxAge); 自定义SQL统计不同年龄段的用户数量 ListMapString,ObjectcountUserByAgeGroup();}Mapper XML 文件UserMapper.xml在resources/mapper下创建存放自定义SQL?xml version1.0 encodingUTF-8?!DOCTYPEmapperPUBLIC-//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmappernamespacecom.example.demo.mapper.UserMapper!-- 对应 selectByAgeRange 方法 --selectidselectByAgeRangeresultTypecom.example.demo.entity.UserSELECT id, username, email, age, status FROM t_user WHERE age BETWEEN #{minAge} AND #{maxAge}/select!-- 对应 countUserByAgeGroup 方法 --selectidcountUserByAgeGroupresultTypejava.util.MapSELECT CASE WHEN age 18 THEN 未成年 WHEN age BETWEEN 18 AND 30 THEN 青年 WHEN age BETWEEN 31 AND 50 THEN 中年 ELSE 老年 END AS age_group, COUNT(*) AS user_count FROM t_user GROUP BY age_group/select/mapperService 接口IUserService.javaimportcom.baomidou.mybatisplus.extension.service.IService;importcom.example.demo.entity.User;importjava.util.List;importjava.util.Map;publicinterfaceIUserServiceextendsIServiceUser{示例1根据年龄范围查询用户调用Mapper自定义SQLListUsergetUserByAgeRange(IntegerminAge,IntegermaxAge);示例2批量插入用户基于MP的saveBatch扩展intbatchInsertUsers(ListUseruserList);示例3根据用户名模糊查询并按年龄降序排序纯MP Wrapper实现ListUserlistUsersByUsernameLike(StringusernameKeyword);示例4统计不同年龄段的用户数量调用Mapper自定义SQLMapString,LongcountUserByAgeGroup();示例5逻辑删除状态更新业务组合操作booleandisableUserById(LonguserId);}Service 实现类UserServiceImpl.javaimportcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importcom.example.demo.entity.User;importcom.example.demo.mapper.UserMapper;importcom.example.demo.service.IUserService;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importjava.util.HashMap;importjava.util.List;importjava.util.Map;ServicepublicclassUserServiceImplextendsServiceImplUserMapper,UserimplementsIUserService{示例1调用Mapper自定义SQL实现年龄范围查询OverridepublicListUsergetUserByAgeRange(IntegerminAge,IntegermaxAge){// 非空校验业务层必备if(minAgenull||maxAgenull||minAgemaxAge){thrownewIllegalArgumentException(年龄范围参数不合法);}returnbaseMapper.selectByAgeRange(minAge,maxAge);}示例2批量插入扩展MP的saveBatch增加批次控制和返回值OverrideTransactional(rollbackForException.class)// 事务保证publicintbatchInsertUsers(ListUseruserList){if(userListnull||userList.isEmpty()){return0;}// MP的saveBatch默认批次是1000这里自定义批次大小为500booleansuccesssaveBatch(userList,500);returnsuccess?userList.size():0;}示例3纯Wrapper实现模糊查询排序OverridepublicListUserlistUsersByUsernameLike(StringusernameKeyword){LambdaQueryWrapperUserwrappernewLambdaQueryWrapperUser().like(usernameKeyword!null,User::getUsername,usernameKeyword)// 非空才拼接条件.orderByDesc(User::getAge);// 按年龄降序returnlist(wrapper);// 调用IService的默认方法}示例4统计年龄段数量处理Mapper返回的MapOverridepublicMapString,LongcountUserByAgeGroup(){ListMapString,ObjectresultListbaseMapper.countUserByAgeGroup();MapString,LongageGroupMapnewHashMap();for(MapString,Objectmap:resultList){StringageGroup(String)map.get(age_group);LonguserCount(Long)map.get(user_count);ageGroupMap.put(ageGroup,userCount);}returnageGroupMap;}示例5组合业务操作逻辑删除状态更新OverrideTransactional(rollbackForException.class)publicbooleandisableUserById(LonguserId){// 1. 查询用户是否存在UserusergetById(userId);if(usernull){returnfalse;}// 2. 更新状态为禁用0user.setStatus(0);returnupdateById(user);}}测试类UserServiceTest.javaimportcom.example.demo.DemoApplication;importcom.example.demo.entity.User;importcom.example.demo.service.IUserService;importorg.junit.jupiter.api.Test;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.test.context.SpringBootTest;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;SpringBootTest(classesDemoApplication.class)publicclassUserServiceTest{AutowiredprivateIUserServiceuserService;// 测试示例1年龄范围查询TestpublicvoidtestUserByAgeRange(){ListUseruserListuserService.getUserByAgeRange(18,30);System.out.println(18-30岁用户userList);}// 测试示例2批量插入TestpublicvoidtestBatchInsert(){ListUseruserListnewArrayList();Useru1newUser();u1.setUsername(张三);u1.setEmail(zhangsantest.com);u1.setAge(25);u1.setStatus(1);Useru2newUser();u2.setUsername(李四);u2.setEmail(lisitest.com);u2.setAge(28);u2.setStatus(1);userList.add(u1);userList.add(u2);intcountuserService.batchInsertUsers(userList);System.out.println(批量插入成功数量count);}// 测试示例3模糊查询排序TestpublicvoidtestListByUsernameLike(){ListUseruserListuserService.listUsersByUsernameLike(张);System.out.println(用户名含张的用户按年龄降序userList);}// 测试示例4统计年龄段TestpublicvoidtestCountAgeGroup(){MapString,LongageGroupMapuserService.countUserByAgeGroup();System.out.println(年龄段统计ageGroupMap);}// 测试示例5禁用用户TestpublicvoidtestDisableUser(){booleansuccessuserService.disableUserById(1L);System.out.println(禁用用户是否成功success);}}数据库CREATETABLEt_user(idbigintNOTNULLAUTO_INCREMENTCOMMENT主键,usernamevarchar(50)NOTNULLCOMMENT用户名,emailvarchar(100)DEFAULTNULLCOMMENT邮箱,ageintDEFAULTNULLCOMMENT年龄,statusintDEFAULT1COMMENT状态1-正常 0-禁用,PRIMARYKEY(id))ENGINEInnoDBDEFAULTCHARSETutf8mb4;总结自定义Service方法的核心继承IService/ServiceImpl后可通过baseMapper调用自定义Mapper方法或通过Wrapper直接使用MP的内置方法。关键规范业务层必须做参数校验避免非法输入批量操作/组合操作需加Transactional保证事务复杂SQL建议写在XML中简单条件用Wrapper更简洁。扩展思路自定义方法可覆盖“查询封装、批量操作、业务组合、数据统计”等场景核心是复用MP的基础能力同时适配业务需求。
3种策略管理Playnite便携版:从基础部署到高级维护的完整指南 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址…