SpringBoot + MyBatis-Plus项目实战:从零搭建一个JavaEE课程设计骨架(附完整源码结构解析)
SpringBoot MyBatis-Plus项目实战从零搭建一个JavaEE课程设计骨架附完整源码结构解析当你第一次打开IDE准备开始JavaEE课程设计时面对空白的项目窗口是否感到无从下手本文将带你从零开始用SpringBoot和MyBatis-Plus搭建一个结构清晰、功能完善的后端项目骨架。这个骨架不仅适用于当前的课程设计更能作为你未来项目开发的模板。1. 项目初始化与环境准备在开始编码之前我们需要确保开发环境已经正确配置。推荐使用IntelliJ IDEA作为开发工具它提供了完善的SpringBoot支持。必备环境清单JDK 1.8或更高版本Maven 3.6MySQL 5.7IntelliJ IDEA社区版或旗舰版提示虽然SpringBoot支持内嵌数据库但课程设计通常要求使用MySQL建议提前安装配置好。创建SpringBoot项目时可以通过Spring Initializrhttps://start.spring.io/快速生成基础结构或者直接在IDEA中使用Spring Initializr向导。关键依赖包括Spring WebMyBatis-PlusMySQL DriverLombok简化代码!-- pom.xml关键依赖示例 -- dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.1/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies2. 项目结构设计与核心配置一个规范的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?useSSLfalseserverTimezoneUTC 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.javaConfiguration public class MybatisPlusConfig { /** * 分页插件 */ Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }3.2 通用Mapper与ServiceMyBatis-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 BaseMapperUser { // 可以自定义SQL方法 Select(SELECT * FROM user WHERE username #{username}) User selectByUsername(Param(username) String username); }服务层可以这样实现public interface UserService extends IServiceUser { // 自定义业务方法 User getByUsername(String username); } Service public class UserServiceImpl extends ServiceImplUserMapper, 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 ResultT implements Serializable { private Integer code; private String msg; private T data; public static T ResultT success(T data) { return new Result(200, success, data); } public static T ResultT error(String msg) { return new Result(500, msg, null); } public static T ResultT 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 ResultString handleException(Exception e) { log.error(系统异常, e); return Result.error(e.getMessage()); } ExceptionHandler(BusinessException.class) public ResultString handleBusinessException(BusinessException e) { log.error(业务异常, e); return Result.error(e.getCode(), e.getMessage()); } ExceptionHandler(MethodArgumentNotValidException.class) public ResultString 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 ResultIPageUser listUsers( RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, RequestParam(required false) String username) { PageUser page new Page(pageNum, pageSize); LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); if (StringUtils.isNotBlank(username)) { wrapper.like(User::getUsername, username); } IPageUser result userService.page(page, wrapper); return Result.success(result); }在实际开发中我发现合理使用MyBatis-Plus的LambdaQueryWrapper可以极大提高代码的可读性和维护性。对于复杂的查询条件建议封装到Service层的方法中而不是直接在Controller中构建查询条件。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2473398.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!