• 【ORM框架】Spring Data JPA(一)-- 入门


    本文参考:spring Data JPA入门   【原创】纯干货,Spring-data-jpa详解,全方位介绍  Spring Data JPA系列教程--入门

    一、Spring Data JPA介绍

    1、什么是JPA?什么是Spring Data JPA?

    JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。

    注意:JPA是一套规范,不是一套产品,那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为JPA的实现产品

    Spring Data JPA 是 Spring 基于 ORM 框架(hibernate)、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展。

    2、Spring Data JPA能干什么?

    spring data jpa让我们解脱了DAO层的操作,基本上所有CRUD都可以依赖于它来实现。

    具体点来说就是只需要编写一个接口,继承spring data jpa相应接口,不需要编写实现类,创建一个实体类,不需要创建相应的数据库表,就可以使用基本的CRUD功能。

    public interface UserRepository extends CrudRepository<User, Long>{}
    3、Spring Data JPA与hibernate的关系

    我们做Java开发的都知道Spring的强大,到目前为止,企业级应用Spring几乎是无所不能,无所不在,已经是事实上的标准了,企业级应用不使用Spring的几乎没有,这样说没错吧。而Spring整合第三方框架的能力又很强,他要做的不仅仅是个最早的IOC容器这么简单一回事,现在Spring涉及的方面太广,主要是体现在和第三方工具的整合上。而在与第三方整合这方面,Spring做了持久化这一块的工作,我个人的感觉是Spring希望把持久化这块内容也拿下。于是就有了Spring-data-**这一系列包。包括,Spring-data-jpa,Spring-data-template,Spring-data-mongodb,Spring-data-redis,还有个民间产品,mybatis-spring,和前面类似,这是和mybatis整合的第三方包,这些都是干的持久化工具干的事儿。

    Spring-data-jpa,表示与jpa的整合,底层都是由hibernate来实现。

    4、有什么优点?有什么缺点?

    优点:

      a、不需要写SQL,SQL会自动生成

      b、SQL语句不依赖数据库,移植性强,更换数据库较为容易。

    缺点:

      a、SQL优化比较困难

      b、相比mybatis入门门槛较高

    5、适用场景?

    适用与需求变化不多的中小型项目中,比如后台管理,erp,orm,oa 

    二、Spring Data JPA结构

    Spring Data JPA 提供的编程接口

    • Repository:最顶层的接口,是一个空接口,目的是为了统一所有的Repository的类型,且能让组件扫描时自动识别。
    • CrudRepository: Repository的子接口,提供CRUD的功能。
    • PagingAndSortingRepository: CrudRepository的子接口, 添加分页排序。
    • JpaRepository: PagingAndSortingRepository的子接口,增加批量操作等。
    • JpaSpecificationExecutor: 用来做复杂查询的接口。

    接口继承关系图:

    三、Spring Data JPA、hibernate与Springboot集成入门实战

    1、配置环境

      MySQL:5.7.17

      Springboot:2.1.4.RELEASE

    2、添加依赖  

    <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
    
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
      </dependency>
    
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>

    3、修改application.properties文件

    # DataSource
    spring.datasource.url=jdbc:mysql://localhost:3306/blog?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    # JPA
    spring.jpa.show-sql = true
    spring.jpa.hibernate.ddl-auto=create-drop

    4、实体User

    实体的规范、注解、解析下一篇文章会详细描述。

    @Entity  // 实体
    public class User implements Serializable{
     
        private static final long serialVersionUID = 1L;
        
        @Id  // 主键
        @GeneratedValue(strategy=GenerationType.IDENTITY) // 自增长策略
        private Long id; // 用户的唯一标识
    
        @Column(nullable = false) // 映射为字段,值不能为空
         private String name;
        
        @Column(nullable = false)
        private Integer age;
    
        protected User() {  // JPA 的规范要求无参构造函数;设为 protected 防止直接使用 
        }
    
        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return String.format(
                    "User[id=%d, name='%s', age='%d']",
                    id, name, age);
        }
    }
    5、编写资源库
    public interface UserRepository extends CrudRepository<User, Long>{}
    6、控制器
    @RestController
    @RequestMapping("/users")
    public class UserController {
        
        @Autowired 
        private UserRepository userRepository;
    
        /**
         * 从 用户存储库 获取用户列表
         * @return
         */
        private List<User> getUserlist() {
            List<User> users = new ArrayList<>();
            for (User user : userRepository.findAll()) {
                users.add(user);
            }
             return users;
        }
    }
    7、项目启动前的数据库处理

      a、启动MySQL Server

      b、创建blog数据库

    8、启动项目

      可以看到自动创建了数据表

  • 相关阅读:
    Tye exception
    DataSeeder
    angular
    认证Authentication
    MVC
    Ef Core
    工作单元
    VirtualFileSystem
    中间件
    日志
  • 原文地址:https://www.cnblogs.com/jsyllhb/p/10758352.html
Copyright © 2020-2023  润新知