一、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]([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