一、前言

在Web应用开发课程中,掌握一套高效、规范的开发流程至关重要。本文将带你从零开始,使用SpringBoot + MyBatis-Plus技术栈,完整实现一个具有权限管理功能的Web应用。本教程适合有一定Java基础的同学,我将详细讲解每个关键步骤并提供完整的代码示例。

二、开发环境配置(JDK + Maven + IDEA)

2.1 JDK安装与配置

bash

# 下载JDK 11(LTS版本)
# 配置环境变量
JAVA_HOME = C:\Program Files\Java\jdk-11.0.15
PATH = %JAVA_HOME%\bin

2.2 Maven配置优化

创建或修改 ~/.m2/settings.xml

xml

<settings>
    <mirrors>
        <mirror>
            <id>aliyun-maven</id>
            <mirrorOf>central</mirrorOf>
            <url>https://maven.aliyun.com/repository/central</url>
        </mirror>
    </mirrors>
    <profiles>
        <profile>
            <id>jdk-11</id>
            <activation>
                <jdk>11</jdk>
            </activation>
            <properties>
                <maven.compiler.source>11</maven.compiler.source>
                <maven.compiler.target>11</maven.compiler.target>
            </properties>
        </profile>
    </profiles>
</settings>

2.3 IDEA高效配置技巧

  • 安装插件:Lombok、MyBatisX、Maven Helper

  • 开启注解处理:Settings → Build → Annotation Processors

  • 配置智能提示:File → Power Save Mode(关闭)

三、SpringBoot项目快速搭建

3.1 使用Spring Initializr创建项目

访问 https://start.spring.io 或使用IDEA内置的Spring Initializr:

https://img-blog.csdnimg.cn/img_convert/123456.png

依赖选择:

  • Spring Web

  • Spring Boot DevTools

  • Lombok

  • MyBatis Framework

  • MySQL Driver

3.2 项目结构规范

text

src/
├── main/
│   ├── java/com/example/
│   │   ├── config/      # 配置类
│   │   ├── controller/  # 控制器
│   │   ├── service/     # 服务层
│   │   │   ├── impl/    # 服务实现
│   │   ├── mapper/      # MyBatis映射器
│   │   ├── entity/      # 实体类
│   │   ├── dto/         # 数据传输对象
│   │   ├── vo/         # 视图对象
│   │   └── Application.java
│   └── resources/
│       ├── mapper/      # XML映射文件
│       ├── static/      # 静态资源
│       ├── templates/   # 模板文件
│       └── application.yml
└── test/               # 测试代码

四、MyBatis-Plus深度整合

4.1 添加MyBatis-Plus依赖

xml

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.3</version>
</dependency>

4.2 基础配置

yaml

# application.yml
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/web_course?useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: auto
      logic-delete-field: deleted  # 逻辑删除字段
      logic-delete-value: 1
      logic-not-delete-value: 0

4.3 实体类与Mapper

java

// User.java
@Data
@TableName("sys_user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String username;
    private String password;
    private String email;
    private Integer status;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

// UserMapper.java
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 自定义查询方法
    @Select("SELECT * FROM sys_user WHERE email = #{email}")
    User selectByEmail(String email);
}

4.4 自动填充处理器

java

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "createTime", 
            LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updateTime", 
            LocalDateTime.class, LocalDateTime.now());
    }
    
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictUpdateFill(metaObject, "updateTime", 
            LocalDateTime.class, LocalDateTime.now());
    }
}

五、权限控制实现(Spring Security + JWT)

5.1 安全依赖配置

xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>0.11.5</version>
</dependency>

5.2 JWT工具类

java

@Component
public class JwtUtil {
    private static final String SECRET_KEY = "your-secret-key";
    private static final long EXPIRATION = 86400000; // 24小时
    
    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }
    
    public String extractUsername(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }
}

5.3 Security配置类

java

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Autowired
    private JwtAuthenticationFilter jwtAuthenticationFilter;
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
            .antMatchers("/api/auth/**", "/swagger-ui/**").permitAll()
            .antMatchers("/api/admin/**").hasRole("ADMIN")
            .antMatchers("/api/user/**").hasAnyRole("USER", "ADMIN")
            .anyRequest().authenticated()
            .and()
            .addFilterBefore(jwtAuthenticationFilter, 
                UsernamePasswordAuthenticationFilter.class);
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

六、数据缓存管理(Redis集成)

6.1 Redis配置

yaml

spring:
  redis:
    host: localhost
    port: 6379
    password: 
    database: 0
    timeout: 5000ms
    lettuce:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 0

6.2 缓存注解使用

java

@Service
@Slf4j
public class UserServiceImpl implements UserService {
    
    @Autowired
    private UserMapper userMapper;
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Cacheable(value = "user", key = "#id", unless = "#result == null")
    @Override
    public User getUserById(Long id) {
        log.info("查询数据库获取用户:{}", id);
        return userMapper.selectById(id);
    }
    
    @CachePut(value = "user", key = "#user.id")
    @Override
    public User updateUser(User user) {
        userMapper.updateById(user);
        return user;
    }
    
    @CacheEvict(value = "user", key = "#id")
    @Override
    public void deleteUser(Long id) {
        userMapper.deleteById(id);
    }
}

七、完整的项目开发流程

7.1 开发流程示意

需求分析

数据库设计

项目搭建

实体类创建

Mapper层开发

Service层开发

Controller层开发

前端界面开发

单元测试

集成测试

性能优化

部署上线

7.2 Git版本控制规范

text

feat:     新功能
fix:      修复bug
docs:     文档更新
style:    代码格式调整
refactor: 代码重构
test:     测试用例
chore:    构建过程或辅助工具变动

八、项目实战:用户管理系统

8.1 接口设计

java

@RestController
@RequestMapping("/api/users")
@Api(tags = "用户管理")
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping
    @ApiOperation("分页查询用户")
    public PageResult<UserVO> getUsers(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        Page<User> userPage = userService.page(new Page<>(page, size));
        return PageResult.success(userPage, UserVO.class);
    }
    
    @PostMapping
    @ApiOperation("创建用户")
    public Result<UserVO> createUser(@Valid @RequestBody CreateUserDTO dto) {
        User user = userService.createUser(dto);
        return Result.success(BeanUtil.copyProperties(user, UserVO.class));
    }
}

8.2 统一异常处理

java

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    
    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public Result<?> handleBusinessException(BusinessException e) {
        log.error("业务异常:{}", e.getMessage());
        return Result.error(e.getCode(), e.getMessage());
    }
    
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result<?> handleException(Exception e) {
        log.error("系统异常:", e);
        return Result.error(500, "系统繁忙,请稍后重试");
    }
}

九、部署与监控

9.1 Docker部署

dockerfile

FROM openjdk:11-jre-slim
VOLUME /tmp
COPY target/web-course-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
EXPOSE 8080

9.2 健康检查端点

yaml

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics
  endpoint:
    health:
      show-details: always

十、总结

通过本文的详细讲解,我们完成了:

  1. ✅ 开发环境配置与优化

  2. ✅ SpringBoot项目快速搭建

  3. ✅ MyBatis-Plus深度整合与使用

  4. ✅ 基于Spring Security的权限控制

  5. ✅ Redis缓存管理实践

  6. ✅ 完整的项目开发流程

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