使用较新的技术创建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新建项目,选择lombok、MySql驱动和Spring boot web基础库。
默认创建项目基本结构就是这样,因为开发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);
}
}
测试成功,数据已经插入数据库。
文件结构
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。
带参数接口
简单使用
@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"));
}
}