Spring Data JPA 概述 与 快速入门(操作 mysql 数据)

目录

Spring Data 简介

Spring Data 特点

JPA 简介

Spring Data JPA 简介

Spring Boot 数据库启动器

Spring Data JPA 快速入门


Spring Data 简介

1、对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。

2、Spring Boot 添加了大量自动配置,屏蔽了很多设置,引入各种 XxxTemplate,XxxRepository 来简化程序员对数据访问层的操作。对程序员来说只需要进行简单的配置即可使用

3、Spring Data 官网地址:https://projects.spring.io/spring-data/#quick-start

2、Spring Data 是一个用于简化数据库访问的开源框架,支持访问关系型数据库、非关系型数据库、map-reduce 框架、以及云计算服务等。

3、Spring Data 框架主要模块(Main modules)/子项目如下:

  • Spring Data Commons - Core Spring concepts underpinning every Spring Data project.
  • Spring Data JPA - Makes it easy to implement JPA-based repositories.
  • Spring Data JDBC - JDBC-based repositories.
  • Spring Data KeyValue - Map-based repositories and SPIs to easily build a Spring Data module for key-value stores.
  • Spring Data LDAP - Provides Spring Data repository support for Spring LDAP.
  • Spring Data MongoDB - Spring based, object-document support and repositories for MongoDB.
  • Spring Data REST - Exports Spring Data repositories as hypermedia-driven RESTful resources.
  • Spring Data Redis - Provides easy configuration and access to Redis from Spring applications.
  • Spring Data for Apache Cassandra - Spring Data module for Apache Cassandra.
  • Spring Data for Apache Solr - Spring Data module for Apache Solr.
  • Spring Data for Pivotal GemFire - Provides easy configuration and access to Pivotal GemFire from Spring applications.

4、Currently the release train contains the following modules(目前发布的 Spring Data 版本包含以下模块/子项目):

  • Spring Data Commons
  • Spring Data JPA
  • Spring Data KeyValue
  • Spring Data LDAP
  • Spring Data MongoDB
  • Spring Data REST
  • Spring Data Redis
  • Spring Data for Apache Cassandra
  • Spring Data for Apache Geode
  • Spring Data for Apache Solr
  • Spring Data for Pivotal GemFire
  • Spring Data Couchbase (community module)
  • Spring Data Elasticsearch (community module)
  • Spring Data Neo4j (community module)

Spring Data 特点

1、Spring Data 提供使用统一的 API 来对数据访问层进行操作,这主要是 Spring Data Commons项目来实现的。

2、Spring Data Commons 让程序员在使用关系型或者非关系型数据访问技术时都基于 Spring 提供的统一标准,而不用再关心底层到底是何种数据。

3、Spring Data Commons 提供的标准包含了常用的 CRUD(创建、获取、更新、删除)、查询、排序和分页等相关操作,对底层任意数据库都是使用一套 API 搞定,大大简化操作。

4、Spring Data 提供统一的 Repository(仓库) 接口

Repository:统一接口

RevisionRepository>:基于乐观锁机制

CrudRepository:通用 CRUD 操作

PagingAndSortingRepository:通用 CRUD 及分页操作

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第1张图片

5、提供数据访问模板类 xxxTemplate,如:MongoTemplate、RedisTemplate 等 

JPA 简介

1、JPA 全称 Java Persistence API(Java 持久化API),是 Java 官方提出的 Java 持久化规范,为开发人员提供了一种对象/关系映射工具来管理 Java 应用中的关系数据,从 Java EE 5 开始发布。

2、JPA (Java 持久化 API) 为对象关系映射提供POJO持久性模型,由 JESR 220 的 EJB 3 软件专家组开发,但它的使用不限于EJB 软件组件。它也可以直接由 Web 应用程序和应用程序客户端使用,甚至可以在Java EE平台之外,例如,在Java SE应用程序中使用。

Java Persistence API

The Java Persistence API provides a POJO persistence model for object-relational mapping. The Java Persistence API was developed by the EJB 3.0 software expert group as part of JSR 220, but its use is not limited to EJB software components. It can also be used directly by web applications and application clients, and even outside the Java EE platform, for example, in Java SE applications. See JSR 220.

3、目前比较成熟的 JPA 框架主要包括 Jboss 的 Hibernate EntityManager、Oracle 捐献给 Eclipse 社区的 EclipseLink、Apache 的 OpenJPA ,以及 Spring 的 Spring Data JPA 等。

4、Oracle JPA 官网地址:http://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp-140049.html

5、官方 Java Persistence API  2.0 文档:https://pan.baidu.com/s/1voR5UCNawmeE65DKxtqpRg 密码:ycv1

Spring Data JPA 简介

