Spring Data JPA
创始人
2024-06-01 15:04:42
0

文章目录

  • 一、Spring Data基础概念
  • 二、JPA与JDBC的相同与不同之处
  • 三、Hibernate & JPA快速搭建
    • 1.添加依赖
    • 2.实体类
    • 3.hibernate的配置文件 ——hibernate.cfg.xml
  • 四、测试——基于hibernate的持久化(单独使用)
  • 五、测试——基于JPA的持久化(单独使用)
    • 1.建立 /resources/META-INF/persistence.xml 配置文件
    • 2.案例
  • 六、JPA对象的四种状态
    • 临时状态
    • 持久状态
    • 删除状态
    • 游离状态
    • 方法下对象的不同状态情况
      • 1、persist(Object entity)
      • 2、merge(Object entity)
      • 3、refresh(Object entity)
      • 4、remove(Object entity)
  • 七、Spring Data JPA搭建 -- xml方式
    • 1.添加依赖
    • 2. spring.xml
    • 3. CRUD测试 -- spring
  • 八、Spring Data JPA搭建 -- JavaConfig 方式
    • 1.JavaConfig
  • 九、自定义操作
    • 1.JPQL和SQL
    • 2.规定方法名
    • 3.Query By Example 动态查询
    • 4.Specifications
    • 5.Query DSL

一、Spring Data基础概念

Spring Data:统一和简化对不同类型持久性存储(关系数据库系统和NoSQL数据存储)的访问。
特性:模板制作、对象/数据存储映射、Repository支持

二、JPA与JDBC的相同与不同之处

相同:
  1.都跟数据库操作有关,JPA是JDBC的升华。
  2.JPA和JDBC都是一组规范接口
不同之处:
  1.JDBC是由各个关系型数据库实现的,JPA是由ORM框架实现。
  2.JDBC使用SQL语句和数据库通信,JPA用面向对象方式,通过ORM框架来生成SQL,进行操作。
  3.JPA在JDBC之上,JPA也要依赖JDBC才能操作数据库。

三、Hibernate & JPA快速搭建

1.添加依赖

在这里插入图片描述

2.实体类

/*** 客户的实体类*      配置映射关系*   1.实体类和表的映射关系*      @Entity:声明实体类*      @Table:配置实体类和表的映射关系*          name : 配置数据库表的名称*   2.实体类中属性和表中字段的映射关系*/
@Data
@Entity
@Table(name = "tb_customer")
public class Customer {/*** @Id:声明主键的配置* @GeneratedValue:配置主键的生成策略*      strategy:*          GenerationType.IDENTITY :自增,mysql*                  底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增)*          GenerationType.SEQUENCE : 序列,oracle*                  底层数据库必须支持序列*          GenerationType.TABLE : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增*          GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略* @Column:配置属性和字段的映射关系*      name:数据库表中字段的名称*/@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "customer_id")private Long Id; //客户的主键@Column(name = "customer_name")private String name;//客户名称@Column(name="customer_age")private int age;//客户年龄@Column(name="customer_sex")private boolean sex;//客户性别@Column(name="customer_phone")private String phone;//客户的联系方式@Column(name="customer_address")private String address;//客户地址
}

@Entity 作为hiberbate实体类
@Tabel(name=“表名”) 映射的表名
@Id 声明主键
@GenerateValue 主键的生成策略
@Column(name=“字段名”) 表单的列名

3.hibernate的配置文件 ——hibernate.cfg.xml



com.mysql.jdbc.Driverjdbc:mysql://localhost:3306/bianchengbang_jdbc?characterEncoding=UTF-8rootrootorg.hibernate.dialect.MySQL5Dialecttruetrueupdate

四、测试——基于hibernate的持久化(单独使用)

案例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
懒查询
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、测试——基于JPA的持久化(单独使用)

1.建立 /resources/META-INF/persistence.xml 配置文件

依赖不用改,多加一个配置文件。IDEA有persistence模板:setting=》file and code Template=》JPA==》Deployment descriptors=》persistenceXX.xml


org.hibernate.jpa.HibernatePersistenceProvider

