SpringData
SpringData
Spring的一个子项目,用于简化数据库访问,支持NoSQL和关系数据存储
支持的NoSQL MongoDB(文档数据库),Neo4j(图形数据库),Redis(键/值),Hbase(列族数据库)
关系数据存储技术,JDBC,JPA
JPA Spring Data
致力于减少数据访问层(Dao)的开发量,开发者做的是声明持久层的接口
案例
引入依赖,配置文件配置
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.atguigu.springdata"></context:component-scan>
<!-- 1. 配置数据源 -->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<!-- 配置其他属性 -->
</bean>
<!-- 2. 配置 JPA 的 EntityManagerFactory -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"></bean>
</property>
<property name="packagesToScan" value="com.atguigu.springdata"></property>
<property name="jpaProperties">
<props>
<!-- 二级缓存相关 -->
<!--
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="net.sf.ehcache.configurationResourceName">ehcache-hibernate.xml</prop>
-->
<!-- 生成的数据表的列的映射策略 -->
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<!-- hibernate 基本属性 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!-- 3. 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"></property>
</bean>
<!-- 4. 配置支持注解的事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 5. 配置 SpringData -->
<!-- 加入 jpa 的命名空间 -->
<!-- base-package: 扫描 Repository Bean 所在的 package -->
<jpa:repositories base-package="com.atguigu.springdata"
entity-manager-factory-ref="entityManagerFactory"></jpa:repositories>
创建实体类,创建dao层 personRepsotory
1、Repsotory 是一个空接口
2、若接口继承了Repository,该接口会被IOC容器识别为一个Repository Bean,纳入IOC容器
3、使用@RepositoryDefinition(domainClass=Person.class,idClass=Intger.class)等效于继承下面的接口
public interface personRepsotory extends Repository<Person,Integer>{
Person getByName(String name);
}
CrudRepository,继承Repository,实现一组CRUD相关的方法
PagingAndSortingRepository,继承CrudRepository,实现一组分页排序相关的方法
JpaRepository,继承PagingAndSortingRepository,实现一组JPA规范相关的方法
自定义的XxxRepository,需要继承JpaRepository,使用接口具备通用的数据访问控制层的能力
JpaSpecificationExecutor,不属于Repository体系,实现一组JPA Criteria查询相关的方法
Repository定义方法的规范
查询方法必须以 find |read |get 开头,涉及条件查询时,条件的属性用条件关键字连接
条件属性以字母大写,支持属性的级联查询,若当前类有符合条件的属性,优先使用当前类属性
若想优先使用级联属性,则属性直接使用_进行连接
使用@Query进行查询
自定义查询语句,JPQL
@Query("内置sql语句"),如 Select p from Person p where p.id =1;
Person getMaxIdPerson();
传参查询,使用占位符方式,允许在旁边添加%
@Query("内置sql语句.... id = ?1,...,?n")
Person getPersonBySome(Integer id,...);
传参查询,使用命名参数方式,允许在旁边添加%
@Query("内置sql语句.... id = :myId,...,:myN")
Person getPersonBySome(@Param("myId")Integer id,..@Param("myN")....);
支持原生sql语句
@Query(value="sql语句",nativeQuery=true)
....
使用@Modifying 修改和删除,需要添加事务
自定义修改和删除语句,JPQL,不支持INSERT ,在Service需要添加事务
默认情况下SpringData的每个方法上有事务,但都是一个只读事务,它们不能完成修改
Repository子接口CrudRepository接口
接口中默认添加了一些,增删改查的功能
save(s);
save(Iterable);
findOne(ID);
exists(ID);
findAll();
findAll((Iterable
count();
delete(ID);
delete(S);
delete(Iterable<?extends T>)
deleteAll()
CrudRepository子接口PagingAndSortingRepository接口
Iterable
Page
Pageable实现类 PageRequest(pageNo,PageSize,Sort);
page 中 总记录数,TotalElements;当前第几页 Number,总页数 TotalPages,页面list Content,页面记录数NumberOfElement
Sort在封装了排序方式,传入Order 排序实现,Order(Direction.DESC,"id");升降序,按那个属性
PagingAndSortingRepository子接口JpaRepository接口
flush();
saveAndFlush(T)
deleteInBatch(Iterable
deleteAllInBatch();
JpaSpecificationExecutor接口
findOne(Specification
findAll(Specification
findAll(Specification
findAll(Specification
count(Specification
Specification通常使用匿名内部类, 实现方法,Predicate toPredicate(Root<> root,CriteriaQuery<?> query,CriteriaBulider cb)
Predicate 查询条件,root 查询的实体类,query,从中得到Root对象,告知JPA ,Criteria 查询的那个实体类,添加查询条件,可以结合EntityManager,得到TypedQuery对象,cb 用于创建Criteria对象的工厂,可以获得Predicate对象
例如 id大于5
Path p = root.get("id");
Predicate p1 = cb.gt(p,5)
自定义Repository
继承 JpaRepository,JpaSpecificationExecutor,加上@Query 可以实现大部分功能
1、定义接口,声明要添加的方法
2、提供该接口的实现类,类名声明必须在声明的接口后加Impl并实现声明接口的方法
3、声明Repository继承 1的接口
浙公网安备 33010602011771号