首页 > 其他分享 >SpringBoot基础系列学习(六):整合SpringDataJpa

SpringBoot基础系列学习(六):整合SpringDataJpa

时间:2024-11-14 11:45:59浏览次数:3  
标签:SpringDataJpa SpringBoot 数据库 springframework user org 系列学习 import 主键

文章目录

1.简介

Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库。 此模块处理对基于JPA的数据访问层的增强支持。 它使构建使用数据访问技术的Spring驱动应用程序变得更加容易。

在相当长的一段时间内,实现应用程序的数据访问层一直很麻烦。 必须编写太多样板代码来执行简单查询以及执行分页和审计。 Spring Data JPA旨在通过减少实际需要的工作量来显著改善数据访问层的实现。 作为开发人员,您编写repository接口,包括自定义查找器方法,Spring将自动提供实现。

优点

  • 丰富的API,简单操作无需编写额外的代码
  • 丰富的SQL日志输出

缺点

  • 学习成本较大,需要学习HQL
  • 配置复杂,虽然SpringBoot简化的大量的配置,关系映射多表查询配置依旧不容易
  • 性能较差,对比JdbcTemplate、Mybatis等ORM框架,它的性能无异于是最差的

代码

数据库

就一个简单的user表,name和age

CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

导入依赖

<!-- Spring JDBC 的依赖包,使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 将会自动获得HikariCP依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MYSQL包 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 默认就内嵌了Tomcat 容器,如需要更换容器也极其简单-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 测试包,当我们使用 mvn package 的时候该包并不会被打入,因为它的生命周期只在 test 之内-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

连接数据库

在application.yml中添加如下配置。值得注意的是,SpringBoot默认会自动配置DataSource,它将优先采用HikariCP连接池,如果没有该依赖的情况则选取tomcat-jdbc,如果前两者都不可用最后选取Commons DBCP2**。通过spring.datasource.type属性可以指定其它种类的连接池**

server:
  port: 8080
  servlet:
    context-path: /
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
    username: root
    password: root
  jpa:
    database: MySQL
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true
    hibernate:
#      create:每次运行程序时,都会重新创建表,故而数据会丢失
#      create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表
#      upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
#      validate:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错
#      none: 禁用DDL处理
      ddl-auto: update

ddl-auto 说明

  • create: 每次运行程序时,都会重新创建表,故而数据会丢失
  • create-drop: 每次运行程序时会先创建表结构,然后待程序结束时清空表
  • upadte: 每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)
  • validate: 运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错

实体类

import lombok.Data;
import lombok.experimental.Accessors;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;

/**
 * @author baicaizhi
 */
@Entity(name = "user")
@Data
@Accessors(chain = true)
public class User implements Serializable {
//    TABLE: 使用一个特定的数据库表格来保存主键
//    SEQUENCE: 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)。
//    IDENTITY: 主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
//    AUTO: 主键由程序控制,也是GenerationType的默认值。
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Integer age;
}

mapper层

创建UserRepository数据访问层接口,需要继承JpaRepository<T,K>,第一个泛型参数是实体对象的名称,第二个是主键类型。只需要这样简单的配置,该UserRepository就拥常用的CRUD功能,JpaRepository本身就包含了常用功能,剩下的查询我们按照规范写接口即可,JPA支持@Query注解写HQL,也支持findAllByUsername这种根据字段名命名的方式(强烈推荐IntelliJ IDEA对JPA支持非常NICE)

import com.baicaizhi.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author baicaizhi
 */
@Repository
public interface UserRepository extends JpaRepository<User,Long> {

}

Controller层

import com.baicaizhi.entity.User;
import com.baicaizhi.mapper.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author Administrator
 */
@RestController
@Slf4j
public class UserRepositoryController {
    @Resource
    UserRepository userRepository;
    @GetMapping("/")
    public void count(){
        final User user = userRepository.save(new User().setName("baicaizhi3").setAge(23));
        log.info("[添加成功] - [{}]", user);
        final List<User> u1 = userRepository.findAll();
        log.info("[条件查询] - [{}]", u1);
        Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Order.desc("name")));
        final Page<User> users = userRepository.findAll(pageable);
        log.info("[分页+排序+查询所有] - [{}]", users.getContent());
        userRepository.findById(users.getContent().get(0).getId()).ifPresent(user1 -> log.info("[主键查询] - [{}]", user1));
        final User edit = userRepository.save(new User().setId(user.getId()).setName("baicaizhi3修改后"));
        log.info("[修改成功] - [{}]", edit);
        userRepository.deleteById(user.getId());
        log.info("[删除主键为 {} 成功]", user.getId());
    }
}

结果

在这里插入图片描述

标签:SpringDataJpa,SpringBoot,数据库,springframework,user,org,系列学习,import,主键
From: https://blog.csdn.net/qq_41896953/article/details/143631269

相关文章