Spring Date JPA
1.Spring Date JPA是什么?
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。
2.Spring Date JPA 开发步聚:
2.1.声明持久层的接口,该接口继承 Repository。Repository 是一个标记型接口,它不包含任何方法,当然如果有需要,Spring Data 也提供了若干 Repository 子接口,其中定义了一些常用的增删改查,以及分页相关的方法。比如:CrudRepository、PagingAndSortingRepository、JpaRepository、JpaSpecificationExecutor、Specification
2.2.在接口中声明需要的业务方法。Spring Data 将根据给定的策略(具体策略稍后讲解)来为其解析生成实现代码。
2.3.在 Spring 配置文件中增加一行声明,让 Spring 为声明的接口创建代理对象。配置了 <jpa:repositories> 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。可以在 <jpa:repository> 内部使用 <context:include-filter>、<context:exclude-filter> 来过滤掉一些不希望被扫描到的接口。
3.Repository接口的详解以及子类:
3.1.Repository:顶层接口,空接口。目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别;
3.2.CrudRepository :是Repository的子接口,提供CRUD的功能;它会自动为域对象创建增删改查方法,供业务层直接使用。开发者只是多写了 "Crud" 四个字母。但是它可能暴露了你不希望暴露给业务层的方法;
3.3.PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能。但是灵活性不高,开发者可以在继承 Repository 或 CrudRepository 的基础上,在自己声明的方法参数列表最后增加一个 Pageable 或 Sort 类型的参数,用于指定分页或排序信息即可,这比直接使用 PagingAndSortingRepository 提供了更大的灵活性;
3.4.JpaRepository:是PagingAndSortingRepository的子接口,它在父接口的基础上,提供了其他一些方法,比如flush(),saveAndFlush(),deleteInBatch() 等;
3.5.JpaSpecificationExecutor:用来做负责查询的接口;
3.6.Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可。
4.简单的JPA实现
4.1.Bean/model类
package com.usc.lilin.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; //注解方式声明为实体 @Entity //指定相对应的表的名字 @Table(name = "user") public class User { //指明属性为ID @Id //自增属性 @GeneratedValue private Integer id; private String name; private String address; private String phone; //getXx/setXx方法省去 }
4.2.服务层接口:
package com.usc.lilin.service; import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import com.usc.lilin.model.User; public interface UserService { /** * 添加用户信息 * * @param user * 用户 */ public void addUser(User user); /** * 通过Id获取User对象 * * @param user * 封装了ID数据的对象 * @return 返回数据库的实体User */ public User getUserById(User user) throws Exception; /** * 获取数据库中全部的User实体对象 * * @return 封装了User的队列 */ public List<User> getUsers(); /** * 修改用户的信息 * * @param user * 封装了需要修改数据的User对此昂 * @return 返回修改获得User实体对象 */ public User updateUser(User user) throws Exception; /** * 删除对象 * * @param user * 封装了数据的对象 * @return 返回删除的对象 */ public User deleteUser(User user); /** * 不分页查询 * * @param phone * 电话号码 * @param address * 地址 * @return 返回数据队列 */ public List<User> findByPhoneNoPage(String phone, String address); public List<User> fineUsers(); /** * 分页查询 * * @param phone * 电话号码 * @param address * 地址 * @param pageable * 分页 * @return 结果集 */ public Page<User> findUserByPage(String phone, String address, Pageable pageable); }
4.3.服务层接口实现:
package com.usc.lilin.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.stereotype.Service; import com.usc.lilin.model.User; import com.usc.lilin.respository.UserRepository; /** * 服务层实现类 * * @author lilin * @time 2016年6月3日 上午1:38:33 * @email gaosi0812@gmail.com * @blog http://gaosililin.iteye.com * @school USC * @team Geowind */ //注解方式 注明服务类 @Service("userService") public class UserServiceImpl implements UserService { //注解方式实现加载 @Autowired private UserRepository userRepository; @Override public void addUser(User user) { userRepository.saveAndFlush(user); } @Override public User getUserById(User user) throws Exception { if (user != null && user.getId() != null) { User getUser = userRepository.findOne(user.getId()); return getUser; } else { throw new Exception("没有该Id的对象数据!"); } } @Override public List<User> getUsers() { List<User> users = userRepository.findAll(); return users; } @Override public User updateUser(User user) throws Exception { if (user != null && user.getId() != null) { User getUser = userRepository.findOne(user.getId()); if (user.getAddress() != null) { getUser.setAddress(user.getAddress()); } if (user.getName() != null) { getUser.setName(user.getName()); } if (user.getPhone() != null) { getUser.setPhone(user.getPhone()); } return getUser; } else { throw new Exception("没有该Id的对象数据!"); } } @Override public User deleteUser(User user) { userRepository.delete(user.getId()); return user; } public UserRepository getUserRepository() { return userRepository; } public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } }
4.4.持久层接口:
package com.usc.lilin.respository; import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; import com.usc.lilin.model.User; public interface UserRepository extends JpaRepository<User, Integer> { }
4.5.Spring 的配置文件
4.5.1.定义服务层代码存放的包扫描路径 。即服务层的包路径全名
4.5.2.定义实体的工厂bean
4.5.3.定义事务管理器
4.5.4.定义repository接口的存放目录/定义接口实现的后缀,通常用/定义实体工厂的引 用 /定义事务管理器的引用
4.5.5.声明采用注解的方式申明事务
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd" default-lazy-init="true"> <!--第一步 --> <!--定义服务层代码存放的包扫描路径 。即服务层的包路径全名 --> <context:component-scan base-package="com.usc.lilin.service"></context:component-scan> <!--第二步 --> <!--定义实体的工厂bean --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <!-- hibernate的配置文件路径 --> <property name="persistenceXmlLocation" value="classpath:persistence.xml"></property> <property name="persistenceUnitName" value="userPU"></property> </bean> <!--第三步 --> <!--定义事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!--第四步 --> <!--定义repository接口的存放目录 --> <!--定义接口实现的后缀,通常用Impl --> <!--定义实体工厂的引用 --> <!--定义事务管理器的引用 --> <jpa:repositories base-package="com.usc.lilin.respository" repository-impl-postfix="Impl" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"></jpa:repositories> <!--第五步 --> <!--声明采用注解的方式申明事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> </beans>
5.通过解析方法名创建查询
在查询时,通常需要同时根据多个属性进行查询,且查询的条件也格式各样(大于某个值、在某个范围等等),Spring Data JPA 为此提供了一些表达条件查询的关键字,大致如下:
And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd); Or --- 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr); Between --- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min); LessThan --- 等价于 SQL 中的 "<",比如 findBySalaryLessThan(int max); GreaterThan --- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min); IsNull --- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull(); IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull(); NotNull --- 与 IsNotNull 等价; Like --- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user); NotLike --- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user); OrderBy --- 等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user); Not --- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user); In --- 等价于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数; NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
例子:
package com.usc.lilin.respository; import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; import com.usc.lilin.model.User; public interface UserRepository extends JpaRepository<User, Integer> { // select * from user where phone like '136%' and address like '%·%' order by phone desc limit 0,2 List<User> findTop2ByPhoneStartingWithAndAddressContainingOrderByPhoneDesc(String phone, String address); // select * from user where phone like '136%' and address like '%·%' order by phone desc limit 0,2 //Sort 排序 List<User> findTop2ByPhoneStartingWithAndAddressContaining(String phone, String address, Sort sort); //select * from user List<User> findBy(); // select * from user where phone like '136%' and address like '%·%' limit begin pageSize; Page<User> findByPhoneStartingWithAndAddressContaining(String phone, String address, Pageable pageable); }
比较好的资料:Spring Data JPA 开发指南
相关推荐
在SSH整合中,我们需要在`pom.xml`中添加Spring、SpringMVC、Hibernate、Spring Data JPA等相关库的依赖。 在项目结构中,`project-tests`可能是一个包含单元测试或集成测试的目录。在Java开发中,测试是非常重要的...
【Spring Data JPA 知识点详解】 Spring Data JPA 是 Spring Data 框架的一个重要组成部分,它为 Java 持久层提供了一种基于 JPA(Java Persistence API)的简单、高效的解决方案。JPA 是 Java 标准,用于管理关系...
SSH-JPA是一个基于Java Web开发的技术栈,主要包含Spring、Struts2和Hibernate以及Java Persistence API(JPA)这四个核心组件。这个压缩包文件"SSH-JPA.ZIP"提供的内容是一个SSH-JPA的实例,对于初学者或者开发者来...
SSH框架,全称为Spring、Struts和Hibernate,是Java Web开发中非常经典的三大框架组合。它们各自负责应用程序的不同层面:Spring作为应用的管理和事务处理核心,Struts则处理MVC模式中的视图与控制,而Hibernate则...
对于数据库操作,Spring提供JdbcTemplate和HibernateTemplate,或者更高级的JPA支持。在这个配置实例中,我们可能需要用到HibernateTemplate,它简化了与Hibernate的交互。 接下来,Hibernate 4.2作为ORM(对象关系...
SSH(Spring、Struts、Hibernate)是经典的Java Web开发框架,Spring-JPA可以很好地融入SSH架构。在SSH项目中,Spring-JPA作为数据访问层,提供便捷的数据操作,而Struts负责控制逻辑,Spring则管理整个应用的依赖...
SSH 指的是 Spring、Struts 和 Hibernate 这三个流行的技术框架的组合,虽然这里提到的标签 "ssh" 可能是一个误写,但我们可以假设它指的是 Spring 的广泛使用。 Spring 是一个开源的应用框架,它提供了全面的编程...
这些jar包包括但不限于:struts2的核心库、Spring的核心库、Hibernate的JPA和核心库,以及它们各自的依赖库。配置文件方面,通常需要有struts2的配置文件(struts.xml)、Spring的配置文件(如applicationContext....
在本文中,我们将深入探讨如何在Eclipse集成开发环境中实现SSH(Struts、Spring和Hibernate)框架的集成,并结合JPA(Java Persistence API)进行应用。这篇博客文章提供了详细的步骤和指南,帮助开发者构建基于这些...
在实际开发中,结合SSH2和JPA,开发者可以充分利用Spring的灵活性和JPA的简洁性,实现高效且易于维护的Java web应用。对于大型项目,这样的组合能够提高开发效率,减少数据库相关的代码,并且使代码更符合企业级开发...
SSH框架整合是Java Web开发中常见的一种技术栈,由Spring、Hibernate和Struts2三个开源框架组合而成。这个组合提供了一种高效、灵活且可扩展的解决方案,用于构建企业级的Web应用程序。以下是对SSH框架整合及其中...
SSH(Struts、Spring、Hibernate)是一个经典的Java Web开发框架组合,其中Spring是核心,它负责管理和协调应用程序的各个部分。本资源提供了Spring框架所需的基本jar包,这些jar包是构建基于Spring的应用程序的基础...
SSH(Struts2、Spring、Hibernate)是一种经典的Java Web开发框架,它整合了Struts2的MVC设计模式、Spring的依赖...在这个案例中,S2SpringJPA_annotation文件很可能是包含了具体实现这些功能的源代码,供学习和参考。
### SSH框架和JPA+EJB+JSF框架的比较 #### 一、SSH框架解析 SSH框架是由Struts、Spring和Hibernate三个独立的框架组成的,它们分别负责不同的职责:Struts用于构建MVC架构的表现层;Spring作为核心的依赖注入(DI...
SSH2(Struts2、Spring、Hibernate2)是一个经典的Java Web开发框架,它结合了Struts2的MVC设计模式,Spring的依赖注入和事务管理,以及Hibernate的持久层支持。SSH2框架使得开发者能够更高效地构建稳定、可维护的...
【SSH整合】指的是在Java开发中,将Spring、SpringMVC和Hibernate这三大框架进行集成。Spring作为核心容器,管理着应用对象的生命周期和依赖关系;SpringMVC是Spring的Web MVC框架,处理HTTP请求和响应;Hibernate则...
标题 "spring+mvc+jpa+shiro+hibernate+maven案例" 描述了一种集成多种技术的Web应用开发架构,其中包括Spring MVC、Spring JPA、Shiro、Hibernate以及Maven。这些技术都是Java开发中的关键组件,用于构建高效、安全...
SSH+JPA基础环境搭建教程 SSH框架,全称为Struts2、Spring和Hibernate的集成,是Java Web开发中常用的一套技术栈。本环境基于SSH,并引入了JPA(Java Persistence API)作为数据持久层的解决方案,同时配合MySQL...