Springboot整合jpa

370 阅读3分钟

前言

JPA(Java Persistence API)是 Java 标准中的一套ORM规范,是Springboot一个持久化框架,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中,而且可以很好的切换数据库

jpa官网

可以从以下网址了解jpa

 https://docs.spring.io/spring-data/jpa/reference/?spm=a2c6h.12873639.article-detail.7.79103500RuSHYY#preface

jpa注解说明

jpa提供了一些注解,例如

@Entity: 用于标注实体类,指出该 Java 类为实体类,将映射到指定的关系数据库表,一般是必须的
@Table: 标注在实体类,一般用于数据库表名
-   schema属性:指定数据库名
-   name属性:指定表名
@Id: 用于指定数据库表主键
@GeneratedValue: 用于标记主键的生成方式,通过 strategy 属性指定
-   AUTO: JPA自动选择合适的策略,是默认选项
-   IDENTITY:采用数据库 ID自增长的方式来自增主键字段,Oracle 不支持这种方式
-   TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
-   SEQUENCE:通过序列产生主键,通过 @SequenceGenerator 注解指定序列名
@Column: 用于指定列名,也可以用于生成数据库表字段
@Transient: 用于标记不将实体类某字段生成数据库表名

等等

引入jpa依赖

jpa依赖为
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

然后加入数据库驱动

mysql
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
postgressql驱动
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <scope>runtime</scope>
</dependency>

jpa操作

数据库配置

(1)application.properties配置为

server.port=9051
spring.application.name=demo-jpa
# MySQL
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# JPA
spring.jpa.database=MySQL
spring.jpa.show-sql=true
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

说明:

spring.jpa.hibernate.ddl-auto=update: 用于数据库表自动生成,有几种生成策略
ddl-auto:create ----每次运行该程序,没有表格会新建表格,表内有数据会清空;
ddl-auto:create-drop ----每次程序结束的时候会清空表
ddl-auto:update ---- 每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
ddl-auto: validate ---- 运行程序会校验数据与数据库的字段类型是否相同,不同会报错。

spring.jpa.show-sql=true: 用于数据库语句打印
spring.jpa.database=MySQL: 用于指定使用数据库

Hibernate5之后
采用implicit-strategy和physical-strategy两个配置项分别控制命名策略

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
1、implicit-strategy和physical-strategy的区别

(1)、implicit-strategy负责模型对象层次的处理,将对象模型处理为逻辑名称。physical-strategy负责映射成真实的数据名称的处理,将上述的逻辑名称处理为物理名称。

(2)、当没有使用@Table@Column注解时,implicit-strategy配置项才会被使用,当对象模型中已经指定时,implicit-strategy并不会起作用。physical-strategy一定会被应用,与对象模型中是否显式地指定列名或者已经被隐式决定无关。

jpa编程

实体类定义
@Data
@Entity
@Table(name = "user")
@JsonIgnoreProperties(ignoreUnknown = true)
@EntityListeners(AuditingEntityListener.class)
public class User implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "userName")
    private String userName;

    @Column(name = "mobile")
    private String mobile;


}
dao层定义
@Repository
public interface UserRepository extends JpaRepository<User, Long>,
        JpaSpecificationExecutor<User> {
}
数据库操作
@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/save")
    public void save() {
        User user = new User();
        user.setId(1L);
        user.setMobile("aaa");
        userRepository.save(user);
    }

    @PostMapping("/update")
    public void update(@RequestBody User user) {
        userRepository.save(user);
    }


    @GetMapping("/findById")
    public User findById(@RequestParam("id") Long id) {
        return userRepository.findById(id).orElse(null);
    }

    @GetMapping("/deleteById")
    public void deleteById(@RequestParam("id") Long id) {
        userRepository.deleteById(id);
    }

}

备注:程序启动之后,会生成数据库表

image.png

总结

jpa可以是操作数据库更加方便,并且方便切换数据库,但是在开发中,根据自己使用习惯选型