Spring JPA hibernate的认识
最近在做一个新项目,项目中用的不是最原始的sping、hibernate配置文件的形式,用的是全注解的形式。刚开始还不知道jpa是什么东西,干什么用的。
现在对它有了初步的认识,简单记录一下。
查看jpa和hibernate的区别可参考:http://blog.sina.com.cn/s/blog_5f1619e80100yoxz.html。
jpa是一种规范,hibernate是jpa的一种实现。
jpa可以简单的操作数据库对象。
第一步:先有实体类NetPoolE,为了实现对象和表的映射,我们省掉NetPoolE.hbm.xml的配置文件,我们使用jpa的注解:javax.persistence.Entity、Column、ID、GeneratedValue等。(不写注解,默认属性名和表的列名相同)例如:
@Entity(name = "NetPool") public class NetPoolE { /** * 主键 网络池Id */ @Id @GeneratedValue(generator = "uuid") @GenericGenerator(name = "uuid", strategy = "uuid") @Column(name = "netPoolId") private String netPoolId; /** * 网络名称 */ @Column(name = "netName", length = 255) private String netName; /** * vlan号 */ @Column(name = "vlanNo") private Integer vlanNO; /** * 网关 */ @Column(name = "gateway", length = 255) private String gateway; /** * 子网 */ @Column(name = "subNet", length = 255) private String subNet; /** * dns */ @Column(name = "dns", length = 255) private String dns; /** * 同步时间 */ private Date synDate; /** * 是否可用 */ private Boolean isAvl; /** * 组织Id */ private String ogrId; public Date getSynDate() { return synDate; } public void setSynDate(Date synDate) { this.synDate = synDate; } public Boolean getIsAvl() { return isAvl; } public void setIsAvl(Boolean isAvl) { this.isAvl = isAvl; } public String getNetPoolId() { return netPoolId; } public void setNetPoolId(String netPoolId) { this.netPoolId = netPoolId; } public String getNetName() { return netName; } public void setNetName(String netName) { this.netName = netName; } public Integer getVlanNO() { return vlanNO; } public void setVlanNO(Integer vlanNO) { this.vlanNO = vlanNO; } public String getGateway() { return gateway; } public void setGateway(String gateway) { this.gateway = gateway; } public String getSubNet() { return subNet; } public void setSubNet(String subNet) { this.subNet = subNet; } public String getDns() { return dns; } public void setDns(String dns) { this.dns = dns; } public String getOgrId() { return ogrId; } public void setOgrId(String ogrId) { this.ogrId = ogrId; } @Override public String toString() { return "NetPoolE [netPoolId=" + netPoolId + ", netName=" + netName + ", vlanNO=" + vlanNO + ", gateway=" + gateway + ", subNet=" + subNet + ", dns=" + dns + ", synDate=" + synDate + ", isAvl=" + isAvl + ", ogrId=" + ogrId + "]"; }
第二步:写jpa接口。之前都是写dao层的操作数据库对象,现在是使用jpa接口操作数据库对象,在dao层再调用jpa接口,service层再调用dao。
这里主要介绍jpa接口的定义。
自定义的jpa接口可以extends JpaRepository接口,该接口中有默认的一些方法。在dao层之间使用即可。
jpa支持一些通用的方法名,例如:findAll()查询所有,findAll(Pageable pageable)分页查询,findByPropertyNameContainingAllIgnoringCase(String name,Pageable pageable)模糊匹配分页查询,save(Entity e)保存对象等等。
jpa除了支持一些通用的方法名外,还支持自定义查询、关联查询等,例如:
interface HotelRepository extends Repository<Hotel, Long> { Hotel findByCityAndName(City city, String name); @Query("select new com.test.demo.data.jpa.entity.HotelSummary(h.city, h.name, avg(r.rating)) from Hotel h left outer join h.reviews r where h.city = ?1 group by h") Page<HotelSummary> findByCity(City city, Pageable pageable); @Query("select new com.test.demo.data.jpa.entity.RatingCount(r.rating, count(r)) from Review r where r.hotel = ?1 group by r.rating order by r.rating DESC") List<RatingCount> findRatingCounts(Hotel hotel); }
修改语句:
@Modifying(clearAutomatically=true) @Query("update NetPool np set np.gateway=?2, np.subNet=?3, np.dns=?4 where np.netPoolId=?1") void updateNetPool(String poolId, String gateway, String subNet, String dns);
从此处开始是摘抄:
Spring Data Jpa 使用@Query标注自定义查询语句:
可参考http://www.tianmaying.com/tutorial/spring-jpa-query。
基础对象
Spring Data Jpa所提供的通过方法名进行查询的功能已经能够覆盖绝大多数单表查询了。但是,我们的查询绝不仅限于单表查询,很多时候我们还是需要进行多表查询的,因此我们今天设计两个表,blog
以及user
,通过这两个表的联合查询来试验@Query
标注。
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String username;
private String role;
......
}
@Entity
public class Blog {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String title;
private String content;
@ManyToOne
private User creator;
......
}
关联查询
blog表和user表通过creator相关联。在user表中,我们设计了一个属性角色--role
。如果我们想找到某种角色的用户所创建的blog列表应该怎么办?让我们通过@Query
标注去实现它吧:
public interface BlogRepository extends PagingAndSortingRepository<Blog, Integer> {
@Query("select blog from Blog blog join blog.creator creator where creator.role = ?1")
Page<Blog> findByRole(String role, Pageable pageable);
}
在BlogRepository中,我们通过@Query标注使用了HQL进行查询,通过它,我们可以更加灵活的进行各种查询(当然,Spring Data JPA同样支持多表联查),如果不喜欢使用方法名来定义查询条件或者查询过于复杂的话,@Query标注是一个很不错的选择。
查询结果
我们来写一个Controller展示我们的查询结果:
@RestController
public class TestController {
@Autowired BlogRepository blogRepository;
@RequestMapping(value = "", method=RequestMethod.GET)
public Page<Blog> getEntryByPageable(@PageableDefault(value = 15, sort = { "id" }, direction = Sort.Direction.DESC)
Pageable pageable, @RequestParam(value = "role", defaultValue = "") String role) {
if("".equals(role)){
return blogRepository.findAll(pageable);
}
return blogRepository.findByRole(role, pageable);
}
}
然后,我们进入根目录,运行mvn spring-boot:run
将应用run起来。所有数据会在应用启动时添加进数据库当中。然后我们访问http://localhost:8080/,我们可以得到所有blog的分页结果:
{
"content":[
{
"id":246,
"title":"blog122",
"content":"this is teacher blog content",
"creator":{"id":1,"username":"teacher","role":"teacher"}
},
{
"id":245,
"title":"blog121",
"content":"this is teacher blog content",
"creator":{"id":1,"username":"teacher","role":"teacher"}
},
{
"id":244,
"title":"blog120",
"content":"this is teacher blog content",
"creator":{"id":1,"username":"teacher","role":"teacher"}
},
{
"id":243,
"title":"blog119",
"content":"this is teacher blog content",
"creator":{"id":1,"username":"teacher","role":"teacher"}
},
{
"id":242,
"title":"blog118",
"content":"this is teacher blog content",
"creator":{"id":1,"username":"teacher","role":"teacher"}
}
],
"last":false,
"totalElements":246,
"totalPages":50,"size":5,
"number":0,
"first":true,
"sort":[{"direction":"DESC","property":"id","ignoreCase":false,"nullHandling":"NATIVE","ascending":false}],
"numberOfElements":5
}
接着,再访问http://localhost:8080/?role=student,我们可以得到所有角色为student的用户所创建的blog的分页结果:
{
"content":[
{"id":123,"title":"blog122","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}},
{"id":122,"title":"blog121","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}},
{"id":121,"title":"blog120","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}},
{"id":120,"title":"blog119","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}},
{"id":119,"title":"blog118","content":"this is student blog content","creator":{"id":2,"username":"student","role":"student"}}
],
"last":false,
"totalElements":123,
"totalPages":25,
"size":5,
"number":0,
"first":true,
"sort":[{"direction":"DESC","property":"id","ignoreCase":false,"nullHandling":"NATIVE","ascending":false}],
"numberOfElements":5}
版权声明本文由Cliff创作,转载需署名作者且注明文章出处
相关推荐
'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...
通过这些教程,初学者能够逐步建立起对 Spring 框架的整体认识,并通过实际操作提升开发技能,为求职做好准备。务必仔细研读每一部分的材料,结合实践去理解并运用这些知识点,以达到最佳的学习效果。
零基础认识 Spring Boot Spring Boot 是一个基于 Spring 框架的开源框架,旨在简化 Spring 应用的开发过程。它提供了一种快速、灵活和高效的方式来构建生产级应用程序。 新建 Spring Boot 项目 使用 Spring ...
4. **Spring Data JPA更新**:Spring Data项目针对JPA进行了优化,增强了对现代数据库系统的支持,如Spring Data MongoDB和Spring Data Elasticsearch,使得数据访问更加便捷。 5. **Cloud Support增强**:Spring ...
1. **Spring概述**:首先介绍Spring的发展历程、核心理念以及在现代软件开发中的地位,让读者对Spring有一个整体的认识。 2. **环境配置**:详细阐述如何搭建Spring开发环境,包括安装JDK、设置开发工具(如IDEA或...
通过学习以上知识点,并结合提供的"spring思维导图",读者可以更好地构建对Spring的整体认识,理解其设计理念,提升在实际项目中的应用能力。在实践中不断探索,Spring的奥秘会逐步揭示,成为你开发路上的强大助手。
通过这份入门培训,读者应该能建立起对Spring Boot和ExtJS6.2的基础认识,掌握创建简单Web应用的能力,并能进行基本的调试和测试。源代码的提供则为学习者提供了动手实践的机会,有助于理论与实践的结合,加深理解。
Spring框架是Java开发中的一个核心框架,以其依赖注入(Dependency Injection, DI)和面向切面...通过这个例子,你可以逐步建立起对Spring开发的整体认识,并且能够独立完成一个从数据库访问到前后端交互的完整应用。
从给定的文件信息来看,...通过上述知识点的梳理,我们不仅了解了Spring框架的核心特性,也对其生态体系有了更全面的认识。无论是对于初学者还是有经验的开发者来说,Spring框架都是一个值得深入学习和掌握的技术栈。
在了解这个版本之前,我们先来认识一下Spring框架的基础。 Spring框架主要由以下几个模块组成: 1. **Core Container**(核心容器):这是Spring框架的基础,包括ApplicationContext和Bean工厂,它们负责管理和实例...
4. 探索数据访问:研究JdbcTemplate和JPA的实现,理解Spring如何简化数据库操作。 5. 学习Spring Boot和Spring Cloud:分析自动配置原理,理解微服务架构的设计思路。 总之,通过深入学习Spring源码,开发者不仅...
此外,Spring Data JPA和Spring Data MongoDB等模块则进一步提升了数据访问的便捷性。 6. **Spring Boot与Spring Cloud** 在现代微服务架构中,Spring Boot简化了Spring应用的启动和配置,而Spring Cloud则提供了...
《Spring技术内幕:深入解析Spring架构与设计原理》这本书深入探讨了Spring框架的核心架构和设计原则,适合已经对...希望通过以上内容,读者能够对Spring框架以及如何通过本书深入理解其技术内幕有一个清晰的认识。
SpringBoot入门教程旨在...通过以上内容,你将对SpringBoot、AOP和JPA有全面的认识,为成为一名熟练的SpringBoot开发者奠定坚实基础。记得不断实践,理论与实践相结合才能真正掌握这些技术。祝你在学习过程中一切顺利!
### Spring4 注解详解 #### 一、背景与概述 在Spring框架的早期版本中,主要依赖XML...通过上述介绍,我们不仅对Spring 4中的注解有了更全面的认识,同时也了解了如何有效地利用这些注解来提升开发效率和代码质量。
总的来说,掌握Spring框架需要对每个组件有清晰的认识,理解其工作原理,并通过实践来熟练运用。这个压缩包中的jar文件是构建Spring应用的基础,结合教程和实践,可以逐步成为一名熟练的Spring开发者。
Spring框架是Java开发领域中...以上是对Spring框架的初步认识,深入学习和实践,可以借助“初识Spring框架-资料.rar”中的教程、文档和示例,逐步掌握Spring的各个方面,从而在实际项目中更加熟练地运用这一强大框架。
Spring框架是Java开发中的核心组件,它为应用...通过观看并实践教程中的示例,你将对Spring有更全面、深入的认识,从而在工作中更加得心应手。记得通过提供的百度网盘链接下载学习资源,以便随时回顾和巩固所学知识。
通过以上内容,你应该已经对Spring Boot整合Spring事务有了全面的认识。在实际项目中,合理利用Spring的事务管理,能有效地保证业务逻辑的正确执行,防止数据不一致问题。在设计和编写代码时,务必考虑到事务的边界...