SpringData学习

第一章 SpringData概述

持久层开发的问题
随着互联网技术的发展,现在的企业开发中用到的用于数据存储的产品,不再仅仅是关系型数据
库,而是要根据场景需要选择不同的存储技术,比如用于缓存热点数据的redis,用于存储文档数据的
mongodb,用于支持强大搜索功能的elasticsearch等等。
在这里插入图片描述
在Java中,对于上面所说的产品都提供了优秀的访问技术。比如针对关系型数据库的mybatis、jpa等
技术,针对于redis的jedis技术等等… 这些技术虽然可以很好的针对各个存储产品进行访问操作,但同
时也带来了新的问题,那就是不同的持久层技术的API是不一样的。
这样一来,开发人员就必须同时掌握多种数据访问技术,这无疑增加了开发成本。那么我们会想,
有没有这样一种技术,它可以使用一套API支持各个不同的存储的访问呢?就在这样的需求下,
SpringData产生了。

SpringData简介

什么是SpringData
SpringData是一个用来简化dao层开发的框架。它在保证了各个底层存储特性的同时,提供了一套
统一的数据访问API。它可以很好的支持常用的关系型数据库和非关系型数据库。
使用SpringData作为dao层开发技术,将大大简化代码量,而且其API比各个技术的原生API更加简
单易用。
SpringData的主要模块
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回顾

JPA基础
JPA 的全称是 Java Persistence API,即 Java 持久化 API,是 SUN 公司推出的一套基于 ORM 的规
范,注意不是 ORM 框架——因为 JPA 并未提供 ORM 实现,它只是提供了一些编程的 API 接口。
在这里插入图片描述

JPA实战

目标
本章节我们是实现的功能是搭建Jpa环境,并实现一条数据的增删改查。
准备数据库环境

--准备数据库,创建一张文章表备用 
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`) 
);

创建java工程,导入坐标

<dependencies>
        <!-- mysql坐标 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!-- Hibernate -->
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
        <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>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

创建实体类 在实体类中配置映射关系

@Entity                     //告诉JPA这是一个实体类,需要把它跟数据库中的表做映射
@Table(name = "article")    //@Table建立了实体类和数据表的关系 name指向表名
public class Article implements Serializable {
    
    

    @Id //注解声明主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) //指定主键生成策略,GenerationType.IDENTITY对应mysql中数据自增策略
    private int aid;

    @Column(name = "author")    //如果实体类的字段跟数据表中的字段不对应可以添加@Column注解
    private String author;
    private Date createTime;
    private String title;
    /**
    省略getter和setter方法
    */
}

加入 JPA 的核心配置文件
在maven工程的resources路径下创建一个名为META-INF的文件夹,在文件夹下创建一个名为 persistence.xml的配置文件。注意: META-INF文件夹名称不能修改,persistence.xml文件名称不能 改。
在这里插入图片描述

<?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">
    <!--持久化单元--><!--相当于这个配置是用于一种类型的数据库 可以再配置一个持久化单元如Oracle的 用于连接Oracle-->
    <!--name:持久化单元的名称
        transaction-type:   事务类型
            RESOURCE_LOCAL: 本地事务 即用的就是数据里的事务
            JTA:            分布式事务
        -->
    <persistence-unit name="jpa01" transaction-type="RESOURCE_LOCAL">
        <!--指定JPA规范的服务提供商-->
        <!--当项目中有且仅有一个JPA的实现时 此选项可以省略-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

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

        <properties>
            <!--跟数据库相关的信息 采用键值对的信息配置-->
            <!--    驱动  url:端口  用户名 密码  -->
            <!--如果键不会写 可以查看hibernate-entitymanager包下->org.hibernate->jpa->AvailableSettings(可见的配置)
            -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///springdata"/>
            <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>

测试

public class JpaTest {
    
    


    //保存
    @Test
    public void testSave(){
    
    
        //0.创建了一个文章对象
        Article article = new Article();
        article.setAuthor("张三");
        article.setCreateTime(new Date());
        article.setTitle("测试文章");

        //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();
    }

    //查询操作
    @Test
    public void testFind(){
    
    
        //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);
        System.out.println(article);

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

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

    //修改操作
    @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.setTitle("JAVAWEB黑马程序员");
        entityManager.merge(article);

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

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

    //删除操作
    @Test
    public void testDelete(){
    
    
        //加载配置文件中的配置信息到持久化管理工厂
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa01");
        //获取持久化管理器
        EntityManager manager = entityManagerFactory.createEntityManager();
        //通过管理器获取事务
        EntityTransaction transaction = manager.getTransaction();
        //开启事务
        transaction.begin();
        //执行删除操作       先查询 再删除
        Article article = manager.find(Article.class, 3);
        manager.remove(article);
        //提交事务
        transaction.commit();
        //关闭资源
        manager.close();
    }
}

注意事项补充
在这里插入图片描述
在这里插入图片描述
JPA的重要API介绍
EntityManagerFactory接口主要用来创建EntityManager实例 EntityManagerFactory是一个线程安全的对象,并且其创建极其浪费资源,所以编程的时候要保持它是单 例的。
EntityManager
在JPA规范中,EntityManager是操作数据库的重要API,他是线程不安全的,需要保持线程独有。 重要方法说明:
getTransaction: 获取事务对象
persist:保存操作
merge:更新操作
remove:删除操作
find/getReference:根据id查询

第三章 SpringData JPA基础

SpringData JPA简介
SpringData JPA是Spring Data家族的一个成员,是Spring Data对JPA封装之后的产物,目的在于简
化基于JPA的数据访问技术。使用SpringData JPA技术之后,开发者只需要声明Dao层的接口,不必再写
实现类或其它代码,剩下的一切交给SpringData JPA来搞定 。
SpringData JPA快速入门
目标
本章节我们是实现的功能是搭建SpringData JPA环境,并实现一条数据的增删改查。
准备数据环境(JPA自动建表即可) 创建java工程,导入坐标

Guess you like

Origin blog.csdn.net/Fhakjfksakln/article/details/121110525