以下內容轉載於
在此權作爲筆記
SpringDate簡介
Spring Data是什麼
Spring Data是一個用於簡化數據庫訪問,並支持雲服務的開源框架。其主要目標是使得對數據的訪問變得方便快捷
Spring Data JPA能幹什麼
可以極大的簡化JPA的寫法,可以在幾乎不用寫實現的情況下,實現對數據的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的功能。
Spring Data JPA 有什麼
主要來看看Spring Data JPA提供的接口,也是Spring Data JPA的核心概念:
1:Repository:最頂層的接口,是一個空的接口,目的是爲了統一所有Repository的類型,且能讓組件掃描的時候自動識別。
2:CrudRepository :是Repository的子接口,提供CRUD的功能
3:PagingAndSortingRepository:是CrudRepository的子接口,添加分頁和排序的功能
4:JpaRepository:是PagingAndSortingRepository的子接口,增加了一些實用的功能,比如:批量操作等。
5:JpaSpecificationExecutor:用來做負責查詢的接口
6:Specification:是Spring Data JPA提供的一個查詢規範,要做複雜的查詢,只需圍繞這個規範來設置查詢條件即可
特徵
- 強大的存儲庫和自定義對象映射抽象
- 從存儲庫方法名稱中進行動態查詢導出
- 實現域基類提供基本屬性
- 支持透明審覈(創建,最後更改)
- 集成自定義存儲庫代碼的可能性
- Easy Spring通過JavaConfig和自定義XML命名空間進行集成
- 與Spring MVC控制器進行高級集成
搭建SpringData開發環境
導入依賴
pom.xml文件
<!--Mysql 驅動包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.11.6.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.9.Final</version>
</dependency>
配置spring文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--配置數據源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="url" value="jdbc:mysql:///springdata"/>
</bean>
<!--配置EntityManagerFactory-->
<bean id = "entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="packagesToScan" value="com.wzw.springdata"/>
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<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"/>
</bean>
<!--4 配置支持註解的事務-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--5 配置spring data-->
<jpa:repositories base-package="com.wzw.springdata" entity-manager-factory-ref="entityManagerFactory"/>
<context:component-scan base-package="com.wzw.springdata"/>
</beans>
創建test類
public class SpringDataTest {
private ApplicationContext ac = null;
@Before
public void setUp() {
ac = new ClassPathXmlApplicationContext("application.xml");
System.out.println("start");
}
/**
* 拆卸
*/
@After
public void tearDown() {
ac = null;
System.out.println("tearDown");
}
@Test
public void testEntityManagerFactory() {
}
}
SpringData_Hello
創建實體類
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Employee {
private Integer id;
private String name;
private Integer age;
@GeneratedValue
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 20)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
創建EmployeeRepository接口繼承Repository
import java.util.List;
import org.springframework.data.repository.Repository;
import com.wzw.springdata.model.Employee;
public interface EmployeeRepository extends Repository<Employee,Integer> {
public Employee getEmployeeById(Integer id);
}
編寫測試方法
@Test
public void fun1() {
System.out.println("1: " + er);
Employee employee = er.getEmployeeById(1);
System.out.println("2: " + employee);
}
註解方式定義Repository接口
@RepositoryDefinition(domainClass = Employee.class, idClass = Integer.class)
public interface EmployeeRepository2 {
Employee getEmployeeByName(String name);
}
Repository類的定義:
public interface Repository<T, ID extends Serializable> {
}
- Repository是一個空接口,標記接口。沒有包含方法聲明的接口
- 如果我們定義的接口EmployeeRepository extends Repository
- 如果我們自己的接口沒有extends Repository,運行時會報錯:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springdata.repository.EmployeeRepository' available