- Docker部署PGSQL
- MVN包配置
- 数据库配置
- 服务启动时自动删除、新建表用于测试环境
- JpaRepository 自动创建CRUD方法
- SQL语句参数明文输出
Docker部署PGSQL
docker run -d --name pgsql -e POSTGRES_PASSWORD=12345678 -p 5432:5432 postgres:17.4
连接数据库后自动创建数据库和用户名,默认用户名密码postgres:postgres
MVN包配置
<!-- JPA 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<!-- postgresql 依赖 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.5.6</version>
</dependency>
<!-- Model数据验证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
数据库配置
spring:
datasource:
url: jdbc:postgresql://localhost:5432/ai # 这里改成自己的表
username: ai_root # 改成自己的用户名
password: 12345678
jpa:
show-sql: true # 打印sql语句
hibernate:
ddl-auto: create # 服务启动后自动读取@Entity类,删除并创建新的数据库表,update为更新
defer-datasource-initialization: true # 启动后执行sql语句关键配置:延迟数据源初始化,确保先建表
properties:
hibernate:
format_sql: true # sql 语句格式化输出
sql:
init:
mode: always # 始终执行初始化脚本(即使是非嵌入式数据库)
schema-locations: classpath:init.sql # 需要执行的sql脚本
服务启动时自动删除、新建表用于测试环境(生产环境建议关闭)
启动类添加注解@EntityScan确定需要扫描的实例类(@Entity)所在位置
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@EnableCaching
@EntityScan("com.jagger.ai.api")
public abstract class BaseSpringApplication {
// 可以在此处定义公共的 Bean 或配置方法
}
User Model 实例类,添加@Entity、@Table、@Id、@Column等注解用于关联数据库表
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.annotations.Comment;
import java.io.Serializable;
import java.util.Date;
@Data
@Accessors(chain = true)
@Schema(description = "用户信息")
@Entity
@Table(name = "users") // 表名
public class User implements Serializable {
@Id // 主键
@JsonFormat(shape = JsonFormat.Shape.STRING) // 强制以字符串解析
@Schema(description = "ID,Snowflake算法生成")
@Comment("ID,Snowflake算法生成")
private long id;
@Column(length = 20, nullable = false)
@Schema(description = "登录用户名")
private String username;
@Column(length = 20, nullable = false)
@JsonIgnore
@Schema(description = "登录密码,这里用密文加密")
private String password;
@Column(length = 20, nullable = false)
@Schema(description = "昵称")
private String nickname;
@Column(length = 20)
@Schema(description = "手机号")
private String phoneNumber;
@Column(nullable = false)
@Schema(description = "头像,这里存储的是地址")
private String avatarUrl;
@Column(length = 30)
@Schema(description = "邮箱")
private String email;
@Column(nullable = false)
@JsonIgnore
@Schema(description = "创建时间")
private Date createTime;
}
添加SQL语句脚本,服务启动时自动执行SQL脚本
存放位置: resources/init.sql,配置内容见: 数据库配置
INSERT INTO users (id, username, password, nickname, avatar_url, create_time)
VALUES (1, 'username', 'password', '管理员', '123.image', NOW());
JpaRepository 自动创建CRUD方法
UserRepository
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
// 继承 JpaRepository 即可自动获得 CRUD 方法
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// 自动生成查询(方法名约定)
Optional<User> findByUsernameAndPassword(String name, String password);
// 自定义 JPQL 查询
@Query("SELECT u FROM User u WHERE u.username LIKE %?1%")
List<User> searchByUsername(String username);
}
UserService
import com.jagger.ai.services.auth.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
public User findByUsernameAndPassword(String username, String password) {
return userRepository.findByUsernameAndPassword(username, password).orElse(null);
}
}
SQL语句参数明文输出
logging:
level:
org.hibernate.orm.jdbc.extract: TRACE # SQL响应参数
org.hibernate.orm.jdbc.bind: TRACE # SQL请求参数