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

SpringBoot + MyBatis-Plus项目实战:从零搭建一个JavaEE课程设计骨架(附完整源码结构解析)

SpringBoot + MyBatis-Plus项目实战:从零搭建一个JavaEE课程设计骨架(附完整源码结构解析)

当你第一次打开IDE准备开始JavaEE课程设计时,面对空白的项目窗口是否感到无从下手?本文将带你从零开始,用SpringBoot和MyBatis-Plus搭建一个结构清晰、功能完善的后端项目骨架。这个骨架不仅适用于当前的课程设计,更能作为你未来项目开发的模板。

1. 项目初始化与环境准备

在开始编码之前,我们需要确保开发环境已经正确配置。推荐使用IntelliJ IDEA作为开发工具,它提供了完善的SpringBoot支持。

必备环境清单

  • JDK 1.8或更高版本
  • Maven 3.6+
  • MySQL 5.7+
  • IntelliJ IDEA(社区版或旗舰版)

提示:虽然SpringBoot支持内嵌数据库,但课程设计通常要求使用MySQL,建议提前安装配置好。

创建SpringBoot项目时,可以通过Spring Initializr(https://start.spring.io/)快速生成基础结构,或者直接在IDEA中使用Spring Initializr向导。关键依赖包括:

  • Spring Web
  • MyBatis-Plus
  • MySQL Driver
  • Lombok(简化代码)
<!-- pom.xml关键依赖示例 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>

2. 项目结构设计与核心配置

一个规范的JavaEE项目应该遵循MVC分层架构,同时考虑扩展性和维护性。以下是推荐的目录结构:

src/main/java ├── com │ └── yourpackage │ ├── config # 配置类 │ ├── controller # 控制器层 │ ├── service # 服务层 │ │ ├── impl # 服务实现 │ ├── dao # 数据访问层 │ ├── entity # 实体类 │ ├── dto # 数据传输对象 │ ├── vo # 视图对象 │ ├── util # 工具类 │ ├── annotation # 自定义注解 │ ├── interceptor # 拦截器 │ └── exception # 异常处理 src/main/resources ├── static # 静态资源 ├── templates # 模板文件 ├── application.yml # 主配置文件 └── mapper # MyBatis映射文件

application.yml配置详解

server: port: 8080 servlet: context-path: /api spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC username: root password: your_password mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml type-aliases-package: com.yourpackage.entity global-config: db-config: id-type: auto logic-delete-field: deleted # 逻辑删除字段名 logic-delete-value: 1 # 逻辑已删除值 logic-not-delete-value: 0 # 逻辑未删除值 configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

注意:数据库连接信息需要根据你的实际环境修改,特别是数据库名称、用户名和密码。

3. MyBatis-Plus核心功能集成

MyBatis-Plus是MyBatis的增强工具,可以极大简化CRUD操作。以下是几个关键配置和用法:

3.1 分页插件配置

在config目录下创建MybatisPlusConfig.java:

@Configuration public class MybatisPlusConfig { /** * 分页插件 */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }

3.2 通用Mapper与Service

MyBatis-Plus提供了BaseMapper和IService接口,可以快速实现CRUD操作。首先定义实体类:

@Data @TableName("user") // 对应数据库表名 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String username; private String password; @TableField(fill = FieldFill.INSERT) // 自动填充 private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableLogic // 逻辑删除标记 private Integer deleted; }

然后创建Mapper接口:

public interface UserMapper extends BaseMapper<User> { // 可以自定义SQL方法 @Select("SELECT * FROM user WHERE username = #{username}") User selectByUsername(@Param("username") String username); }

服务层可以这样实现:

public interface UserService extends IService<User> { // 自定义业务方法 User getByUsername(String username); } @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public User getByUsername(String username) { return baseMapper.selectByUsername(username); } }

4. 权限验证与拦截器配置

大多数课程设计项目都需要基本的权限验证。我们可以通过拦截器实现Token验证。

4.1 自定义注解

首先创建几个常用的注解:

// 忽略Token验证注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface IgnoreAuth {} // 需要特定角色的注解 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface RequiresRoles { String[] value(); }

4.2 拦截器实现

@Component public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 跨域支持 response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Allow-Headers", "*"); // 如果不是控制器方法直接放行 if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); // 检查是否有IgnoreAuth注解 if (method.isAnnotationPresent(IgnoreAuth.class)) { return true; } // 获取Token String token = request.getHeader("Authorization"); if (StringUtils.isBlank(token)) { throw new RuntimeException("请先登录"); } // 验证Token逻辑... // 这里可以添加角色验证等 return true; } }

4.3 拦截器注册

@Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private AuthInterceptor authInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authInterceptor) .addPathPatterns("/**") .excludePathPatterns("/user/login") .excludePathPatterns("/swagger*/**") .excludePathPatterns("/webjars/**") .excludePathPatterns("/v3/api-docs"); } // 静态资源处理 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); } }

5. 统一响应格式与异常处理

良好的API设计应该包含统一的响应格式和异常处理机制。

5.1 统一响应封装

@Data @NoArgsConstructor @AllArgsConstructor public class Result<T> implements Serializable { private Integer code; private String msg; private T data; public static <T> Result<T> success(T data) { return new Result<>(200, "success", data); } public static <T> Result<T> error(String msg) { return new Result<>(500, msg, null); } public static <T> Result<T> error(Integer code, String msg) { return new Result<>(code, msg, null); } }

5.2 全局异常处理

@RestControllerAdvice public class GlobalExceptionHandler { private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(Exception.class) public Result<String> handleException(Exception e) { log.error("系统异常", e); return Result.error(e.getMessage()); } @ExceptionHandler(BusinessException.class) public Result<String> handleBusinessException(BusinessException e) { log.error("业务异常", e); return Result.error(e.getCode(), e.getMessage()); } @ExceptionHandler(MethodArgumentNotValidException.class) public Result<String> handleValidException(MethodArgumentNotValidException e) { String message = e.getBindingResult().getAllErrors().stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.joining("; ")); return Result.error(400, message); } }