2.案例

 /**
* 测试jpa的保存    案例:保存一个客户到数据库中
* Jpa的操作步骤
* 1.加载配置文件创建工厂(实体管理器工厂)对象
* 2.通过实体管理器工厂获取实体管理器
* 3.获取事务对象,开启事务
* 4.完成增删改查操作
* 5.提交事务(回滚事务)
* 6.释放资源
*/
@Test
public void testSave() {//1.加载配置文件创建工厂(实体管理器工厂)对象EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");//2.通过实体管理器工厂获取实体管理器EntityManager em = factory.createEntityManager();//3.获取事务对象,开启事务EntityTransaction tx = em.getTransaction();tx.begin();//4.完成增删改查操作:保存一个客户到数据库中Customer customer = new Customer();customer.setName("Sam");customer.setAddress("Beijing");//保存操作em.persist(customer);//5.提交事务tx.commit();//6.释放资源em.close();factory.close();
}---------------------------------api
//立即查询
Customer customer = em.find(Custormer.class,1L);
//懒查询
Customer customer = em.getReference(Custormer.class,1L);
//更新 指定id会先查询数据是否有变化,有变化则更新,不指定id会插入一条数据
Customer customer = new Customer();
customer.setCustId(5L);
customer.setCustName("dfg");
em.merge(customer);
//更新 -- JPQL 不会进行查询 使用实体类名和属性名
String jpql = "Update Customer set name=:name where id=:id ";
em.createQuery(jpql).setParameter("name","李四").setParameter("id","5L").executeUpdate();
//更新 -- 使用SQL 使用表名和字段名
String sql = "Update tb_customer set name=:name where id=:id ";
em.createNativeQuery(sql).setParameter("name","李四11").setParameter("id","5L").executeUpdate();
//删除 先查再删除
//不能删除游离数据,只能删除持久化数据(从数据库里查出来的数据)
Customer customer =  em.find(Custormer.class,5L);
em.remove(customer);

六、JPA对象的四种状态

临时状态

刚创建出来的对象,它此时还没与entityManager发生关系,没有被持久化,不处于entityManager中的对象。

持久状态

与entityManager发生关系,已经被持久化,是数据库实在的记录,比如执行了persist()、find()、merge()。
情况:
持久状态进行了修改会同步数据库;把数据库里的记录查询出来做修改并没有执行保存操作,也会把更新数据的操作同步到数据库。

删除状态

执行remove()方法,事物提交之前。

游离状态

游离状态是提交到数据库后,事务commit后实体的状态。比如该对象commit之后在数据库有对应的数据,但是它还没与entityManager发生关系。此时实体的属性可以做任何改变,也不会同步到数据库,因为事务已经提交了。
在这里插入图片描述

方法下对象的不同状态情况

1、persist(Object entity)

persist方法可以将实例转换为managed(托管)状态,在调用flush()方法或提交事物之后 ,实例将会被插入到数据库中。
对不同状态下的实例A,persist会产生以下操作:
1)如果A是一个new状态的实体,它将会转为managed状态;
2)如果A是一个managed状态的实体,它的状态不会发生任何改变,但是系统仍会在数据库执行 insert 操作;
3)如果A是一个removed(删除)状态的实体,它将会转换为受控状态;
4)如果A是一个detached(分离)状态的实体,该方法会抛出IllegalArgumentException异常,具体异常根据不同的JPA实现有关。

2、merge(Object entity)

merge方法的主要作用是将用户对一个detached状态实体的修改进行归档,归档后将产生一个新的managed状态对象。
对不同状态下的实例A,merge会产生以下操作:
1)如果A是一个detached状态的实体,该方法会将A的修改提交到数据库,并返回一个新的managed状态的实例A2;
2)如果A是一个new状态的实体,该方法会产生一个根据A产生的managed状态实体A2;
3)如果A是一个managed状态的实体,它的状态不会发生任何改变,但是系统仍会在数据库执行update操作。
4)如果A是一个removed状态的实体,该方法会抛出IllegalArgumentException异常。

3、refresh(Object entity)

refresh方法可以保证当前的实例与数据库中的实例内容一致。
对不同状态下的实例A,refresh会产生以下操作:
1)如果A是一个new状态的实体,A的状态不会发生任何改变,但系统仍会在数据库中执行delete语句;
2)如果A是一个managed状态的实体,它的属性将会和数据库中的数据同步;
3)如果A是一个removed状态的实体,该方法将会抛出异常:Entity not managed
4)如果A是一个detached状态的实体,该方法将会抛出异常;

