zoukankan      html  css  js  c++  java
  • 【快学springboot】7.使用Spring Boot Jpa

    jpa简介

    Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术。值得注意的是,JPA只是一套规范,不是具体的实现。Java很喜欢自己去定义规范,然后让厂商自己去实现,比如JMS等。

    Spring Data JPA

    Spring Data JPA是 Spring 基于 ORM(hibernate) 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架,按照约定好的【方法命名规则】写数据库(DAO)层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

    springboot整合JPA

    • maven依赖
    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid-spring-boot-starter</artifactId>
     <version>1.1.10</version>
    </dependency>
    

    这里我引入了阿里巴巴的druid数据库连接池。

    在application.properties配置数据库连接

    spring.datasource.druid.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    spring.datasource.druid.username=root
    spring.datasource.druid.password=123456
    spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    

    这里基本是固定的写法了,不同的是,这里的数据库连接池我使用了阿里巴巴的连接池。

    在application.properties配置spring data jpa一些信息

    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    

    spring.jpa.database-platform主要是指定生成表名的存储引擎为 InnoDBD

    show-sql 是否打印出自动生成的 SQL,方便调试的时候查看

    spring.jpa.hibernate.ddl-auto参数的作用主要用于:自动创建更新验证数据库表结构,有五个值

    1. create: 每次加载 hibernate 时都会删除上一次的生成的表,然后根据你的 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
    2. create-drop :每次加载 hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。
    3. update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model 类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
    4. validate :每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
    5. none:什么都不做

    添加一个实体类UserEntity

    @Entity
    @Table(name = "user")
    @Data
    public class User {
     @Id
     @GeneratedValue(strategy = GenerationType.SEQUENCE)
     private Integer id;
     @Column(name = "username", unique = true, nullable = true, length = 50)
     private String username;
     private String password;
    }
    

    可以使用Column注解来定义一些数据库表结构的东西,如果不使用,会自动使用驼峰的命名规则映射默认值。

    启动springboot项目,自动生成数据库表

    【快学springboot】7.使用Spring Boot Jpa

    这里生成了User表,可以看下它的表结构:

    【快学springboot】7.使用Spring Boot Jpa

    这里还生成了一个hibernate_sequence表:

    【快学springboot】7.使用Spring Boot Jpa

    主要是因为我设置了主键的值策略为GenerationType.SEQUENCE,它是根据这个表来实现自增的。

    添加一个UserRepo接口

    public interface UserRepo extends PagingAndSortingRepository<User, Integer>, JpaSpecificationExecutor<User> {
     
    }
    

    这里继承了PagingAndSortingRepository和JpaSpecificationExecutor两个接口,前者帮我们实现了CRUD、排序和分页等简单查询,后者是用来构造一些比较复杂的查询用的。

    UserRepo默认给我们提供的方法

    userRepo.findById(1);
    userRepo.findAll();
    userRepo.findAll(PageRequest.of(0, 10));
    userRepo.deleteById(1);
    User user = new User();
    userRepo.save(user);
    

    这里是基础的CRUD的使用方法了。需要注意的是,修改实体的话,是根据save方法来判断的,如果save的实体是从数据库里查出来的,save的时候就是修改。

    自定义查询方法

    User findUserByUsername(String username);
    User findUserByUsernameAndPassword(String username,String password);
    

    spring data jpa有一套映射到sql查询的方法命名规则。整理如下:

    【快学springboot】7.使用Spring Boot Jpa

    【快学springboot】7.使用Spring Boot Jpa

    【快学springboot】7.使用Spring Boot Jpa

    使用这些提供的查询方法,基本上可以应付我们需要的单表查询了。

    分页查询

    Page<User> findALL(Pageable pageable);
    Page<User> findByUserName(String userName,Pageable pageable);
    

    可以使用PageRequest.of(0, 10)来构建一个pageable。需要注意的是,这里分页从0开始。

    自定义SQL查询

    在UserRepo上,自定义方法。在 SQL 的方法上面使用@Query注解来写SQL,如涉及到删除和修改在需要加上@Modifying.也可以根据需要添加 @Transactional对事物的支持

    @Transactional
    @Modifying
    @Query("update User u set u.username= ?1 where u.id = ?2")
    int modifyByIdAndUserId(String username, Integer id);
     
    @Transactional
    @Modifying
    @Query("delete from User where id = ?1")
    void deleteByUserId(Long id);
    
  • 相关阅读:
    73. Set Matrix Zeroes
    289. Game of Live
    212. Word Search II
    79. Word Search
    142. Linked List Cycle II
    141. Linked List Cycle
    287. Find the Duplicate Number
    260. Single Number III
    137. Single Number II
    Oracle EBS中有关Form的触发器的执行顺序
  • 原文地址:https://www.cnblogs.com/happy4java/p/11205793.html
Copyright © 2011-2022 走看看