3天从0到1掌握my-spring-helper:解放80%CRUD工作的SpringBoot神器
你还在为重复编写CRUD代码而抓狂?还在为项目搭建时的繁琐配置而头疼?本文将带你3天吃透my-spring-helper这个简洁强大的SpringBoot框架,彻底摆脱重复劳动,让你专注于业务逻辑开发。读完本文你将获得:
- 从环境搭建到项目实战的完整流程
- 自定义代码模板生成的核心技巧
- 通用Mapper的高级用法与最佳实践
- 10+企业级工具类的实战应用
- 3个真实业务场景的完整实现方案
一、框架介绍:为什么选择my-spring-helper?
1.1 框架定位与核心优势
my-spring-helper是一个简洁易用的SpringBoot项目框架,专注于解决日常开发中的痛点问题。其核心优势在于:
| 特性 | 传统开发 | my-spring-helper | 效率提升 |
|---|---|---|---|
| CRUD代码编写 | 手动编写,重复劳动 | 模板自动生成 | 80% |
| SQL操作 | 手写SQL或复杂XML配置 | 通用Mapper一键搞定 | 60% |
| 项目搭建 | 繁琐配置,依赖管理复杂 | 开箱即用,约定优于配置 | 90% |
| 工具类集成 | 零散引入,版本冲突 | 内置20+常用工具类 | 50% |
1.2 框架整体架构
1.3 适用场景与人群
- 适用场景:中小型企业级应用、后台管理系统、RESTful API服务
- 目标人群:SpringBoot初学者、需要提升开发效率的后端开发者、厌倦重复劳动的程序员
二、环境搭建:3步完成框架部署
2.1 环境准备
开发环境要求:
- JDK 8+
- Maven 3.5+
- MySQL 5.7+
- Git
检查环境配置:
# 检查JDK版本
java -version
# 检查Maven版本
mvn -v
# 检查Git版本
git --version
2.2 获取源码
# 克隆仓库
git clone https://gitcode.com/qq_41089021/my-spring-helper.git
# 进入项目目录
cd my-spring-helper
2.3 项目结构解析
my-spring-helper/
├── keller-server/ # 业务模块示例
├── keller-starter/ # 核心框架代码
│ ├── generator/ # 代码生成器
│ ├── mybatis/ # 通用Mapper实现
│ ├── tools/ # 工具类库
│ └── web/ # Web相关基础类
├── sql/ # 数据库脚本
└── template/ # 代码模板
2.4 快速启动项目
# 编译项目
mvn clean package -Dmaven.test.skip=true
# 运行应用
cd keller-server
java -jar target/keller-server.jar
三、核心功能详解:从入门到精通
3.1 代码生成器:一键生成全套代码
3.1.1 生成器核心原理
代码生成器基于模板引擎实现,通过数据库表结构信息,结合自定义模板,自动生成实体类、Mapper、Service、Controller等全套代码。
核心类关系如下:
3.1.2 快速使用示例
// 创建表参数对象
TableParams params = new TableParams();
params.setPackageName("com.coder4j.biz");
params.initTables("user", "order", "product");
// 创建数据库连接信息
TableConnection connection = new TableConnection();
connection.setUrl("jdbc:mysql://localhost:3306/test");
connection.setUsername("root");
connection.setPassword("123456");
// 初始化JDBC模板
JdbcTemplate jdbcTemplate = GeneratorUtil.initJdbcTemplate(connection);
// 创建生成器服务并生成代码
GeneratorService generatorService = new GeneratorService();
generatorService.createJavaAndVue(params);
3.1.3 自定义模板
框架提供了默认模板,但也支持自定义模板以满足特定需求。模板文件位于template/目录下:
template/
├── BaseEntity.txt # 基础实体类模板
├── Controller.txt # 控制器模板
├── Service.txt # 服务接口模板
├── ServiceImpl.txt # 服务实现模板
├── VO.txt # 视图对象模板
├── VueApi.txt # Vue API模板
├── VueIndex.txt # Vue列表页模板
└── VueForm.txt # Vue表单页模板
自定义模板示例(Controller.txt):
package ${packageName}.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.coder4j.${moduleName}.service.${className}Service;
import com.coder4j.${moduleName}.vo.${className}VO;
import com.coder4j.${moduleName}.vo.${className}Query;
import com.coder4j.starter.web.R;
import javax.annotation.Resource;
@RestController
public class ${className}Controller {
@Resource
private ${className}Service ${className?uncap_first}Service;
@PostMapping("/save")
public R save(@RequestBody ${className}VO vo) {
return ${className?uncap_first}Service.baseSaveVO(vo);
}
@PostMapping("/deleteById")
public R deleteById(Long id) {
return ${className?uncap_first}Service.baseDeleteById(id);
}
@PostMapping("/list")
public R list(@RequestBody ${className}Query query) {
return R.success(${className?uncap_first}Service.basePageVO(query));
}
}
3.2 通用Mapper:告别SQL编写
3.2.1 BaseMapper核心功能
BaseMapper提供了一系列CRUD操作的默认实现,无需编写XML或SQL语句:
public interface BaseMapper<T> {
// 插入操作
int insert(T entity);
int insertSelective(T entity);
// 更新操作
int updateById(T entity);
int updateByIdSelective(T entity);
// 删除操作
int deleteById(Object id);
// 查询操作
T selectById(Object id);
List<T> selectList(@Param("query") BaseQuery<T> query);
PageInfo<T> selectPage(@Param("query") BaseQuery<T> query);
int selectCount(@Param("query") BaseQuery<T> query);
}
3.2.2 实体类定义规范
// 基础实体类示例
public class UserEntity extends BaseEntity {
private String username;
private String password;
private Integer age;
private LocalDateTime createTime;
// getter和setter省略
}
// 带逻辑删除的实体类示例
public class ProductEntity extends BaseSoftDeleteEntity {
private String name;
private BigDecimal price;
private Integer stock;
// getter和setter省略
}
3.2.3 高级查询功能
BaseQuery提供了强大的查询构建能力:
// 创建查询对象
UserQuery query = new UserQuery();
// 设置条件
query.setUsernameLike("admin");
query.setAgeGt(18);
query.setCreateTimeBetween(LocalDateTime.of(2023, 1, 1, 0, 0), LocalDateTime.now());
// 设置排序
query.setOrderBy("create_time desc");
// 设置分页
query.setPageNum(1);
query.setPageSize(10);
// 执行查询
List<UserEntity> userList = userMapper.selectList(query);
PageInfo<UserEntity> userPage = userMapper.selectPage(query);
3.3 基础服务:IBaseService与BaseServiceImpl
3.3.1 接口定义与实现
IBaseService定义了基础的业务方法,BaseServiceImpl提供了默认实现:
public interface IBaseService<T, V, Q extends BaseQuery<T>> {
// 保存操作
R baseSave(T entity);
R baseSaveVO(V vo);
// 查询操作
T baseGetById(Object id);
V baseGetVOById(Object id);
List<T> baseList(Q query);
List<V> baseListVO(Q query);
PageInfo<T> basePage(Q query);
PageInfo<V> basePageVO(Q query);
// 删除操作
R baseDeleteById(Object id);
// 其他操作
int baseCount(Q query);
}
3.3.2 服务层实现示例
@Service
public class UserServiceImpl extends BaseServiceImpl<UserEntity, UserVO, UserQuery> implements UserService {
@Resource
private UserMapper userMapper;
@Override
public BaseMapper<UserEntity> getBaseMapper() {
return userMapper;
}
@Override
public UserVO entity2Vo(UserEntity entity) {
// 实体类转VO
UserVO vo = new UserVO();
BeanUtils.copyProperties(entity, vo);
return vo;
}
@Override
public UserEntity vo2Entity(UserVO vo) {
// VO转实体类
UserEntity entity = new UserEntity();
BeanUtils.copyProperties(vo, entity);
return entity;
}
// 自定义业务方法
public R login(String username, String password) {
UserQuery query = new UserQuery();
query.setUsername(username);
UserEntity user = baseQueryOne(query);
if (user == null || !password.equals(user.getPassword())) {
return R.error("用户名或密码错误");
}
// 生成token等登录逻辑
return R.success(token);
}
}
四、工具类库:20+实用工具类
4.1 常用工具类速查表
| 工具类 | 主要功能 | 核心方法示例 |
|---|---|---|
| DateUtils | 日期时间处理 | getDate(), parseDate(), getDurationString() |
| StringUtils | 字符串处理 | firstToUpper(), humpToLine(), lineToHump() |
| Md5Utils | MD5加密 | getMd5String() |
| AESUtils | AES加密解密 | encodeAES(), decodeAES() |
| ExcelUtils | Excel导入导出 | exportClass(), importExcel() |
| ReflectUtils | 反射工具 | getValue(), setValue(), getField() |
| NumberUtils | 数字处理 | parseInteger(), parseDouble() |
| UUIDUtils | UUID生成 | getUUID() |
4.2 核心工具类详解
4.2.1 日期时间工具:DateUtils
// 获取当前日期字符串
String currentDate = DateUtils.getDate(); // 2023-07-15
// 格式化日期
String formattedDate = DateUtils.getDate(new Date(), "yyyy年MM月dd日"); // 2023年07月15日
// 计算时间差
String duration = DateUtils.getDurationString(LocalDateTime.of(2023, 1, 1, 0, 0)); // 6个月14天
// 日期解析
Date date = DateUtils.parseDate("2023-07-15");
4.2.2 Excel处理工具:EasyExcelUtils
// 导出数据
@PostMapping("/export")
public void export(HttpServletResponse response, @RequestBody UserQuery query) {
List<UserVO> userList = userService.baseListVO(query);
EasyExcelUtils.exportClass(response, "用户列表.xlsx", userList);
}
// 导入数据
@PostMapping("/import")
public R importData(MultipartFile file) {
List<UserVO> userList = EasyExcelUtils.importExcel(file, UserVO.class);
// 批量保存逻辑
return R.success();
}
4.2.3 加密工具:Md5Utils和AESUtils
// MD5加密
String md5Password = Md5Utils.getMd5String("password123");
// AES加密解密
String content = "敏感信息";
String key = "1234567890123456"; // 16位密钥
String encrypted = AESUtils.encodeAES(content, key);
String decrypted = AESUtils.decodeAES(encrypted, key);
五、实战案例:3个真实业务场景实现
5.1 案例一:用户管理系统
5.1.1 需求分析
实现一个简单的用户管理系统,包含以下功能:
- 用户列表查询(分页、条件筛选)
- 用户添加、编辑、删除
- 用户信息导出Excel
- 密码重置功能
5.1.2 代码实现
1. 实体类定义
public class UserEntity extends BaseEntity {
private String username;
private String password;
private String name;
private Integer age;
private String email;
private Integer status; // 1-启用,0-禁用
private LocalDateTime lastLoginTime;
// getter和setter省略
}
2. VO和Query定义
// VO类
public class UserVO {
private Long id;
private String username;
private String name;
private Integer age;
private String email;
private Integer status;
private String statusName; // 状态中文名称
private LocalDateTime createTime;
// getter和setter省略
// 状态转换
public String getStatusName() {
return status == 1 ? "启用" : "禁用";
}
}
// Query类
public class UserQuery extends BaseQuery<UserEntity> {
private String username;
private String nameLike;
private Integer ageGt;
private Integer ageLt;
private Integer status;
private LocalDateTime createTimeStart;
private LocalDateTime createTimeEnd;
// getter和setter省略
}
3. Controller实现
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@PostMapping("/save")
public R save(@RequestBody UserVO vo) {
return userService.baseSaveVO(vo);
}
@PostMapping("/deleteById")
public R deleteById(Long id) {
return userService.baseDeleteById(id);
}
@PostMapping("/list")
public R list(@RequestBody UserQuery query) {
return R.success(userService.basePageVO(query));
}
@PostMapping("/export")
public void export(HttpServletResponse response, @RequestBody UserQuery query) {
List<UserVO> userList = userService.baseListVO(query);
EasyExcelUtils.exportClass(response, "用户列表.xlsx", userList);
}
@PostMapping("/resetPassword")
public R resetPassword(Long id) {
return userService.resetPassword(id);
}
}
4. Service实现
@Service
public class UserServiceImpl extends BaseServiceImpl<UserEntity, UserVO, UserQuery> implements UserService {
@Resource
private UserMapper userMapper;
@Override
public BaseMapper<UserEntity> getBaseMapper() {
return userMapper;
}
@Override
public UserVO entity2Vo(UserEntity entity) {
UserVO vo = new UserVO();
BeanUtils.copyProperties(entity, vo);
return vo;
}
@Override
public UserEntity vo2Entity(UserVO vo) {
UserEntity entity = new UserEntity();
BeanUtils.copyProperties(vo, entity);
return entity;
}
@Override
public R baseSaveVO(UserVO vo) {
UserEntity entity = vo2Entity(vo);
// 新增用户时初始化密码
if (entity.getId() == null) {
entity.setPassword(Md5Utils.getMd5String("123456")); // 默认密码123456
entity.setCreateTime(LocalDateTime.now());
}
return super.baseSave(entity) > 0 ? R.success() : R.error();
}
public R resetPassword(Long id) {
UserEntity entity = baseGetById(id);
if (entity == null) {
return R.noData();
}
// 重置密码为123456
entity.setPassword(Md5Utils.getMd5String("123456"));
return baseSave(entity) > 0 ? R.success() : R.error("重置密码失败");
}
}
5.2 案例二:商品管理系统
5.2.1 需求分析
实现一个商品管理系统,包含以下功能:
- 商品分类管理(树形结构)
- 商品信息管理(CRUD)
- 商品库存管理
- 商品上下架功能
5.2.2 核心代码实现
1. 树形结构实现
// 商品分类VO
public class CategoryTreeVO extends TreeNodeVO {
private String name;
private String icon;
private Integer sort;
private List<CategoryTreeVO> children;
// getter和setter省略
}
// 服务层实现
@Service
public class CategoryServiceImpl extends BaseServiceImpl<CategoryEntity, CategoryVO, CategoryQuery> implements CategoryService {
@Resource
private CategoryMapper categoryMapper;
@Override
public BaseMapper<CategoryEntity> getBaseMapper() {
return categoryMapper;
}
// 获取分类树形结构
public List<CategoryTreeVO> getCategoryTree() {
CategoryQuery query = new CategoryQuery();
query.setOrderBy("sort asc");
List<CategoryVO> categoryList = baseListVO(query);
// 转换为树形结构
List<CategoryTreeVO> treeVOList = categoryList.stream().map(vo -> {
CategoryTreeVO treeVO = new CategoryTreeVO();
BeanUtils.copyProperties(vo, treeVO);
treeVO.setId(vo.getId());
treeVO.setParentId(vo.getParentId());
return treeVO;
}).collect(Collectors.toList());
// 构建树形结构
return buildTree(treeVOList, 0L); // 0为根节点
}
// 构建树形结构
private List<CategoryTreeVO> buildTree(List<CategoryTreeVO> list, Long parentId) {
List<CategoryTreeVO> treeList = new ArrayList<>();
for (CategoryTreeVO node : list) {
if (parentId.equals(node.getParentId())) {
node.setChildren(buildTree(list, node.getId()));
treeList.add(node);
}
}
return treeList;
}
}
5.3 案例三:订单管理系统
5.3.1 需求分析
实现一个简单的订单管理系统,包含以下功能:
- 订单创建、查询、取消
- 订单状态流转(待支付->已支付->已发货->已完成)
- 订单详情查看
- 订单数据统计
5.3.2 核心代码实现
1. 状态枚举定义
public enum OrderStatusEnum {
PENDING_PAY(1, "待支付"),
PAID(2, "已支付"),
SHIPPED(3, "已发货"),
COMPLETED(4, "已完成"),
CANCELLED(5, "已取消");
private Integer code;
private String desc;
// 构造方法、getter省略
// 获取状态描述
public static String getDescByCode(Integer code) {
for (OrderStatusEnum status : values()) {
if (status.code.equals(code)) {
return status.desc;
}
}
return "";
}
}
2. 订单状态流转
@Service
public class OrderServiceImpl extends BaseServiceImpl<OrderEntity, OrderVO, OrderQuery> implements OrderService {
@Resource
private OrderMapper orderMapper;
@Resource
private OrderItemMapper orderItemMapper;
@Override
public BaseMapper<OrderEntity> getBaseMapper() {
return orderMapper;
}
// 创建订单
@Transactional
public R createOrder(OrderCreateVO orderVO) {
// 1. 校验参数
if (CollectionUtils.isEmpty(orderVO.getItems())) {
return R.error("订单商品不能为空");
}
// 2. 生成订单号
String orderNo = generateOrderNo();
// 3. 保存订单主表
OrderEntity order = new OrderEntity();
order.setOrderNo(orderNo);
order.setUserId(orderVO.getUserId());
order.setAmount(orderVO.getAmount());
order.setStatus(OrderStatusEnum.PENDING_PAY.getCode());
order.setCreateTime(LocalDateTime.now());
baseSave(order);
// 4. 保存订单项
List<OrderItemEntity> itemList = orderVO.getItems().stream().map(itemVO -> {
OrderItemEntity item = new OrderItemEntity();
item.setOrderId(order.getId());
item.setProductId(itemVO.getProductId());
item.setProductName(itemVO.getProductName());
item.setPrice(itemVO.getPrice());
item.setQuantity(itemVO.getQuantity());
item.setCreateTime(LocalDateTime.now());
return item;
}).collect(Collectors.toList());
orderItemMapper.batchInsert(itemList);
return R.success(order.getId());
}
// 订单状态流转
@Transactional
public R updateOrderStatus(Long orderId, Integer status) {
OrderEntity order = baseGetById(orderId);
if (order == null) {
return R.noData();
}
// 校验状态流转是否合法
if (!isValidStatusTransition(order.getStatus(), status)) {
return R.error("订单状态流转不合法");
}
order.setStatus(status);
// 记录关键状态变更时间
if (status.equals(OrderStatusEnum.PAID.getCode())) {
order.setPayTime(LocalDateTime.now());
} else if (status.equals(OrderStatusEnum.SHIPPED.getCode())) {
order.setShipTime(LocalDateTime.now());
} else if (status.equals(OrderStatusEnum.COMPLETED.getCode())) {
order.setCompleteTime(LocalDateTime.now());
} else if (status.equals(OrderStatusEnum.CANCELLED.getCode())) {
order.setCancelTime(LocalDateTime.now());
}
baseSave(order);
return R.success();
}
// 校验状态流转是否合法
private boolean isValidStatusTransition(Integer currentStatus, Integer targetStatus) {
// 简化版状态流转校验
if (currentStatus.equals(targetStatus)) {
return true; // 相同状态直接返回true
}
// 待支付 -> 已支付/已取消
if (currentStatus.equals(OrderStatusEnum.PENDING_PAY.getCode())) {
return targetStatus.equals(OrderStatusEnum.PAID.getCode()) ||
targetStatus.equals(OrderStatusEnum.CANCELLED.getCode());
}
// 已支付 -> 已发货/已取消
if (currentStatus.equals(OrderStatusEnum.PAID.getCode())) {
return targetStatus.equals(OrderStatusEnum.SHIPPED.getCode()) ||
targetStatus.equals(OrderStatusEnum.CANCELLED.getCode());
}
// 已发货 -> 已完成/已取消
if (currentStatus.equals(OrderStatusEnum.SHIPPED.getCode())) {
return targetStatus.equals(OrderStatusEnum.COMPLETED.getCode()) ||
targetStatus.equals(OrderStatusEnum.CANCELLED.getCode());
}
return false;
}
// 生成订单号
private String generateOrderNo() {
return "ORD" + DateUtils.getDate("yyyyMMddHHmmss") + RandomUtils.getRandomNumber(4);
}
}
六、高级特性:自定义扩展与性能优化
6.1 自定义代码生成模板
6.2 通用Mapper性能优化
6.3 缓存策略实现
七、总结与展望
7.1 框架使用总结
通过本文的学习,我们了解了my-spring-helper框架的核心功能和使用方法,包括:
- 框架的核心优势和整体架构
- 环境搭建和项目部署流程
- 代码生成器的使用和自定义模板
- 通用Mapper的高级查询功能
- 基础服务实现和业务层扩展
- 实用工具类的应用
- 三个真实业务场景的实现
7.2 进阶学习路径
为了更好地掌握my-spring-helper框架,建议按照以下路径继续深入学习:
- 源码阅读:深入理解框架核心实现原理
- 扩展开发:自定义代码生成器模板和插件
- 性能优化:学习缓存策略和数据库优化技巧
- 安全加固:了解框架的安全特性和防护措施
- 微服务改造:将框架应用于微服务架构
7.3 未来展望
my-spring-helper框架将继续优化和完善,未来计划加入以下功能:
- 集成Spring Security和OAuth2.0实现认证授权
- 支持多数据源和读写分离
- 引入分布式事务解决方案
- 提供更多前端框架(Vue/React)的代码生成模板
- 集成API文档生成工具(如Swagger)
八、常见问题解答
8.1 代码生成器相关问题
Q1: 如何自定义代码生成的模板?
A1: 可以在template目录下修改现有模板文件,或添加新的模板文件。模板使用FreeMarker语法,可以根据需要自定义生成的代码结构和内容。
Q2: 生成代码时如何指定包路径和模块名称?
A2: 通过TableParams类的setPackageName()方法设置包路径,setModuleName()方法设置模块名称。
8.2 通用Mapper相关问题
Q1: 如何实现复杂的多表关联查询?
A1: 对于复杂的多表关联查询,可以在具体的Mapper接口中定义方法,并在XML文件中编写对应的SQL语句。通用Mapper主要解决单表CRUD操作,复杂查询仍需手动编写SQL。
Q2: 如何实现自定义的排序和分页?
A2: 可以通过BaseQuery类的setOrderBy()方法设置排序字段和方向,setPageNum()和setPageSize()方法设置分页参数。
8.3 性能相关问题
Q1: 大量数据查询时如何优化性能?
A1: 可以采用以下优化措施:
- 使用分页查询减少数据量
- 添加合适的索引
- 使用缓存减少数据库访问
- 对于统计查询,考虑使用定时任务预计算结果
九、资源获取与交流
9.1 源码仓库
- 项目地址:https://gitcode.com/qq_41089021/my-spring-helper
9.2 学习资源
- 官方文档:项目doc目录下
- 示例项目:项目examples目录下
- 视频教程:[待定]
9.3 问题反馈与交流
- Issue提交:在GitCode仓库提交issue
- 邮箱交流:[项目维护者邮箱]
- QQ交流群:[群号]
9.4 贡献代码
欢迎大家贡献代码,提交Pull Request前请确保:
- 代码符合项目编码规范
- 添加必要的单元测试
- 更新相关文档
- 提交信息清晰明了
如果你觉得本文对你有帮助,请点赞、收藏、关注三连支持!
下期预告:my-spring-helper框架在微服务架构中的应用实践
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