4、remove(Object entity)

remove方法可以将实体转换为removed状态,并且在调用flush()方法或提交事物后删除数据库中的数据。
对不同状态下的实例A,remove会产生以下操作:
1)如果A是一个new状态的实体,A的状态不会发生任何改变,但系统仍会在数据库中执行delete语句;
2)如果A是一个managed状态的实体,它的状态会转换为removed;
3)如果A是一个removed状态的实体,不会发生任何操作;
4)如果A是一个detached状态的实体,该方法将会抛出异常;

七、Spring Data JPA搭建 – xml方式

1.添加依赖

父项目
添加spring data的统一版本管理,它可以统一子项目的Spring Data JDBC、Spring Data JPA 、Spring Data Redis等版本。

org.springframework.dataspring-data-bom2022.0.2importpom

子项目
spring 项目需要另外添加hibernate依赖,spring boot项目不需要。

org.springframework.dataspring-data-jpa

2. spring.xml

整合jpa
在这里插入图片描述
在这里插入图片描述
< jpa:repositories />对应@EnableJpaRepositories注解
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. CRUD测试 – spring

定义接口继承CrudRepository接口

public interface CrudRepository extends Repository {}

在这里插入图片描述
查询
在这里插入图片描述
插入
在这里插入图片描述
更新 先查再更新
在这里插入图片描述
删除 先查再删除,把new出来的实例的游离状态改为持久状态
在这里插入图片描述

八、Spring Data JPA搭建 – JavaConfig 方式

1.JavaConfig

//标记当前类为配置类
@Configuration       
//启动jpa  相当于xml的标签   basePackage:指定数据返回层.接口
@EnableJpaRepositories(basePackage="com.test.repositories")
//开启事务
@EnableTransactionManagement
class ApplicationConfig {@Beanpublic DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setUserName("root");dataSource.setPassWord("123456");dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/hibernate_jpa?characterEncoding=UTF-8");return dataSource;//使用内嵌内存数据库/**EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();return builder.setType(EmbeddedDatabaseType.HSQL).build();**/}@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory() {HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();vendorAdapter.setGenerateDdl(true);vendorAdapter.setShowSql(true);LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();factory.setJpaVendorAdapter(vendorAdapter);//指定实体类的包factory.setPackagesToScan("com.acme.domain");factory.setDataSource(dataSource());return factory;}@Beanpublic PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {JpaTransactionManager txManager = new JpaTransactionManager();txManager.setEntityManagerFactory(entityManagerFactory);return txManager;}
}

测试使用
在这里插入图片描述

九、自定义操作

1.JPQL和SQL

JPQL定义,参数可以使用索引指定,或参数名结合@Param注解指定。
在这里插入图片描述
在这里插入图片描述
用 法
在这里插入图片描述
增删改需要开启事务,@Transactional通常放在业务逻辑层上声明。
在这里插入图片描述
JPQL是不支持新增的,用Hibernate实现伪插入,只能插入从别的地方查到的值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SQL
在这里插入图片描述

2.规定方法名

根据提供的主题关键字(前缀)决定方法作用,谓词关键字和修饰符决定查询条件。只支持查询和删除。官网使用说明,有详细使用方法的
例:
findBy(关键字)+ 属性名称(首字母大写)+ 查询条件(首字母大写)
在这里插入图片描述

3.Query By Example 动态查询

只支持查询,只支持字符串(开头、包含、结尾、正则匹配),不支持嵌套或分组的属性约束。官网使用说明
实现:

//继承QueryByExampleExecutor接口
public interface CustomerRepository extends PagingAndSortingRepository ,QueryByExampleExecutor{ … }

测试:
通过customer对象来进行筛选。
在这里插入图片描述
通过匹配器进行条件的限制。
在这里插入图片描述

4.Specifications

对所有类型支持。
步骤:
1、通过root拿到需要设置条件的字段
2、通过CriteraBuilder设置不同类型条件
3、组合条件

实现:

//继承JpaSpecificationExecutor接口
public interface CustomerRepository extends CrudRepository, JpaSpecificationExecutor {…
} 

测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.Query DSL

通用查询框架,借助QueryDSL可以在任何支持的ORM框架或SQL平台上以通用API方式构建查询。官网使用说明
实现:
在这里插入图片描述