1、Spring Data JPA 是 Spring Data 框架下的一个子项目,目的是专门用于简化关系型数据库的操作。同理还有简化 Redis 操作的 Spring Data Redis 、简化 Solr 操作的 Spring Data for Apache Solr 、简化 MongoDB 操作的 Spring Data MongoDB 等

2、Spring Data JPA 官网:https://projects.spring.io/spring-data-jpa/#quick-start

3、Spring Data JPA 2.1.0 官方文档:https://docs.spring.io/spring-data/jpa/docs/2.1.0.RC2/reference/html/

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第2张图片

4、项目开发中程序员面向 Spring Data 编程,只需要实现对应的接口重写其中的方法即可操作数据库

5、如上图所示操作关系型数据库时引入 Sping Data JPA 模块,然后实现接口重写方法即可操作,同理操作 Resid 时引入 Spring Data Redis,操作 MongoDB 时引入 Spring Data MongDB。

6、Sping Data JPA 底层默认由 Hibernate 实现,但操作比 Hibernate 更简单,以前 Hibernate 还要自己封装 BaseDao 层,而 Spring Data JPA 连这一步都省略了,实现接口之后,就可以直接调用其中的 CRUD 方法以及排序、分页等方法,更加简洁。

Spring Boot 数据库启动器

1、可以参考官方文档:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#using-boot-starter

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第3张图片

Spring Data JPA 快速入门

1、Sping Data JPA 底层默认由 Hibernate 实现,同样基于 ORM(对象关系型映射),但操作比 Hibernate 更简单,以前 Hibernate 还需要程序员封装 BaseDao 层,而 Spring Data JPA 连这一步都省略了,实现接口之后,就可以直接调用其中的 CRUD 方法以及排序、分页等方法,更加简洁。

2、Spring Data 提供统一的 Repository(仓库) 接口:

1、Repository:统一接口,根接口
2、RevisionRepository>:基于乐观锁机制
3、CrudRepository:通用 CRUD 操作接口
4、PagingAndSortingRepository:通用 CRUD 及分页、排序等操作操作
5、JpaRepository:操作关系型数据库时,只要继承此接口,则相当于有了 CRUD、分页、排序等常用的所有方法,程序员可以直接调用。

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第4张图片

3、本文环境 Java JDK 1.8 + Spring Boot 2.0.4 + Mysql 5.6,应用 pom.xml 文件依赖如下:



    4.0.0

    www.wmx.com
    seals
    0.0.1-SNAPSHOT
    jar

    seals
    Demo project for Spring Boot

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.4.RELEASE
        
        
    

    
        UTF-8
        UTF-8
        1.8
    

    
        
        
            org.springframework.boot
            spring-boot-starter-data-jpa
        

        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        

        
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            mysql
            mysql-connector-java
            runtime
        

        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第5张图片

一:数据源配置

1、本文直接使用默认 Spring Boot 2.0.4 提供的 默认数据源 HikariDataSource ,如果需要使用 DruidDataSource 的可以参考《 Spring Boot 自定义数据源 DruidDataSource》

spring:
  datasource:
    username: root
    password: root
    #seals 数据库必须事先在 Mysql 数据库中创建好,上面的 Mysql 账号密码也必须正确
    url: jdbc:mysql://localhost:3306/seals?characterEncoding=UTF-8   
    driver-class-name: com.mysql.jdbc.Driver

高版本的 spring boot 搭配 mysql 驱动版本较高时,如 mysql-connector-java:8.0.16,此时 driver-class-name 的值要带 cj;url 的值要带时区 serverTimezone,如:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver

2、可以测试一下获取数据源是否成功

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SealsApplicationTests {
    /**
     * Spring Boot 默认已经配置好了数据源,程序员可以直接 DI 注入然后使用即可
     */
    @Resource
    DataSource dataSource;
    @Test
    public void contextLoads() throws SQLException {
        System.out.println("数据源>>>>>>" + dataSource.getClass());
        Connection connection = dataSource.getConnection();
        System.out.println("连接>>>>>>>>>" + connection);
        System.out.println("连接地址>>>>>" + connection.getMetaData().getURL());
        connection.close();
    }
}

3、控制台输出如下:

数据源>>>>>>class com.zaxxer.hikari.HikariDataSource
连接>>>>>>>>>HikariProxyConnection@565077371 wrapping com.mysql.jdbc.JDBC4Connection@799f916e
连接地址>>>>>jdbc:mysql://localhost:3306/seals?characterEncoding=UTF-8

