新建完整的Spring boot Web项目(更新中)

513 阅读3分钟

使用较新的技术创建Spring boot项目,主要用户学习。

  • IDE: IntelliJ Idea 2023.2.1
  • JDK: JDK17
  • 开发语言:Java
  • 构建工具:Gradle。(不是Maven)
  • 数据库:Mysql 8.0
  • ORM框架:Mybatis-plus
  • Spring Boot版本: 3.3.2-SNAPSHOT

创建项目

使用IDEA新建项目,选择lombokMySql驱动Spring boot web基础库。

微信截图_20240703102521.png

微信截图_20240703102824.png

微信截图_20240703103521.png

默认创建项目基本结构就是这样,因为开发Android项目习惯了感觉Gradle比Maven简洁很多,还没有了解Gradle的朋友可以稍作了解,也是在Maven Repository中找库,找到库有个Gradle选项复制信息就可以。接下来开始搭房子。

ORM框架搭建

准备数据库和表

这里创建了一个demo数据库和一个user表。

CREATE TABLE `user` (
	`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
	`username` VARCHAR(50) NOT NULL COMMENT '用户名' COLLATE 'utf8mb4_general_ci',
	`nickname` VARCHAR(50) NOT NULL COMMENT '昵称' COLLATE 'utf8mb4_general_ci',
	`deleted` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否删除',
	`update_time` DATETIME NOT NULL COMMENT '更新时间',
	`create_time` DATETIME NOT NULL COMMENT '创建时间',
	PRIMARY KEY (`id`) USING BTREE
)
COMMENT='用户';

添加Mybatis-plus库

implementation 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.7'

注意,这里使用的Spring Boot 3.0以上版本,部分库已经改名,不能使用mybatis-plus以前的版本。

yml配置

已把项目默认创建的配置文件改成yml后缀。

spring:
  application:
    name: SpringDemoDev
  datasource:
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

相关类创建

创建Mytatisplus配置文件

扫描mapper及分页配置。

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
@MapperScan({
        "fun.deveasy.spring.demo.module.user.mapper",
        })
public class MyBatisConfig {

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

User.java实体类

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;


@Setter
@Getter
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    // 用户名
    private String username;

    // 昵称
    private String nickname;

    @TableLogic
    private boolean deleted;

    private Date updateTime;

    private Date createTime;
    
}

UserMapper.java

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import fun.deveasy.spring.demo.module.user.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

UserService.java

import com.baomidou.mybatisplus.extension.service.IService;
import fun.deveasy.spring.demo.module.user.entity.User;
import org.springframework.stereotype.Service;

@Service
public interface UserService extends IService<User> {

}

UserServiceImpl.java

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import fun.deveasy.spring.demo.module.user.entity.User;
import fun.deveasy.spring.demo.module.user.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

测试添加一个用户数据

import fun.deveasy.spring.demo.module.user.entity.User;
import fun.deveasy.spring.demo.module.user.service.UserService;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;

@SpringBootTest
class SpringDemoApplicationTests {

    @Resource
    private UserService userService;

    @Test
    void contextLoads() {
        User user = new User();
        user.setUsername("test");
        user.setNickname("test123");
        user.setUpdateTime(new Date());
        user.setCreateTime(new Date());
        userService.save(user);
    }
}

测试成功,数据已经插入数据库。

文件结构

微信截图_20240703113716.png

Controller使用- API定义

基础定义

还是以用户接口为例,定义获取用户信息(Get)和添加用户信息(POST)接口。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/getUser")
    public String getUser() {
        return "This is user info";
    }

    @PostMapping("/addUser")
    public String addUser() {
        return "This is user info";
    }
}

在浏览器中访问 http://localhost:8080 + /user + /getUser

微信截图_20240703171515.png

带参数接口

简单使用

@GetMapping("/getUser")
public String getUser(String username) {
    System.out.println("username:" + username);
    return "This is user info";
}

进阶使用

@GetMapping("/getUser")
public String getUser(@RequestParam(required = true,name = "username", defaultValue = "admin") String username) {
    System.out.println("username:" + username);
    return "This is user info";
}

字段是否为必填、字段名重新定义、默认值。

终极使用

在实际项目中,字段会比较多,而且每个字段都需要做有效性校验。这时就需要借助validation库。

引入库

implementation 'org.springframework.boot:spring-boot-starter-validation:3.3.1'

参数类

import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class UserQuery {

    @NotBlank(message = "Username cannot be blank")
    private String username;
}
  • @NotNull 不为空Null,
  • @NotBlank 不能为空,包括只能空格。注意数字类型不能使用。
  • @NotEmpty 不能为空,无法判断空格
  • @Max 数字的最大和最小值
  • @Length 字符串长度
  • @Email 邮箱

使用

@GetMapping("/getUser")
public String getUser(@Valid UserQuery query) {
    System.out.println("username:" + query.getUsername());
    return "This is user info";
}

Redis引入及使用

引入库

implementation 'org.springframework.boot:spring-boot-starter-data-redis:3.3.2'

yml配置

spring:
  # Redis配置
  redis:
    database: 0
    host: localhost
    port: 6379
    password:

使用

简单的字符串设置和获取

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;

@SpringBootTest
class RedisTests {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void contextLoads() {
        stringRedisTemplate.opsForValue().set("name", "SongHaiQing");
        System.out.println("name:" + stringRedisTemplate.opsForValue().get("name"));
    }
}