<jpa:repositories> 掃描 Repository 介面並建立代理 Bean。Repository 的持久層介面。建立 Java 專案,libs 目錄放入:Spring Framework、Hibernate、JPA API、C3P0 連接池、MySQL 驅動、Spring Data JPA、SLF4J 日誌門面。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:context="https://www.springframework.org/schema/context"
xmlns:tx="https://www.springframework.org/schema/tx"
xmlns:jpa="https://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="...spring-beans.xsd ...spring-context.xsd ...spring-tx.xsd ...spring-data-jpa.xsd">
<!-- 1. 資料源 -->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
</bean>
<!-- 2. JPA 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.springdata.jpa"/>
<property name="jpaProperties">
<props>
<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>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 4. Spring Data JPA 掃描 -->
<jpa:repositories base-package="com.springdata.jpa" entity-manager-factory-ref="entityManagerFactory"/>
</beans>
jdbc.user=root
jdbc.password=mysql
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///jpa
@Entity
@Table(name="JPA_PERSONS")
public class Person {
@Id @GeneratedValue
private Integer id;
private String lastName;
private String email;
private Date birth;
// Getter/Setter 省略
}
public interface PersonRepository extends Repository<Person, Integer> {
// 依方法名自動生成查詢:findBy + 屬性名
Person getByLastName(String lastName);
// 更多範例:
// List<Person> findByEmailLike(String emailPattern);
// Page<Person> findAll(Pageable pageable);
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDataTest {
@Autowired PersonRepository personRepository;
@Test
public void testGetByLastName() {
Person p = personRepository.getByLastName("AA");
System.out.println(p);
}
}
slf4j-api 與實作 (如 logback-classic)。hibernate.hbm2ddl.auto=update 且 Entity 掃描路徑正確。findBy、getBy、queryBy + 屬性名 (駝峰);支援 And/Or、Like/Between 等關鍵字。本教學參考「尚硅谷 JPA 教學視頻」,視頻下載:百度網盤。建議後續學習:自定義 @Query、Specification 動態查詢、審計、多租戶等進階特性。