JAVA入门[20]-Spring Data JPA简单示例

简介:

Spring 对 JPA 的支持已经非常强大,开发者只需关心核心业务逻辑的实现代码,无需过多关注 EntityManager 的创建、事务处理等 JPA 相关的处理。Spring Data JPA更是能够根据方法名字自动实现持久层。

目标

这次我们的目标还是实现前面几节的功能,即对Category的数据层操作。完整和的代码结构:

image

首先添加实体类Category.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Entity
@Table (name =  "Category" )
public  class  Category  implements  Serializable {
     @Override
     public  String toString() {
         return  "id=" +id+ " name=" +name;
     }
 
     private  Integer id;
 
     @Id
     public  Integer getId() {
         return  id;
     }
 
     public  void  setId(Integer id) {
         this .id = id;
     }
 
     private   String name;
 
     public  String getName() {
         return  name;
     }
 
     public  void  setName(String name) {
         this .name = name;
     }
}

  

引入JPA

JPA 规范要求,配置文件必须命名为 persistence.xml,并存在于类路径下的 META-INF 目录中。该文件通常包含了初始化 JPA 引擎所需的全部信息。Spring 提供的 LocalContainerEntityManagerFactoryBean 提供了非常灵活的配置,persistence.xml 中的信息都可以在此以属性注入的方式提供。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version= "1.0"  encoding= "UTF-8" ?>
<persistence xmlns= "http://java.sun.com/xml/ns/persistence"  version= "2.0" >
     <persistence-unit name= "category"  transaction-type= "RESOURCE_LOCAL" >
         <provider>org.hibernate.ejb.HibernatePersistence</provider>
         < class >demoJPA.entity.Category</ class >
         <properties>
             <property name= "hibernate.connection.driver_class"  value= "com.mysql.jdbc.Driver" />
             <property name= "hibernate.connection.url"  value= "jdbc:mysql://localhost:3306/store" />
             <property name= "hibernate.connection.username"  value= "root" />
             <property name= "hibernate.connection.password"  value= "root" />
             <property name= "hibernate.dialect"  value= "org.hibernate.dialect.MySQL5Dialect" />
             <property name= "hibernate.show_sql"  value= "true" />
             <property name= "hibernate.format_sql"  value= "true" />
             <property name= "hibernate.use_sql_comments"  value= "false" />
             <property name= "hibernate.hbm2ddl.auto"  value= "update" />
         </properties>
     </persistence-unit>
</persistence>

  

实现数据持久层

接下来到了最核心的部分,就是对于数据持久层的支持。使用 Spring Data JPA 进行持久层开发大致需要的三个步骤:

1.首先引入依赖,这里主要用到spring data commons和spring data jpa两个包。

1
2
3
4
5
6
7
8
9
10
11
<dependency>
     <groupId>org.springframework.data</groupId>
     <artifactId>spring-data-commons</artifactId>
     <version> 1.13 . 3 .RELEASE</version>
</dependency>
 
<dependency>
     <groupId>org.springframework.data</groupId>
     <artifactId>spring-data-jpa</artifactId>
     <version> 1.11 . 3 .RELEASE</version>
</dependency>

完整的pom:

  

2.声明持久层接口 CategoryDao继承 Repository 接口。Spring Data JPA 在后台为持久层接口创建代理对象时,会解析方法名字,并自动实现相应的功能。

1
2
3
4
5
6
7
8
9
10
public  interface  CategoryDao  extends  Repository<Category, Integer> {
     void  save(Category category);
 
     Iterable<Category> findAll();
 
     long  count();
 
     void  delete( int  id);
 
}

  