//继承QuerydslPredicateExecutor
interface UserRepository extends CrudRepository, QuerydslPredicateExecutor {
}//官方例子,能直接实体类user.firstname是添加了插件
Predicate predicate = user.firstname.equalsIgnoreCase("dave").and(user.lastname.startsWithIgnoreCase("mathews"));userRepository.findAll(predicate);

使用:
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

编程安卓系统和鸿蒙主题,跨平台... 你有没有想过,手机的世界里,除了苹果的iOS和安卓的操作系统,还有个神秘的鸿蒙系统?今天,咱们就来聊...
哪个安卓机系统好用,探索安卓系... 你有没有想过,手机里的安卓系统就像是个大厨,不同的系统就像不同的烹饪手法,有的让你吃得津津有味,有的...
安卓如何控制苹果系统,从安卓到... 你知道吗?在这个科技飞速发展的时代,安卓和苹果两大操作系统之间的较量从未停歇。虽然它们各自有着忠实的...
安卓原生系统文件夹,安卓原生系... 你有没有发现,每次打开安卓手机,里面那些文件夹就像是一个个神秘的宝箱,里面藏着各种各样的宝贝?今天,...
基于安卓系统的游戏开发,从入门... 你有没有想过,为什么安卓手机上的游戏总是那么吸引人?是不是因为它们就像是你身边的好朋友,随时随地都能...
安卓系统怎样装驱动精灵,安卓系... 你那安卓设备是不是突然间有点儿不给力了?别急,今天就来手把手教你如何给安卓系统装上驱动精灵,让你的设...
如何本地安装安卓系统包,详细步... 你有没有想过,把安卓系统装在你的电脑上,是不是就像给电脑穿上了时尚的新衣?想象你可以在电脑上直接玩手...
安卓12卡刷系统教程,体验全新... 你有没有发现,你的安卓手机最近有点儿不给力了?运行速度慢得像蜗牛,是不是也想给它来个“换血大法”,让...
安卓系统无法打开swf文件,安... 最近是不是发现你的安卓手机有点儿不给力?打开SWF文件时,是不是总是出现“无法打开”的尴尬局面?别急...
鸿蒙系统依赖于安卓系统吗,独立... 你有没有想过,我们手机里的那个鸿蒙系统,它是不是真的完全独立于安卓系统呢?这个问题,估计不少手机控都...
适合安卓系统的图片软件,精选图... 手机里堆满了各种美美的照片,是不是觉得找起来有点头疼呢?别急,今天就来给你安利几款超级适合安卓系统的...
阴阳师安卓系统典藏,探寻阴阳师... 亲爱的阴阳师们,你是否在安卓系统上玩得如痴如醉,对那些精美的典藏式神们垂涎欲滴?今天,就让我带你深入...
安卓系统有碎片化缺点,系统优化... 你知道吗?在手机江湖里,安卓系统可是个响当当的大侠。它那开放、自由的个性,让无数手机厂商和开发者都为...
安卓4系统手机微信,功能解析与... 你有没有发现,现在市面上还有很多安卓4系统的手机在使用呢?尤其是那些喜欢微信的朋友们,这款手机简直就...
鸿蒙系统是安卓的盗版,从安卓“... 你知道吗?最近在科技圈里,关于鸿蒙系统的讨论可是热闹非凡呢!有人说是安卓的盗版,有人则认为这是华为的...
安卓系统怎么剪辑音乐,轻松打造... 你是不是也和我一样,手机里存了超多好听的歌,但是有时候想给它们来个变身,变成一段专属的旋律呢?别急,...
怎么把安卓手机系统变为pc系统... 你有没有想过,把你的安卓手机变成一台PC呢?听起来是不是有点酷炫?想象你可以在手机上玩电脑游戏,或者...
手机怎么装安卓11系统,手机安... 你有没有想过,让你的手机也来个“青春焕发”,升级一下系统呢?没错,就是安卓11系统!这个新系统不仅带...
安卓系统如何拼网络,构建高效连... 你有没有想过,你的安卓手机是怎么和网络“谈恋爱”的呢?没错,就是拼网络!今天,就让我带你一探究竟,看...
安卓系统怎么看小说,轻松畅享电... 你有没有发现,手机里装了那么多应用,最离不开的竟然是那个小小的小说阅读器?没错,就是安卓系统上的小说...