1. 程式人生 > >SpringDataJPA學習記錄(一)--環境配置

SpringDataJPA學習記錄(一)--環境配置

SpringDataJPA學習記錄(一)–環境配置

標籤(空格分隔): springJPA

1.maven配置

首先需要spring相關架包,其實spring-data-jpa裡面已經依賴了,如果你想用自己的版本則需要額外引入spring相關包.JPA實現還都是hibernate去實現的,所以還需要hibernate相關包.mysql就更不用說了.

    <!--JPA start-->
      <dependency>
        <groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId> <version>1.10.4.RELEASE</version> </dependency> <!--JPA end--> <!--hibernate start--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId
>
<version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency>
<!--hibernate end--> <!--mysql start--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!--mysql end-->

2.整合Spring

整合Spring主要有以下幾點要注意:
1.資料來源配置
2.JPA提供者,JPA屬性配置
3.事務配置
4.jpa:repositories 配置,具體如下程式碼:

 <!-- 載入資料庫配置檔案 -->
    <context:property-placeholder location="classpath:config.properties"/>
<!--配置資料庫連線池Druid-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 資料庫基本資訊配置 -->
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="filters" value="${filters}" />
        <!-- 最大併發連線數 -->
        <property name="maxActive" value="${maxActive}" />
        <!-- 初始化連線數量 -->
        <property name="initialSize" value="${initialSize}" />
        <!-- 配置獲取連線等待超時的時間 -->
        <property name="maxWait" value="${maxWait}" />
        <!-- 最小空閒連線數 -->
        <property name="minIdle" value="${minIdle}" />
        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
        <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
        <property name="validationQuery" value="SELECT 1" />
        <property name="testWhileIdle" value="${testWhileIdle}" />
        <property name="testOnBorrow" value="${testOnBorrow}" />
        <property name="testOnReturn" value="${testOnReturn}" />
        <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}" />
        <!-- 開啟removeAbandoned功能 -->
        <property name="removeAbandoned" value="${removeAbandoned}" />
        <!-- 1800秒,也就是30分鐘 -->
        <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}" />
        <!-- 關閉abanded連線時輸出錯誤日誌 -->
        <property name="logAbandoned" value="${logAbandoned}" />
    </bean>

    <!--第二步-->
    <!--定義實體的工廠bean-->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--實體類位置-->
        <property name="packagesToScan" value="cn.mrdear.entity"/>
        <!--持久化單元名-->
        <property name="persistenceUnitName" value="TestJPA" />
        <!--JPA提供者-->
        <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
        <!--JPA屬性-->
        <property name="jpaProperties">
            <props>
                <!--配置方言-->
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <!--啟用查詢日誌功能-->
                <prop key="hibernate.show_sql">false</prop>
                <!--優雅地輸出Sql-->
                <prop key="hibernate.format_sql">false</prop>
                <!--新增一條解釋型標註-->
                <prop key="hibernate.use_sql_comments">false</prop>
                <!--配置如何根據java模型生成資料庫表結構,常用update,validate-->
                <prop key="hibernate.hbm2ddl.auto">none</prop>
            </props>
        </property>
    </bean>

    <!--第三步-->
    <!--定義事務管理器-->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="dataSource" ref="dataSource"/>
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <!--第四步-->
    <!--定義repository介面的存放目錄-->
    <!--定義介面實現的字尾,通常用Impl-->
    <!--定義實體工廠的引用-->
    <!--定義事務管理器的引用-->
    <jpa:repositories base-package="cn.mrdear.repository"
                      repository-impl-postfix="Impl"
                      entity-manager-factory-ref="entityManagerFactory"
                      transaction-manager-ref="transactionManager"/>

    <!--第五步-->
    <!--宣告採用註解的方式申明事務-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

3.建立實體類

實體類中常用註解:
* @Entity :宣告這個類是一個實體類
* @Table:指定對映到資料庫的表格
* @Id :對映到資料庫表的主鍵屬性,一個實體只能有一個屬性被對映為主鍵
* @GeneratedValue:主鍵的生成策略
* @Column配置單列屬性

@Entity//標識該為一個實體
@Table(name = "user")//關聯資料庫中的user表
public class User {

    @Id//標識該屬性為主鍵
    private Integer id;

    private String name;

    private String address;

    private String phone;

    //省略get和set
}

3.Repository介面

  • Repository: 最頂層的介面,是一個空介面,目的是為了統一所有的Repository的型別,且能讓元件掃描時自動識別
  • CrudRepository: Repository的子介面,提供CRUD 的功能。
  • PagingAndSortingRepository:CrudRepository的子介面, 新增分頁排序。
  • JpaRepository: PagingAndSortingRepository的子介面,增加批量操作等。
  • JpaSpecificationExecutor: 用來做複雜查詢的介面。

(圖片漏了一個字母J)
這裡寫圖片描述

由圖來看,一般使用JpaRepository這個介面做查詢即可.這個介面擁有如下方法:

  • delete刪除或批量刪除
  • findOne查詢單個
  • findAll查詢所有
  • save儲存單個或批量儲存
  • saveAndFlush儲存並重新整理到資料庫

建立repository

//User表示該Repository與實體User關聯,主鍵型別為Integer
public interface UserRepository extends JpaRepository<User,Integer> {

}

這樣就完成了一個基本Repository的建立,可以直接使用其中的方法,而不需要去寫實現類.

4.測試

關於測試這裡,我把測試案例寫到test資料夾的話,總是報實體類未被JPA管理,所以改寫到java資料夾,具體原因未知.

    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
        UserRepository userRepository = (UserRepository) applicationContext.getBean("userRepository");
        System.out.println(userRepository.findAll());
        System.out.println(userRepository.findOne(1));
        System.out.println(userRepository.findAll(new Sort(new Sort.Order(Sort.Direction.ASC,"id"))));
    }

這裡寫圖片描述

程式碼地址: