文档:D:\springdata
SpringData是一个用来简化dao层开发的框架.在保证了各个底层存储特性同时,提供了一套统一的数据访问API.它可以很好的支持常用的关系型数据库和非关系型数据库.
使用SpringData做为dao层开发技术,将大大简化代码,而且其API比各个技术的原生API更加简单易用
SpringData支持的持久层技术非常多,下面是几个常见的
1.Spring Data common-------SpringData的核心模块,定义了SpringData的核心功能
2.Spring Data JDBC-----------对JDBC的的封装
3.Spring Data JPA--------------对JPA的封装
4.Spring Data MongoDB------对MongoDB的基于Spring对象文档的存储支持
5.Spring Data Redis------------封装jedis技术,对redis实现访问操作
6.Spring Data Elasticsearch---对Elasticsearch实现访问操作
JPA:java持久层API,是SUN公司退出的一套基于ORM的规范,注意不是ORM框架
,ORM(映射)框架比如,Hibernate,Mybatis(准确讲算半自动ORM框架)
JPA只提供了一些编程API接口即规范,并未实现
新建个库springdata 插入下面这张表
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`) ); 新建一个空的maven工程 做为原生JPA复习 注意:这里为什么引入Hibernate原因: Hibernate实现了JPA 而MyBatis并没有实现JPA,因此学JPA就要引入Hibernate新建一个子模块
pom.xml
mysql mysql-connector-java 5.1.6 org.hibernate hibernate-entitymanager 5.0.7.Final junit junit 4.12 test log4j log4j 1.2.12 org.projectlombok lombok RELEASE compile
实体类导入的注解都是javax包下的
加入JPA的核心配置文件
JAP规定
在maven工程的resources路径下创建一个名为META-INF的文件夹,在文件夹下创建一个名为 persistence.xml的配置文件。注意: META-INF文件夹名称不能修改,persistence.xml文件名称不能 改。
查询
JPA中修改:要求先查询再修改
JPA中删除:要求先查询再删除
关于JPA配置文件
可以将数据库表删掉试下
上面就是原生JPA的写法
关于JPA的重要API介绍:
EntityManagerFactory:
EntityManagerFactory接口主要用来创建EntityManager实例,
EntityManagerFactory是一个线程安全的对象,并且其创建机器浪费资源,所以编程的时候要保持单例的
EntityManager:
在JPA规范中,EntityManager是操作数据库的重要API,他是线程不安全的,需要保持线程独有.
重要方法说明:
getTransaction:获取事务对象
persist:保存操作
merge:更新操作
remove:删除操作
find/getReference:根据id查询
上面是原生JPA的一些基础
下面开始SrpingData JPA的基础使用,快速入门
SpringData JPA简介:
SpringData JPA是Spring Data家族的一个成员,是Spring Data对JPA封装之后的产物,目的简化基于JPA的数据访问技术.使用SpringData JPA技术之后,开发者只需要声明Dao层接口,不必再写实现类或其他代码,剩下一切交给SpringData JPA来搞定
搭建SpringData JPA环境,并实现数据的增删改查
注意,以后的操作,都是让JPA自动生成表结构,不再手动建表了
引入依赖
log4j log4j 1.2.12 junit junit 4.12 org.hibernate hibernate-entitymanager 5.0.7.Final mysql mysql-connector-java 5.1.6 org.springframework spring-context 5.1.6.RELEASE org.springframework spring-test 5.1.6.RELEASE org.springframework spring-orm 5.1.6.RELEASE org.aspectj aspectjweaver 1.8.7 org.springframework.data spring-data-jpa 2.1.8.RELEASE
创建实体类,这里故意将表明和某些字段明改了
/*** @author hrui* @date 2022/12/30 15:53*/
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
//使用注解建立实体类和数据表之间的对应关系
//@Table建立实体类和数据表的关系,如果类名和表名相同,可以不写
@Table(name="t_article")
@Entity//告诉JPA这个是一个实体类,需要把它跟数据库中的表加映射,必须写
public class Article {//@Id//标识这是个主键字段//GenerationType.IDENTITY主键生成自增策略@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer aid;//使用@Column映射类的属性和数据表的字段关系//当类的属性名和数据表的字段名一致,可省略@Column(name="author")private String author;@Column(name="create_time")private Date createTime;@Column(name="title")private String title;
}
编写dao层接口
使用SpringData JPA操作数据库,只需要按照框架的规范提供dao接口,不需要提供在接口中定义方法,也不需要为接口提供实现类就能完成基本的数据库的增删改查等功能
在SpringData JPA中,对于定义符合规范的Dao层接口,我们只需要遵循以下几点就可以了:
1.创建一个Dao层接口,并继承JpaRepository和JpaSpecificationExecutor
2.提供响应的泛型
下面这个接口有一个可以肯定的就是用会动态代理实现
下面写Spring的配置文件
下面开始增删改查
1.保存
将表也建好了
按主键查询
删除
SpringData中的几个重要接口
可以猜到:自定义的接口中没有写任何方法声明,但是却可以调用那么多方法,
肯定做了动态代理
自定义的接口继承了两个接口,方法肯定来源哪里
Repository 标记接口:继承了此接口后会被Spring识别,进而可以在接口中声明一些满足规范的方 法 | | CrudRepository 实现了基本增删改查方法 | | PagingAndSortingRepository 实现了分页和排序的方法 | | JpaRepository 重写了几个查找和删除的方法 | | ArticleDao 通过上面的继承关系,我们可以看到我们自定义的接口ArticleDao继承了一系列的Repository接口, 而每一个接口都会给我们提供一部分的功能,这样继承下来,我们的ArticleDao不用任何的方法声明就拥有 了很多的功能了 实现类是这个玩意关于SpringData JPA 增删改CDU的详细操作,查询相对复杂放在后面
关于保存
注意save方法,如果主键存在且库里有该主键信息,则做更新,如果没有主键则做保存
saveAndFlush();保存或更新,且立即刷新缓存 这个在事务中处理用
saveAll
上面3个方法即是保存的方法,也是修改的方法......................
关于删除
deleteById() 根据主键删除
测试delete()方法 根据实体类伤处,但是这个实体必须要有主键
测试deleteAll()
deleteAll()无参 会先查出所有 然后一个个删除
deleteAllInBatch(); 直接是delete from article
deleteInBatch(list) 批量删除指定数据
deleteAll(list)先查出来,再一条条删除
SpringData的多种查询方式
1.父类接口本身已经定义好的查询方法
2.方法命名规则查询
3.JPQL:全称 JAVA PERSISTENCE QUERY LANGUAGE。JAQL语句是JPA中定义的一种查询语句,此种语言的用意是让开发者忽略数据库表和表中的字段,关注专注与实体类及实体类中的属性.(面向对象哈哈哈).它的写法十分类似于SQL语句的写法,但是要把查询的表明换成实体类名,把表中的字段名换成实体类中的属性名称.
4.本地SQL查询:就是写SQL,但是不推荐使用,因为不同数据库sql可能不同
5.Specification动态查询:有时我们再查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSqecificationExecutor接口查询,相比JPQL,其优势是类型安全,更加面向对象,缺点就是书写比较麻烦
下面一个个介绍以上这些查询方式:
1.父类接口本身已经定义好的查询方法
挑选些常用的
1.