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>

 

0 0
原创粉丝点击