SpringDataJPA學習記錄(一)--環境配置
阿新 • • 發佈:2019-02-09
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"))));
}
程式碼地址: