SpringData高级应用之SpringData概述

一、SpringData概述

1、持久层开发问题

   由于互联网技术的发展,现在所要掌握的技术不仅是关系型数据库、还有用于缓存热点数据的redis、用于存储文档数据的mongdb、用于支持强大搜索功能的elasticsearch,同时这些技术需要不同的API,为了简化操作,并统一接口,便用SpringData来作为中转站,掌握了SpringData就可以正常使用上诉的功能。

2、SpringData简介

2.1 什么是SpringData
    SpringData是一个用来简化Dao开发的框架,它在保证了各个底层存储特性的同时,提供了一套统一的数据访问API,它可以很好地支持常用的关系型数据库和非关系型数据库。
      使用SpringData作为Dao层开发技术,将大大简化代码质量,而且其API比各个技术的原生API更加简单易用。
2.2 SpringData的主要模块
       Spring Data common         SpringData的核心模块,定义了SpringData的核心功能
       Spring Data JDBC                 对JDBC的Spring Data存储库支持
       Spring Data JPA                    对JPA的SPring Data存储库支持
       Spring Data MongoDB      对MongoDB的基于Spring对象文档的存储库支持
        Spring Data Redis               封装jedis技术,对redis实现访问操作
        Spring Data Elasticsearch  对Elasticsearch实现访问操作 

二、JPA相关知识

1、JPA基础

       Hibernate是一个全自动的ORM框架,是对JDBC技术的封装,它在实体类和数据库表之间建立了映射关系,使得程序员可以使用面向编程的思维来操纵数据库,而Hibernate会自动给我们生成SQL语句
 JPA的全称是Java Persistence API,即Java持久化API,是SUN公司推出的一套基于ORM的规范,注意不是ORM的框架,因为JPA并不能提供ORM实现,它只是提供了一些编程的API接口