2018-08-25 11:21:01.428  INFO 17440 --- [       Thread-2] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@210ab13f: startup date [Sat Aug 25 11:20:56 CST 2018]; root of context hierarchy
2018-08-25 11:21:01.433  INFO 17440 --- [       Thread-2] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2018-08-25 11:21:01.434  INFO 17440 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2018-08-25 11:21:01.441  INFO 17440 --- [       Thread-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

Process finished with exit code 0

二:POJO 实体对象

1、提供封装数据库表 area 的 POJO ,以及配置与数据库表的映射关系.

2、因为 Spring Data JPA 也是基于 ORM 思想,而且底层又是 Hibernate 实现,所以 POJO 与数据库表的映射关系写法与以前写 Hibernate 时基本无异

3、同理可以自己在数据库中手动建表,或者通过 Hibernate 根据映射关系自动建表,本文演示后者。

4、注意再提醒一次:所有需要 Spring Boot 自动扫描的注解必须放在应用启动类同目录下

import javax.persistence.*;
import java.util.Date;
/**
 * Created by Administrator on 2018/8/25 0025.
 * 区域--------实体类
 *
 * @Entity :告诉 JPA 本类是一个与数据库表进行映射的实体类,而不是普通的 Java Bean
 * @Table :指定本映射实体类与数据库哪个表进行映射,不写时默认为类名首字母小写(area)
 */
@Entity
@Table(name = "area")
public class Area {
    /**
     * @Id : 指定此字段为数据库主键
     * @GeneratedValue :指定主键生成的策略(strategy),可以选择如下:
     * TABLE,
     * SEQUENCE:由 DB2、Oracle、SAP DB 等数据库 使用自己的 序列 进行管理生成
     * IDENTITY:由数据库自己进行管理,如 Mysql 的 自动递增
     * AUTO:让ORM框架自动选择,默认值
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    /**
     * @Column :指定此属性映射数据库表的哪个字段,不写时默认为属性名
     * length :指定此字段的长度,只对字符串有效,不写时默认为255
     * unique :是否添加唯一约束,不写时默认为 false
     * 更多详细属性,可以进入 javax.persistence.Column 查看
     */
    @Column(name = "name", length = 32, unique = true)
    private String name;

    /**
     * nullable :表示此字段是否允许为null
     */
    @Column(nullable = false)
    private String clients;
    private Date createTime;

   //省略 getter、setter 方法未粘贴
}

javax.persistence.Entity、javax.persistence.Id 注解必须要写,否则启动报错!

三:自定义 Dao 接口

1、编写一个 Dao 接口(Repository)来操作实体类对应的数据表,实现了如下的接口,就拥有了其对应的方法。

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第6张图片

2、因为使用的是 Spring Data JPA,所以直接继承 JpaRepository 接口,之后便可以直接从 service 层或者 Controller层调用其方法。

import com.lct.www.domain.Area;
import org.springframework.data.jpa.repository.JpaRepository;
/**
 * Created by Administrator on 2018/8/25 0025.
 * 自定义接口继承 JpaRepository 即可
 * T :泛型,传入操作的实体类即可
 * TD:传入实体类主键的类型
 * 如果是以前 Hibernate 则还需要在 Dao 层的实现类上加 @Repository 注解注入每一个 Dao实现组件
 * 而 Spring Data JPA 的数据库访问层就已经完成了,继承了JpaRepository接口,就拥有了所有的 CRUD方法、排序、分页方法
 * 继承 JpaRepository 之后,本接口就已经是 JPA 的 @Repository 了,所以不要再加,直接在 service层或者controller层注入即可
 */
public interface AreaDao extends JpaRepository {
}

四:Spring data JPA 配置

1、Spring Boot 提供了配置 JPA,如以前 Hibernate 时期的是否显示 sql 语句,对表策略等,如下所示只是写法略有不同,意义与以前 Hibernate 时完全一样。

2、如果是自己在数据库中手动建表,则省略 "ddl-auto" 的对表策略配置即可

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://localhost:3306/seals?characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver

#JPA 配置,可以参考官网:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#common-application-properties
  jpa:
#    hibernate:
#       ddl‐auto: update # 更新或者创建数据库表结构,省略时将不会自动生成数据库表
#       show‐sql: true # 控制台是否显示SQL
    generate-ddl: true # 是否根据实体(@Entity)自动建表,默认为 false。
    show-sql: true # 是否显示 sql 语句

3、完整配置选项可以参考官网:https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#common-application-properties,内容如下所示:

# JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration)
spring.data.jpa.repositories.enabled=true # Whether to enable JPA repositories.
spring.jpa.database= # Target database to operate on, auto-detected by default. Can be alternatively set using the "databasePlatform" property.
spring.jpa.database-platform= # Name of the target database to operate on, auto-detected by default. Can be alternatively set using the "Database" enum.
spring.jpa.generate-ddl=false # Whether to initialize the schema on startup.
spring.jpa.hibernate.ddl-auto= # DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property. Defaults to "create-drop" when using an embedded database and no schema manager was detected. Otherwise, defaults to "none".
spring.jpa.hibernate.naming.implicit-strategy= # Fully qualified name of the implicit naming strategy.
spring.jpa.hibernate.naming.physical-strategy= # Fully qualified name of the physical naming strategy.
spring.jpa.hibernate.use-new-id-generator-mappings= # Whether to use Hibernate's newer IdentifierGenerator for AUTO, TABLE and SEQUENCE.
spring.jpa.mapping-resources= # Mapping resources (equivalent to "mapping-file" entries in persistence.xml).
spring.jpa.open-in-view=true # Register OpenEntityManagerInViewInterceptor. Binds a JPA EntityManager to the thread for the entire processing of the request.
spring.jpa.properties.*= # Additional native properties to set on the JPA provider.
spring.jpa.show-sql=false # Whether to enable logging of SQL statements.

1、spring.jpa.database-platform= #要操作的目标数据库的名称,默认情况下自动检测,也可以使用“数据库”枚举设置.

2、jpa 建表时默认使用 MyISAM 存储引擎,而 MyISAM 是不支持事务的,要想支持需要将表的存储引擎设为InnoDB:

spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect  #指定 JPA 底层的 hibernate方言,使用 InnoDB 作为存储引擎

五:测试生成表

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第7张图片

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第8张图片

六:AreaController 控制层

1、直接浏览器访问控制层,然后进行 CRUD 操作,操作结果直接返回给页面,不做跳转。

import com.lct.www.dao.AreaDao;
import com.lct.www.domain.Area;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Optional;
/**
 * Created by Administrator on 2018/8/25 0025.
 * 区域---控制层
 */
@Controller
public class AreaController {
    @Resource
    private AreaDao areaDao;
    /**
     * 根据id 查询
     *
     * @param id
     * @return
     */
    @ResponseBody
    @GetMapping("/seals/{id}")
    public Area findAreaById(@PathVariable("id") Integer id, HttpServletResponse response) {
        System.out.println("com.lct.www.controllr.AreaController.findAreaById:::" + id);
        /**
         * 推荐使用 findById 方式,而不是 getOne方法
         * isPresent 判断 Optional是否为空,即有没有值
         */
        Optional areaOptional = areaDao.findById(id);
        if (!areaOptional.isPresent()) {
            return null;
        } else {
            System.out.println("area2::" + areaOptional.get());
            /** 获取Area值*/
            return areaOptional.get();
        }
    }

    /**
     * 查询所有
     *
     * @return
     */
    @ResponseBody
    @GetMapping("/seals")
    public List findAllAreas() {
        List areaList = areaDao.findAll();
        return areaList;
    }

    /**
     * 添加 区域
     * localhost:8080/seals/save?name=党建学习区&clients=1,2&createTime=2018/08/12
     * localhost:8080/seals/save?name=一学一做区&clients=4,5,6&createTime=2018/08/15
     *
     * @param area
     * @return 添加成功后重定向到查询所有
     */
    @GetMapping("seals/save")
    public String saveArea(Area area) {
        /**
         * save 方法:当实体的主键不存在时,则添加;实体的主键存在时,则更新
         */
        areaDao.save(area);
        return "redirect:/seals";
    }

    /**
     * 更新区域
     * localhost:8080/seals/save?id=2&name=一学一做区2&clients=4,5,6&createTime=2018/08/15
     *
     * @param area
     * @return
     */
    @GetMapping("/seals/update")
    public String updateArea(Area area) {
        /**
         * save 方法:当实体的主键不存在时,则添加;实体的主键存在时,则更新
         */
        areaDao.save(area);
        return "redirect:/seals";
    }

    /**
     * 根据主键 id 删除区域
     *
     * @return
     */
    @GetMapping("/seals/del/{id}")
    public String deleteAreaById(@PathVariable("id") Integer id) {
        areaDao.deleteById(id);
        return "redirect:/seals";
    }


    /**
     * 删除表中所有数据
     *
     * @return
     */
    @GetMapping("seals/delAll")
    public String deleteAll() {
        areaDao.deleteAll();
        return "redirect:/seals";
    }

    /**
     * 另外还有分页查询、排序查询等,在此就不再一一测试
     */
}

七:CRUD 测试

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第9张图片

2、查询测试:

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第10张图片

3、修改测试:

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第11张图片

4、删除测试:

Spring Data JPA 概述 与 快速入门(操作 mysql 数据)_第12张图片

 

《Spring Data JPA 常用 CRUD 操作汇总》

你可能感兴趣的:(Spring,Data,JPA)