Springboot-jpa

@JPA

#1. Spring Date JPA 介绍
Spring Data 是Spring的一个子项目,旨在统一和简化各类型数据的持久化存储方式,而不拘泥于是关系型数据库还是NoSQL数据库。无论是哪种持久化存储方式,数据访问对象(Data Access Objects,DAO)都会提供对对象的增加、删除、修改和查询的方法,以及排序和分页方法等。 Spring Data 提供了基于这些层面的统一接口(如:CrudRepository、 PagingAndSortingRepository),以实现持久化的存储。
JPA(Java Persistence API)是Java的持久化API,用于对象的持久化。它是一个非常强大的ORM持久化的解决方案,免去了使用JDBCTemplate开发的编写脚本工作。JPA通过简单约定好接口方法的规则自动生成相应的JPQL语句,然后映射成POJO对象。
JPA是一个规范化接口,封装了Hibernate的操作作为默认实现,让用户不通过任何配置即可完成数据库的操作。

##2.配置环境
使用Maven管理包,使用springboot框架,建个空maven项目。

 <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--spring-data-jpa-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.23</version>
        </dependency>
        <!--oracle桥接器-->
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

##3.aplication.yml的文档

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/"自己的数据库"?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&autoReconnect=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: rootroot

##4.实体类与表的映射

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "b_comment")
public class Comment {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

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

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

    @Column(name = "article_id")
    private Integer articleId;
}

##5.自定义接口

import com.wukongnotnull.domain.Comment;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import javax.transaction.Transactional;
import java.util.List;
import java.util.Optional;
// 记得添加该注解 @Repository
@Repository
public interface CommentRepository extends JpaRepository<Comment, Integer> {

    @Override
    List<Comment> findAll();

    @Override
    Optional<Comment> findById(Integer id);

    // 查询条件:作者不为空
    List<Comment> findByAuthorNotNull();


    @Override
    long count();

    @Override
    <S extends Comment> S saveAndFlush(S s);

      // 不能使用 * 通配符
    @Query("select c from b_comment c where c.articleId=?1",nativeQuery = false)
    List<Comment> getCommentList(Integer articleId);

      // 若使用通配符 * 
    @Query(value = "select * from b_comment c where c.articleId=?1",nativeQuery = true)
    List<Comment> getCommentList2(Integer articleId);

    @Transactional
    @Modifying
    @Query(value = "update b_comment set author =?1  where id =?2 ",nativeQuery = true)
    int updateComment(String author,Integer id);

    @Transactional
    @Modifying
    @Query(value = "delete from b_comment where id = ?1",nativeQuery = true)
    int deleteComment(Integer id);

    @Override
    <S extends Comment> S save(S entity);
}

##6.测试类

import com.wukongnotnull.domain.Comment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

    /*
    author: 悟空非空也(B站/知乎/公众号) 
    */
@SpringBootTest
class CommentRepositoryTest {

    @Autowired
    private  CommentRepository commentRepository;

    @Test
    void findAll() {
        System.out.println(commentRepository.findAll());
    }

      @Test
    void findById(){
        Optional<Comment> optionalComment = commentRepository.findById(1);
        if (optionalComment.isPresent()) {
            Comment comment1 = optionalComment.get();
            System.out.println(comment1);
        }

    }

    @Test
    void findByAuthorNotNull(){
        System.out.println(commentRepository.findByAuthorNotNull());
    }

    @Test
    void count(){
        System.out.println(commentRepository.count());
    }

    @Test
    void getCommentList(){
        System.out.println(commentRepository.getCommentList(1));
    }

    @Test
    void getCommentList2(){
        System.out.println(commentRepository.getCommentList2(1));
    }

    @Test
    void updateComment(){
        System.out.println(commentRepository.updateComment("6666", 6));
    }

    @Test
    void deleteComment(){
        System.out.println(commentRepository.deleteComment(6));
    }

    @Test
    void save(){
        Comment comment = new Comment();
        comment.setAuthor("wukongnotnull0716");
        comment.setContent("content .... wukong ...");
        System.out.println(commentRepository.save(comment));
    }
}

##7.JPA常用注解

注解 作用 常用属性
@Data 给实体类加get/set/toString/EqualsAndHashCode方法,是lombok的注解
@Entity 指定当前类是实体类
@Table 指定实体类和表之间的对应关系 name:指定数据库表的名称
@EntityListeners 在实体类增删改的时候监听,为创建人/创建时间等基础字段赋值 value:指定监听类
@Id 指定当前字段是主键
@SequenceGenerator 指定数据库序列别名 sequenceName:数据库序列名
@GeneratedValue 指定主键的生成方式 strategy :指定主键生成策略generator:选择主键别名
@Column 指定实体类属性和数据库表之间的对应关系 name:指定数据库表的列名称。unique:是否唯一 nullable:是否可以为空 nserttable:是否可以插入 updateable:是否可以更新 columnDefinition: 定义建表时创建此列的DDL
@CreatedBy 自动插入创建人
@CreatedDate 自动插入创建时间
@LastModifiedBy 自动修改更新人
@LastModifiedDate 自动修改更细时间
@Version 自动更新版本号
@JsonFormat 插入/修改/读取的时间转换成想要的格式 pattern:展示格式
上一篇:spring Data Jpa


下一篇:[项目分析]小而美个人博客