老蒋的知识库

  • 首页
  • 文章归档
  • 关于页面

  • 搜索

Spring Boot JPA PGSQL,自动创建表、初始化数据库、自动获得 CRUD 方法、SQL参数明文显示

发表于 2025-03-06 | 分类于 Java | 0 | 阅读次数 43
  1. Docker部署PGSQL
  2. MVN包配置
  3. 数据库配置
  4. 服务启动时自动删除、新建表用于测试环境
  5. JpaRepository 自动创建CRUD方法
  6. 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请求参数
  • 本文作者: jagger
  • 本文链接: /archives/springbootjpapgsql-zi-dong-chuang-jian-biao--chu-shi-hua-shu-ju-ku--zi-dong-huo-de-crud-fang-fa-sql-can-shu-ming-wen-xian-shi
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
Spring Boot 访问Redis
openjdk docker生产部署问题
jagger

jagger

66 日志
31 分类
0 标签
Creative Commons
0%
© 2026 jagger
由 Halo 强力驱动