6. 实用工具类与最佳实践

项目开发中,一些工具类可以极大提高开发效率。以下是几个常用的工具类示例:

6.1 日期时间工具类

public class DateUtils { private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss"; public static String format(LocalDateTime dateTime) { return format(dateTime, DEFAULT_PATTERN); } public static String format(LocalDateTime dateTime, String pattern) { return dateTime.format(DateTimeFormatter.ofPattern(pattern)); } public static LocalDateTime parse(String dateStr) { return parse(dateStr, DEFAULT_PATTERN); } public static LocalDateTime parse(String dateStr, String pattern) { return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(pattern)); } }

6.2 加密工具类

public class CryptoUtils { private static final String SALT = "your_salt_value"; public static String encrypt(String raw) { return DigestUtils.md5DigestAsHex((SALT + raw).getBytes()); } public static boolean verify(String raw, String encrypted) { return encrypt(raw).equals(encrypted); } }

6.3 分页查询最佳实践

控制器中的分页查询可以这样实现:

@GetMapping("/users") public Result<IPage<User>> listUsers( @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize, @RequestParam(required = false) String username) { Page<User> page = new Page<>(pageNum, pageSize); LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); if (StringUtils.isNotBlank(username)) { wrapper.like(User::getUsername, username); } IPage<User> result = userService.page(page, wrapper); return Result.success(result); }

在实际开发中,我发现合理使用MyBatis-Plus的LambdaQueryWrapper可以极大提高代码的可读性和维护性。对于复杂的查询条件,建议封装到Service层的方法中,而不是直接在Controller中构建查询条件。

http://www.jsqmd.com/news/572837/

相关文章:

  • 优秀景区商业美陈的四大价值
  • #4
  • 效率飙升,跳过proteus安装配置,用快马ai秒建仿真项目
  • PyTorch 2.6云端镜像体验:一键部署GPU环境,快速开始AI实验
  • Java八股文实践篇:从理论到DeOldify项目中的设计模式应用
  • 乱治只会白花钱!腰突颈椎病越养越糟是异常预警?踩了 8 个坑才找到的正确就医捷径
  • 26考研的新趋势,27考研的同学务必注意!
  • 使用PP-DocLayoutV3实现多语言文档的自动分类
  • SiameseAOE中文-base高性能部署:WebUI响应<800ms,吞吐达12QPS(RTX4090)
  • 前端开发者的福音:5分钟用Mergely.js给你的网页加个在线文本对比器
  • 鸿蒙应用开发UI基础第三十六节:Grid网格布局二维自适应宫格与不规则布局方案
  • 二叉树,搜索树,AVL数
  • 咸鱼sign签名 python纯算还原
  • 2026年半导体治具企业有哪些,支持来图定制加工,异形件均可按需生产制作 - 品牌推荐师
  • 统信UOS新版软件商店升级了,这几个实用功能真的很加分!
  • 【数值分析】线性方程组求解的MATLAB实战:从高斯消元到追赶法
  • 千问3.5-2B效果展示:对低光照拍摄的快递面单图,仍准确识别收件人与电话
  • 3步永久保存微信聊天记录:免费工具WeChatMsg完整指南
  • 3大突破!OpenRocket火箭仿真工具如何让航天爱好者实现低成本设计验证
  • 亲测五恒系统企业实践案例分享
  • 终极Markdown网页抓取指南:如何用MarkDownload快速整理网络知识
  • 数字孪生+AI:某国家级技术科研机构:耦合仿真评估部件性能,长期运维监测承压状态
  • 资源节省妙招:LiuJuan Z-Image的显存碎片整理功能,到底有多强大?
  • 项目管理软件:项目管理一团乱?这套一体化系统,让全流程管控不再难!企智汇软件一套系统搞定企业全流程管控!
  • synchronized关键字相关
  • 告别阻塞!Qt多进程通信的5种高效事件循环方案对比
  • Vanilla论坛邮件通知系统配置:确保用户及时获取社区动态
  • 前端PWA:让你的网站变成App
  • FindPatterns与PatMax算法对比:康耐视InSight电子表格模式下如何选择图案匹配工具?
  • 基于KNN算法 Python的隶书字体识别系统设计与实现