(1).什么名字是Spring Data JPA
Spring Data JPA是Spring基于Hibernate开发的一个JPA框架,Spring Data JPA是Spring Data的一个子项目,它通过提供基于JPA的Repository极大地减少了JPA作为数据访问方案的代码量,也就是xml不需要再写很多常规的sql代码了。
(2).定义数据访问层
使用Spring Data JPA建立数据访问层十分简单,只需定义一个继承JpaRepository的接口。
JpaRepository接口源码如下:
(3).配置使用Spring Data JPA
在Spring环境中,使用Spring Data JPA可通过@EnableJpaRepositories注解来开启Spring Data JPA的支持,该注解接收的value参数用来扫描数据访问层在包下的数据访问的接口定义。
(4).定义查询方法
1.根据属性名查询
Spring Data JPA支持通过定义在Repository接口中的方法名来定义查询,而方法名是根据实体类的属性名来确定的。
常规查询:
从代码可以看出,这里使用了findBy、Like、And这样的关键字。其中findBy可以用find、read、readBy、query、queryBy、get、getBy来代替。
限制结果数量查询。结果数量可以用top和first关键字来实现。
2.使用JPA的NamedQuery查询
Spring Data JPA 支持用JPA的NameQuery来定义查询方法,即一个名称映射一个查询语句。
3.使用@Query查询
使用参数索引。Spring Data JPA还支持用@Query注解在接口的方法上实现查询,如下:
使用命名参数。在Spring Data JPA里还支持在语句中用名称来匹配查询参数,如下:
更新查询。Spring Data JPA支持@Modifying和@Query注解组合来事件更新查询,如下:
返回值int表示更新语句影响的行数。
4.排序与分页
Spring Data JPA为我们提供了Sort类以及Page接口和Pageable接口用来实现排序和分页。
方法定义如下:
使用排序:
使用分页:
其中Page接口可以获得当前页面的记录、总页数、总记录数、是否有上一页或者下一页等。
(1). 对JDBC的自动配置
Spring-boot-starter-data-jpa依赖于spring-boot-starter-jdbc,而Spring Boot对JDBC做了一些自动配置,源码放在org.springframework.boot.autoconfigure.jdbc。从源码中可以看出,我们通过“spring.datasoure”为前缀的属性自动配置dataSource。Spring Boot自动开启了注解事务的支持(@EnableTransactionaManagement),还配置了一个jdbcTemplate。
Spring Boot还提供了一个初始化数据的功能:放置在类路径下的schema.sql文件会自动用来初始化表结构;放置在类路径下的data.sql文件会自动用来填充表数据。
(2). 对JPA的自动配置
Spring Boot对JPA的自动配置放在org.springframework.boot.autoconfigure.orm.jpa下。
从HibernateJpaAutoConfiguration可以看出,Spring Boot默认JPA的实现者是Hibernate;HibernateJpaAutoConfiguration依赖于DataSourceAutoConfiguration。
从JpaProperties的源码可以看出,配置JPA可以使用“spring.jpa”为前缀的属性在appplication.properties中配置。
从JpaBaseConfiguration的源码中可以看出,Spring Boot为我们配置了transactionManager、entityManageFactory等Bean。JpaBaseConfiguration还有一个getPackagesToScan方法,可以自动扫描注解有@Entity的实体类。
(3). 对Spring Data JPA的自动配置
Spring Boot对Spring Data JPA的自动配置放在org.springframework.boot.autoconfigure.data.jpa下。
在Spring Boot下使用Spring Data JPA,只需要在Maven依赖里添加spring-boot-starter-data-jpa,然后定义DataSource、实体类和数据访问层,并在需要使用数据访问的地方注入数据访问层的Bean即可,无须任何额外配置。
我们将演示基于方法名的查询,基于@Query的查询、分页以及排序。
(1).基于Docker安装Oracle XE
如果对于docker的使用不了解,请看http://blog.csdn.net/c136547731/article/details/78654295。
Oracle XE是Oracle公司提供的免费开发测试用途的数据库,可自由使用,功能和使用与Oracle完全一致,但数据大小限制为4G.
我们已经提前下载了Oracle XE的镜像,现在我们运行启动一个Oracle XE的容器。如下:
将容器中的Oracle XE管理界面的8080端口映射为本机的9090端口,将Oracle XE的1521端口映射为本机的1521端口。
(2).端口映射
容器暴露的端口只是映射到VirtualBox虚拟机上,而本机要访问容器的话需要我们把VirtualBox的虚拟机的端口映射到当前开发机器上。
下面我们演示将VirtualBox虚拟机的端口映射到当前开发机器。
打开VirtualBox软件,选中boot2docker-vm,点击“设置”,选择“网络”,如下:
打开“端口转发”,将我们刚才暴露到虚拟机的9090端口以及1521端口映射为当前开发机器的9090以及1521端口,如下:
(3).管理
本容器提供的安装信息:
Hostname:localhost
端口:1521
SID: XE
username:system/sys
password: oracle
可以使用pl/sql developer来管理数据库,创建一个用户,账号密码为boot,作为我们演示的数据库账号。
(4).新建Spring Boot项目
搭建Spring Boot项目,依赖选择JPA(spring-boot-starter-data-jpa)和Web(spring-boot-starter-web)。
新建person表,数据如下:
在application.properties里配置数据源和jpa相关的属性
代码解释:
1.hibernate提供了根据实体类自动维护数据库表结构的功能,可通过spring.jpa.hibernate.dll-auto来配置,有下列可选项:
create:启动时删除上一次生成的表,并根据实体类生成表,表中数据会被清空
create-drop:启动时根据实体类生成表,sessionFactory关闭时表会被删除
update:启动时根据实体生成表,当实体类属性变动时,表结构也会更新
validate: 启动时验证实体类与数据表是否一致,在我们数据结构稳定时采用此选项
none: 不采取任何措施
2.spring.jpa.show-sql用来设置hibernate操作的时候在控制台显示其真是的sql语句
3.让控制台输出的json字符串格式更美观
代码解释:
1.@Entity注解指明这是一个和数据库表映射的实体类
2.@Id注解指明这个属性映射为数据库的主键
3.@GeneratedValue注解默认使用主键生成方式为自增,hibernate会为我们自动生成一个名为HIBERNATE_SEQUENCE序列