3.在 Spring 配置文件中增加一行声明,让 Spring 为声明的接口创建代理对象。配置了 <jpa:repositories> 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<context:component-scan base- package = "demoJPA" />
 
     <tx:annotation-driven transaction-manager= "transactionManager" />
 
     <jpa:repositories base- package = "demoJPA.dao"   repository-impl-postfix= "Impl"  entity-manager-factory-ref= "entityManagerFactory"  transaction-manager-ref= "transactionManager" />
 
     <bean id= "transactionManager"  class = "org.springframework.orm.jpa.JpaTransactionManager" >
         <property name= "entityManagerFactory"  ref= "entityManagerFactory" />
     </bean>
 
     <bean id= "entityManagerFactory"  class = "org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
         <property name= "jpaVendorAdapter" >
             <bean  class = "org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
                 <property name= "generateDdl"  value= "false" />
                 <property name= "showSql"  value= "true" />
             </bean>
         </property>
     </bean>

  

使用 @Query 创建查询

除了通过解析方法名实现功能外,开发者还可以直接在声明的方法上面使用 @Query 注解,并提供一个查询语句作为参数。Spring Data JPA 在创建代理对象时,便会用提供的查询语句来实现其功能。

@Query 注解的使用非常简单,只需在声明的方法上面标注该注解,同时提供一个 JPQL 查询语句即可。JPQL 语句中通过": 变量"的格式来指定参数,同时在方法的参数前面使用 @Param 将方法参数与 JP QL 中的命名参数对应。

1
2
@Query ( "from Category where id=:id" )
Category findOne( @Param ( "id" int  id);

开发者也可以通过使用 @Query 来执行一个更新操作,为此,我们需要在使用 @Query 的同时,用 @Modifying 来将该操作标识为修改查询,这样框架最终会生成一个更新的操作,而非查询。

1
2
3
4
@Transactional
@Modifying
@Query ( "update Category  set name=:name where id=:id" )
void  updateName( @Param ( "id" ) int  id, @Param ( "name" )String name);

  

单元测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
@ContextConfiguration (locations =  "classpath:applicationContext.xml" )
@RunWith (SpringJUnit4ClassRunner. class )
public  class  testJpa {
 
     int  id= 5 ;
 
     @Autowired
     private  CategoryDao categoryDao;
 
     @Test
     public  void  testSave(){
         Category category= new  Category();
         category.setId(id);
         category.setName( "test" );
         categoryDao.save(category);
     }
 
     @Test
     public  void  testUpdateName(){
         String name= "test111" ;
         categoryDao.updateName(id,name);
     }
 
     @Test
     public  void  testFindById(){
         Category category=categoryDao.findOne(id);
         System.out.println(category);
     }
 
     @Test
     public  void  count(){
         long  count=categoryDao.count();
         System.out.println(count);
     }
 
     @Test
     public  void  testFindAll(){
         Iterable<Category> categories=categoryDao.findAll();
         for (Category category:categories){
             System.out.println(category);
         }
     }
 
     @Test
     public  void  delete(){
         categoryDao.delete(id);
     }
 
}

 

源码地址https://github.com/cathychen00/learnjava/tree/master/DemoJPA  

参考资料:





    本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/p/7088639.html ,如需转载请自行联系原作者


相关文章
|
7月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
7月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
7月前
|
存储 Java 关系型数据库
Spring Boot中Spring Data JPA的常用注解
Spring Data JPA通过注解简化数据库操作,实现实体与表的映射。常用注解包括:`@Entity`、`@Table`定义表结构;`@Id`、`@GeneratedValue`配置主键策略;`@Column`、`@Transient`控制字段映射;`@OneToOne`、`@OneToMany`等处理关联关系;`@Enumerated`、`@NamedQuery`支持枚举与命名查询。合理使用可提升开发效率与代码可维护性。(238字)
649 1
|
7月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
705 2
|
7月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
607 8
|
8月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
973 3
存储 JSON Java
876 0
|
8月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
774 0
|
10月前
|
前端开发 Java API
基于 Spring Boot 3 与 React 的 Java 学生信息管理系统从入门到精通实操指南
本项目基于Spring Boot 3与React 18构建学生信息管理系统,涵盖前后端开发、容器化部署及测试监控,提供完整实操指南与源码,助你掌握Java全栈开发技能。
511 0
|
10月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
760 2