1、Spring Data JPA 入门
1.1、Spring Data JPA概述
1.1.1、Spring Data JPA是什么?
它是Spring基于ORM框架、JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用Spring Data JPA可以极大提高开发效率!
1.1.2、 Spring Data JPA 有什么?
1、Spring Data JPA 提供的编程接口
(1) 接口
● Repository:最顶层的接口,是一个空接口,目的是为了统一所有的Repository的类型,且能让组件扫描时自动识别。
● CrudRepository: Repository的子接口,提供CRUD的功能。
● PagingAndSortingRepository:CrudRepository的子接口, 添加分页排序。
● JpaRepository:PagingAndSortingRepository的子接口,增加批量操作等。
● JpaSpecificationExecutor:用来做复杂查询的接口。
(2) 接口继承关系图
1.2、建立项目:用户管理
1.2.1、 搭建“用户管理”项目
1、建立工程
(3) 准备开发工具
开发工具 Eclipse,MySQL数据库,数据库管理工具MySQL Workbench
(4) 创建数据库
建立数据库:usermanage
(5) 在Eclipse中建立Java工程
创建Dynamic Web Project,命名为usermanage
(6) 创建工程包结构
应用重要的几个层次及调用关系:● icar.chenlong.repository(存放自定义的数据操作接口)
● icar.chenlong.model(存放实体模型)
● icar.chenlong.service(存放服务层的接口和实现)
● icar.chenlong.controller (如果是MVC项目可建立此包,存放控制器)
● icar.chenlong.exception(存放异常类)
● icar.chenlong.test(存放测试类)
2 、导入所有需要的jar包
所有需要的jar包如下:● Spring 基础jar包
● Spring Data Commons jar包
● Spring Data JPA jar包
● Hibernate 相关 jar包
● MySQL数据库连接包
● 日志相关jar包
● 其它jar包
3 、配置与编码
(1) 创建配置
● 配置文件一:applicationContext.xml(Spring上下文)
● 配置文件二:persistence.xml(管理持久化)
(2) 创建类文件并编码
类之间的继承关系:● User.java(用户实体类)
● IUserRepository.java(用户的数据接口)
● IUserService.java(用户服务接口)
● UserServiceImpl.java(接口实现)
● UserNotFound.java(异常类,在查询实体未找到时抛出)
(3) 实体中常用的注解
● @Entity :声明这个类是一个实体类
● @Table:指定映射到数据库的表格
● @Id :映射到数据库表的主键属性,一个实体只能有一个属性被映射为主键
● @GeneratedValue:主键的生成策略
● @Column:定义字段名,若省略该注解,则默认使用属性名当作字段名
1.3、添加、修改、删除查询功能的基本实现
1.3.1、JpaRepository接口方法
● delete删除或批量删除
● findAll查找所有
● findOne查找单个
● save保存单个或批量保存
● saveAndFlush保存并刷新到数据库
其余可查看spring-data-jpa-xxx.RELEASE.jar包源码。
1.4、查询操作的基本实现(排序、分页)
1.4.1、基于方法名解析的概念
JpaRepository支持接口规范方法名查询。意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现。
例如:findByName这个方法表示从数据库中查询Name这个属性等于XXX的所有记录,类似于SQL语句:select * from xxTable where name=xxx这种形式这段话有两个重点:
1、方法名需要在接口中设定;2、必须符合一定的命名规范;
1.4.2、方法名构造方法
find+全局修饰+By+实体的属性名称+限定词+连接词+ ...(其它实体属性)+OrderBy+排序属性+排序方向。
例如:
findDistinctByFirstNameIgnoreCaseAndLastNameOrderByAgeDesc(String firstName,String lastName){......}
其中:Distinct是全局修饰(非必须),FirstName和LastName是实体的属性名,And是连接词,IgnoreCase是限定词,Age是排序属性,Desc是排序方向,限定词和连接词统称为“关键词”。
1.4.3、目前支持的关键词
常用词如下:
全局修饰:Distinct,Top,First
关键词:IsNull,IsNotNull,Like,NotLike,Containing,In,NotIn,IgnoreCase,Between,Equals,LessThan,GreaterThan,After,Before...
排序方向:Asc,Desc
连接词:And,Or
更多关键词请查看官方在线文档:
http://docs.spring.io/spring-data/jpa/docs/1.8.0.RELEASE/reference/html/
1.4.4、嵌套实体方法命名规则
构词法:主实体中子实体的名称+ _ +子实体的属性名称
例如:List<Person> findByAddress_ZipCode(ZipCode zipCode);
表示查询所有 Address(地址)的zipCode(邮编)为指定值的所有Person(人员)
注:List<Person> findByAddressZipCode(ZipCode zipCode);也是正确的用法,但是由于Spring Data JPA对属性表达式的解析规则存在歧义性,故推荐使用前一种用法。
详细可以参考:http://wujng68.iteye.com/blog/1925132 红色标注的“属性表达式”将对歧义行进行解释。
下载示例项目:
Spring Data JPA入门项目01(添加、修改、删除、查询功能的基本实现)Spring Data JPA入门项目02(查询操作的基本实现(排序、分页))
注:以上两个项目中Service层的@Transactional注解导入了错误的类,若想事务运行正常,请重新导入“org.springframework.transaction.annotation.Transactional”。