![image.png](https://img-blog.csdnimg.cn/img_convert/47dadef5e89265fdfdc753d8d2a3a054.png#clientId=u21fc48a4-3887-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=387&id=u4e4a3c6d&margin=[object Object]&name=image.png&originHeight=387&originWidth=797&originalType=binary&ratio=1&rotation=0&showTitle=false&size=82401&status=done&style=none&taskId=u59929d18-8c13-486b-a0eb-c099c5591c7&title=&width=797)
JPA(ORM规范的作用:使得实现了JPA规范的ORM框架可以自由切换)

2、JPA实战

2.1 目标
              搭建JPA环境,并实现一条数据的增删改查
2.2 准备数据库环境
CREATE TABLE `article` ( 
	`aid` int(11) NOT NULL auto_increment COMMENT '主键', 
	`author` varchar(255) default NULL COMMENT '作者', 
	`createTime` datetime default NULL COMMENT '创建时间', 
	`title` varchar(255) default NULL COMMENT '标题', 
	PRIMARY KEY (`aid`) 
);


2.3 创建java工程导入坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>JPA_ZonJie</artifactId>
        <groupId>JPA_review</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>01-jpa-review</artifactId>

    <dependencies>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <!--Hibernate-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.7.Final</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
    </dependencies>

</project>
2.4 创建实体类并在实体类中配置映射关系
package com.itheima.domain;

import javax.persistence.*;
import java.util.Date;

//表示这是一个实体类
@Entity
//使用注解建立实体类和数据表之间的关系
@Table(name = "article") //@Table建立了实体类和数据表的关系   name指向表名
public class Article {
    /**
    CREATE TABLE 'article'(
            'aid' int(11) NOT NULL auto_increment COMMENT '主键',
            'author' varchar(255) default NULL COMMENT '作者',
            'createTime' datetime default NULL COMMENT '创建时间',
            'title' varchar(255) default NULL COMMENT '标题',
    PRIMARY KEY ('aid')
  );
     */
    //标识这是主键字段
    @Id
    //指定主键生成策略,GenerationType.IDENTITY就是对应到mysql中的数据自增策略
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "aid")
    private Integer aid;

    //使用@Column映射类的属性和数据表的字段关系  name指定表中的字段名
    //当类的属性名和数据表的字段名一致时,此注解可以省略
    @Column(name = "author")
    private String author;

    @Column(name = "createTime")
    private Date createTime;

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

    public Integer getAid() {
        return aid;
    }

    public String getAuthor() {
        return author;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public String getTitle() {
        return title;
    }

    public void setAid(Integer aid) {
        this.aid = aid;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public String toString() {
        return "Article{" +
                "aid=" + aid +
                ", author='" + author + '\'' +
                ", createTime=" + createTime +
                ", title='" + title + '\'' +
                '}';
    }
}

2.5 加入JPA的核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<persistence
        xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">

        <!--持久化单元-->
        <!--
           name 持久化单元的名称 唯一
           transaction-type  事务类型
           RESOURCE_LOCAL    本地事务     (可以理解成自己电脑上的数据库)
           JTA               分布式事务
        -->
        <persistence-unit name="jpa01" transaction-type="RESOURCE_LOCAL">
            <!--配置JPA规范的服务提供商
              当项目中只有一个JPA的实现时,此选项可省略-->
            <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

            <!--指定实体类,此选项可省略-->
            <class>com.itheima.domain.Article</class>

            <!--跟数据库相关的信息,驱动url用户名 密码-->
            <properties>
                <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
                <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/xxx"/>
                <property name="javax.persistence.jdbc.user" value="root"/>
                <property name="javax.persistence.jdbc.password" value="123456"/>

                <!--jpa的核心配置中兼容hibernate的配置-->
                <!--是否显示SQL-->
                <property name="hibernate.show_sql" value="true"/>

                <!--是否格式化显示的SQL-->
                <property name="hibernate.format_sql" value="true"/>

                <!--是否自动建表
                     update  如果数据库存在数据表,就使用;不存在,就创建
                     create  不管数据库有没有数据表,每次SQL请求都会重新建表
                -->
                <property name="hibernate.hbm2ddl.auto" value="update"/>

            </properties>
        </persistence-unit>
</persistence>
2.6 测试
     (1)  实现保存操作
package com.itheima.test;

import com.itheima.domain.Article;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.Date;

public class JpaTest {

    @Test
    public void testSave(){
        //创建了一个文章对象
        Article article = new Article();
        article.setTitle("测试文章");
        article.setAuthor("熊凯瑞");
        article.setCreateTime(new Date());

        //任务:使用JPA将文章对象保存到数据库中
        //1  创建一个持久化管理器工厂
        String persistenceUnitName = "jpa01";
        EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);

        //2  创建持久化管理器(这个API是最重要的一个API,基于此API可以完成获取事务以及对数据库的CRUD操作)
        EntityManager entityManager = factory.createEntityManager();

        //3  得到事务,并且开启
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        //4  操作
        entityManager.persist(article);

        //5  提交事务
        transaction.commit();

        //6  关闭资源
        entityManager.close();
    }
}
      (2)  实现修改操作
package com.itheima.test;

import com.itheima.domain.Article;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.Date;

public class JpaTest2 {

    @Test
    public void testUpdate(){

        //1  创建一个持久化管理器工厂
        String persistenceUnitName = "jpa01";
        EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);

        //2  创建持久化管理器(这个API是我们最重要的一个API,基于此API我们可以完成获取事务以及对数据库的CRUD操作)
        EntityManager entityManager = factory.createEntityManager();

        //3  得到事务,并且开启
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        //4  操作
        Article article = entityManager.find(Article.class,1);
        article.setAuthor("吃饭1");
        entityManager.merge(article);

        //5  提交事务
        transaction.commit();

        //6  关闭资源
        entityManager.close();
    }
}

     (3)  实现删除操作
package com.itheima.test;

import com.itheima.domain.Article;
import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaTest3 {

    @Test
    public void testRemove(){

        //1  创建一个持久化管理器工厂
        String persistenceUnitName = "jpa01";
        EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);

        //2  创建持久化管理器(这个API是我们最重要的一个API,基于此API我们可以完成获取事务以及对数据库的CRUD操作)
        EntityManager entityManager = factory.createEntityManager();

        //3  得到事务,并且开启
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        //4  操作
       Article article = entityManager.find(Article.class,1);
       entityManager.remove(article);

        //5  提交事务
        transaction.commit();

        //6  关闭资源
        entityManager.close();
    }
}

3、JPA中重要API介绍

3.1 EntityManagerFactory
1)这是一个工厂类,目的是为了创建EntityManager实例,2)对于这种工厂类,它是一个线程安全的对象,同时它的创建和销毁是十分耗费资源的,
在一个工程中一般维持一个就好(单例)
3.2 EntityManager

这是最重要的API,基于这个API可以完成数据库的CRUD操作
persist(T) find(Class , T) merge(class) remove(T)

在JPA规范中,EntityManager是操作数据库的重要API,他是线程不安全的,
需要保持线程独有。
重要方法说明:
     getTransaction:  获取事务对象
     persist: 保存操作
     merge: 更新操作
     remove: 删除操作
     find/getReference: 根据id查询
3.3 其它
persistence          // 通过读取持久化单元名称,根据配置创建持久化管理器工厂
EntityTransaction    // 进行事务管理begin,commit,rollback
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊凯瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值