Spring Data JPA 实战(一)-体系结构及基本配置
来源:互联网 发布:js获取当前url参数 编辑:程序博客网 时间:2024/05/16 09:46
Spring Data JPA 实战(一)
一.Spring DataJPA介绍
使用Spring Data Repository将程序员从大量重复繁杂的数据库层操作中解放啊出来。
二.Repository:遍历的数据访问层
1. Repository的体系结构
2. Repository接口介绍
2.1 Repository
Spring-Data-Commons包提供了Repository接口,该接口是一个标识接口,也是Spring dataRepository的核心接口,这个接口需要将领域类以及领域类ID的类型做为参数,主要的作用如下:
1. 能够让spring的基础设置识别出用户定义的所有Spring Data Repository。
2. 大幅简化了各种持久化存储的持久层实现
3. 捕获托管的领域类和实体的ID类型
packageorg.springframework.data.repository;
import java.io.Serializable;
public abstract interface Repository<T,IDextendsSerializable> {
}
2.2 CrudRepository
CrudRepository继承了Repository接口,并声明了以下能力:
(1)保存给定的实体。
(2)返回指定ID的实体。
(3)返回全部实体。
(4)返回实体的总数。
(5)删除指定的实体。
(6)判断给定的ID是否存在。
我们可以通过继承CrudRepository接口去扩展我们需要的特性及服务。
CrudRepository源码如下:
@NoRepositoryBean
public abstract interfaceCrudRepository<T, ID extends Serializable> extends Repository<T,ID> {
publicabstract <S extends T> S save(S paramS);
publicabstract <S extends T> Iterable<S> save(Iterable<S>paramIterable);
publicabstract T findOne(ID paramID);
publicabstract boolean exists(ID paramID);
publicabstract Iterable<T> findAll();
publicabstract Iterable<T> findAll(Iterable<ID> paramIterable);
publicabstract long count();
publicabstract void delete(ID paramID);
publicabstract void delete(T paramT);
publicabstract void delete(Iterable<? extends T> paramIterable);
publicabstract void deleteAll();
}
2.3 PagingAndSortingRepository
PagingAndSortingRepository 继承了CrudRepository接口,提供了分页与排序的功能。
例如:如果我们想查询第二页的20行的用户数据,可以通过如下方式实现:
PagingAndSortingRepository<User,Long> repository = // … get access to a bean
Page<User> users =repository.findAll(new PageRequest(1, 20));
PagingAndSortingRepository源码如下:
public abstractinterfacePagingAndSortingRepository<T, IDextends Serializable>extends CrudRepository<T,ID> {
public abstractIterable<T> findAll(Sort paramSort);
public abstract Page<T>findAll(Pageable paramPageable);
}
2.4 JpaRepository
JpaRepository接口是Spring Data Jpa对Spring DataRepository的实现。该接口继承自PagingAndSortingRepository,并进行了扩展。
JpaRepository源码如下:
@NoRepositoryBean
publicabstract interface JpaRepository<T, ID extends Serializable> extendsPagingAndSortingRepository<T, ID> {
public abstract List<T> findAll();
public abstract List<T>findAll(Sort paramSort);
public abstract List<T>findAll(Iterable<ID> paramIterable);
public abstract <S extends T>List<S> save(Iterable<S> paramIterable);
public abstract void flush();
public abstract <S extends T> SsaveAndFlush(S paramS);
public abstract voiddeleteInBatch(Iterable<T> paramIterable);
public abstract void deleteAllInBatch();
public abstract T getOne(ID paramID);
}
3. Repository配置
<jpa:repositories>是spring datajpa的重要配置:启用扫描并自动创建代理。
<jpa:repositories>
<!-- Spring Data Jpa配置 -->
<jpa:repositoriesbase-package="com.yyjz"
transaction-manager-ref="transactionManager"
entity-manager-factory-ref="entityManagerFactory"
factory-class="com.yyjz.icop.base.dao.impl.BaseDaoFactoryBean">
<!-- <repo:exclude-filter type="regex"expression="com.yycc.construction.solr"
/>-->
</jpa:repositories>
4. 完整JPA Xml配置文件样例
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/data/jpahttp://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
default-lazy-init="true">
<description>SpringJpa配置</description>
<!-- 如果spring用了jpa,并且类型为LocalContainerEntityManagerFactoryBean,则组件注册在此配置文件出现即可,其余配置文件可忽略
使用component来替代annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入\ -->
<context:component-scanbase-package="com.spring.jpa"/>
<!-- spring启动时扫描项目路径下的properties文件,后续用${key}方式取出对应值,这样可以代码解耦和,后续只需修改properties文件即可 -->
<beanid="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<propertyname="locations">
<list>
<!-- dataSourse连接池相关属性,代码不在此贴出,会放在打包好的项目里面 -->
<value>classpath:db.properties</value>
</list>
</property>
</bean>
<!-- 定义实体管理器工厂
Jpa配置 LocalContainerEntityManagerFactoryBean这个选项Spring扮演了容器的角色。完全掌管JPA -->
点我查看 spring生成EntityManagerFactory的三种方式
<beanid="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!-- 指定数据源 -->
<propertyname="dataSource" ref="dataSource"/>
<!-- 指定Jpa持久化实现厂商类,这里以Hibernate为例 -->
<propertyname="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
<!-- 指定Entity实体类包路径-->
<propertyname="packagesToScan">
<array>
<value>com.spring.jpa</value>
</array>
</property>
<!-- 指定JPA属性;如Hibernate中指定是否显示SQL的是否显示、方言等 -->
<propertyname="jpaProperties">
<props>
<propkey="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<propkey="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<propkey="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
<propkey="hibernate.show_sql">true</prop>
<propkey="hibernate.format_sql">true</prop>
<propkey="hibernate.hbm2ddl.auto">validate</prop>
</props>
</property>
</bean>
<!-- 重要配置:启用扫描并自动创建代理的功能 -->
<jpa:repositoriesbase-package="com.spring.jpa" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>
<!-- Hibernate对Jpa的实现 -->
<beanid="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
<!-- Jpa 事务管理器 -->
<beanid="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<propertyname="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<!-- 开启注解事务 -->
<tx:annotation-driventransaction-manager="transactionManager" proxy-target-class="true"/>
<!-- 数据源配置,使用应用内的DBCP数据库连接池-->
<beanid="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!--propertyname="driverClassName" value="${db.driverClass}"/-->
<propertyname="url" value="${db.jdbcUrl}"/>
<propertyname="username" value="${db.user}"/>
<propertyname="password" value="${db.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<propertyname="initialSize" value="${db.initialSize}"/>
<propertyname="minIdle" value="${db.minIdle}"/>
<propertyname="maxActive" value="${db.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<propertyname="maxWait" value="${db.maxWait}"/>
<!--配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<propertyname="timeBetweenEvictionRunsMillis" value="${db.timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<propertyname="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"/>
<propertyname="validationQuery" value="SELECT'x' from dual"/>
<propertyname="testWhileIdle" value="true"/>
<propertyname="testOnBorrow" value="false"/>
<propertyname="testOnReturn" value="false"/>
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<propertyname="poolPreparedStatements" value="${db.poolPreparedStatements}"/>
<propertyname="maxPoolPreparedStatementPerConnectionSize" value="${db.maxPoolPreparedStatementPerConnectionSize}"/>
</bean>
<!-- 启动对@AspectJ(面向切面)注解的支持 -->
<aop:aspectj-autoproxy/>
</beans>
- Spring Data JPA 实战(一)-体系结构及基本配置
- spring-data-jpa学习(一)环境配置1.1
- spring-data-jpa学习(一)环境配置1.2
- spring-data-jpa学习(一)环境配置1.3
- spring data jpa(一)
- spring data JPA 配置
- spring data JPA 配置
- spring data jpa 配置
- Spring Data JPA配置
- Spring Data Jpa 配置
- Spring Data JPA实战视频教程
- Spring Data JPA教程:审计(一)
- Spring Data JPA 学习笔记(一)
- spring data jpa 使用(一)
- Spring Data Jpa 详解 (配置篇)
- Spring Data Jpa 详解 (配置篇)
- Spring Data Jpa 详解 (配置篇)
- Spring Data Jpa 详解 (配置篇)
- 九年开发生涯,而立之年带着一家老小离开了奋斗的广州
- Pillow学习之Tutorial
- 代码混淆后如何快速定位错误
- 【codeforces 782A】Andryusha and Socks
- 内存管理之memblock管理之移除块
- Spring Data JPA 实战(一)-体系结构及基本配置
- 在linux服务器上安装tomcat服务器步骤
- io流读写程序
- 浅谈数据库中的触发器
- C语言之判断100~200之间的素数(质数)
- clean code 读书笔记
- 保存图片到相册
- Bootstrap表格
- Python之实际应用——脚本美化