介绍
它是JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL的查询语句 ,是属于Spring的生成体系中的一部分。
SpringDataJpa使用起来比较方便,加快了开发的效果,不需要关心和配置更多的东西。
SpringDataJpa上手简单,开发效率高,对对象的支持非常好,还十分的灵活。
Spring Data项目是从2010年开发发展起来的,是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data 包含多个子项目:
Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化
01、ORM框架
MyBatis:Apache的一个开源项目,上手简单,开发灵活,现在市场占有率高; 但是开发时工作量比较大,需要做很多配置,并且自己要写SQL语句。
Hibernate:一个开放源代码的对象关系映射框架,是完全面向对象的。可以使用面向对象的思路来完成数据库操作。 Hibernate是完备的ORM框架(咱们之前学习JPA,底层就是使用Hibernate完成的)。
02、SpringData的结构
Spring Data JPA的七个Repository接口:
Repository(org.springframework.data.repository.Repository)
Repository是 Spring Data JPA 中为我们提供的所有接口中的顶层接口
CrudRepository(org.springframework.data.repository.CrudRepository)
CrudRepository 主要用于对实体的增删改查操作
PagingAndSortingRepository(org.springframework.data.repository.PagingAndSortingRepository)
PagingAndSortingRepository提供分页和排序功能
JpaRepository (org.springframework.data.jpa.repository.JpaRepository)
JpaRepository提供JPA相关的方法,如刷新持久化数据、批量删除。
QueryByExampleExecutor(org.springframework.data.repository.query.QueryByExampleExecutor)
JpaSpecificationExecutor (org.springframework.data.jpa.repository.JpaSpecificationExecutor)
QueryDslPredicateExecutor (org.springframework.data.querydsl.QueryDslPredicateExecutor)
两大Repository实现类:
SimpleJpaRepository(org.springframework.data.jpa.repository.support.SimpleJpaRepository)
QueryDslJpaRepository(org.springframework.data.jpa.repository.support.QueryDslJpaRepository)
结构图(通过Intellij Idea,打开SimpleJpaRepository.java,单击鼠标右键show diagrams,就可以用图表的式打开与查询类的关系层次图,每次看图很麻烦,也可以点击类名按F4去查看子类):
CrudRepository:完成所有基本的增删改查的方法
其中T是要操作的实体类,ID是实体类主键的类型。该接口提供了11个常用操作方法
PagingAndSortingRepository:完成分页与排序功能
JpaRepository:
注意与说明:
1.几个查询、及批量保存方法,和 CrudRepository 接口相比,返回的是 List,使用起来更方便。
2.增加了 InBatch 删除, 实际执行时,后台生成一条sql语句,效率更高些。相比较而言,CrudRepository 接口的删除方法,都是一条一条删除的,即便是 deleteAll 也是一条一条删除的。
3.增加了 getOne() 方法,切记,该方法返回的是对象引用,当查询的对象不存在时,它的值不是Null。
创建项目
一般来说,都是去创建一个webapp的maven项目,好处都知道嘛,自动导包,舒服的很
配置文件
jdbc.properties:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///数据库名称
username=用户名
password=密码
spring.xml(一般用的名字是ApplicationContext.xml,个人习惯spring.xml):
<?xml version="1.0" encoding="UTF-8"?><!-- 扫描service部分的包 -->
<context:component-scan base-package="cn.dw" />
<context:property-placeholder system-properties-mode="FALLBACK" location="classpath:jdbc.properties" />
<!-- 配置连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!--连接数据4个属性 -->
<property name="driverClassName" value="${driverClassName}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!--maxActive: 最大连接数量 -->
<property name="maxActive" value="150" />
<!--minIdle: 最小空闲连接 -->
<property name="minIdle" value="5" />
<!--maxIdle: 最大空闲连接 -->
<property name="maxIdle" value="20" />
<!--initialSize: 初始化连接 -->
<property name="initialSize" value="30" />
<!-- 用来配置数据库断开后自动连接的 -->
<!-- 连接被泄露时是否打印 -->
<property name="logAbandoned" value="true" />
<!--removeAbandoned: 是否自动回收超时连接 -->
<property name="removeAbandoned" value="true" />
<!--removeAbandonedTimeout: 超时时间(以秒数为单位) -->
<property name="removeAbandonedTimeout" value="10" />
<!--maxWait: 超时等待时间以毫秒为单位 1000等于60秒 -->
<property name="maxWait" value="1000" />
<!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. -->
<property name="timeBetweenEvictionRunsMillis" value="10000" />
<!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->
<property name="numTestsPerEvictionRun" value="10" />
<!-- 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程 -->
<property name="minEvictableIdleTimeMillis" value="10000" />
<property name="validationQuery" value="SELECT NOW() FROM DUAL" />
</bean>
<!-- 集成hibernate的jpa功能 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--待扫描的实体类包,不再需要persistence.xml了 -->
<property name="packagesToScan" value="cn.dw.domain" />
<!-- 3.配置JPA的实现 -->
<!-- private JpaVendorAdapter jpaVendorAdapter; -->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!-- org.springframework.orm.jpa.vendor.AbstractJpaVendorAdapter -->
<!-- private boolean showSql = false;是否显示sql语句 -->
<property name="showSql" value="true" />
<!-- private boolean generateDdl = false;是否建表 -->
<property name="generateDdl" value="false" />
<!-- private String databasePlatform;原来方言 -->
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
</bean>
</property>
</bean>
<!-- Jpa 事务配置 -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<!-- 注解声明式事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Spring Data Jpa配置 ********************************************-->
<!-- base-package:扫描的包 -->
<jpa:repositories base-package="cn.dw.repository" transaction-manager-ref="transactionManager"
entity-manager-factory-ref="entityManagerFactory" />
03、JpaRepository的基本功能
3.1.普通的CRUD(也就是测试类 测试代码)
测试类注意在类上方加注解,@Autowired为自动注入
简单的一些增删改查的话写代码的过程中回去继承实现其他类,类中有包装,不需要自己去写
其他查询
其中nativeQuery=true表示使用原生的sql语句
04、jpa-spec插件
推荐适用网站:https://github.com/wenhao/jpa-spec
在Maven中引入相应的包
多个查询
抽取工具类
在进行多个条件查询的时候,会发现查询的越多代码量就越杂,很容易出错,,这个时候完全可以去抽取一个工具类,后面用的时候舒服的很