个性化阅读
专注于IT技术分析

Spring Data JPA教程入门介绍

Spring Data JPA API提供了JpaTemplate类以将spring应用程序与JPA集成。

JPA(Java持久性API)是用于在企业应用程序中持久存储对象的sun规范。当前, 它用作复杂实体bean的替代品。

许多供应商提供了JPA规范的实现, 例如:

  • Hibernate
  • Toplink
  • iBatis
  • OpenJPA等

Spring JpaTemplate的优势

你无需编写前后代码即可持久, 更新, 删除或搜索对象, 例如创建Persistence实例, 创建EntityManagerFactory实例, 创建EntityTransaction实例, 创建EntityManager实例, 提交EntityTransaction实例以及关闭EntityManager。

因此, 它节省了大量代码。


在此示例中, 我们将使用Hibernate模式来实现JPA。


Spring和JPA集成的示例

让我们看一下将Spring应用程序与JPA集成的简单步骤:

  1. 创建Account.java文件
  2. 创建Account.xml文件
  3. 创建AccountDao.java文件
  4. 创建persistence.xml文件
  5. 创建applicationContext.xml文件
  6. 创建AccountsClient.java文件

在这个示例中, 我们将把Hibernate应用程序与spring集成在一起。让我们看看带有Spring的jpa示例的目录结构。

具有目录结构的Spring JPA示例

1) Account.java

这是一个简单的POJO类。

package com.srcmini;

public class Account {
	private int accountNumber;
	private String owner;
	private double balance;
        //no-arg and parameterized constructor
        //getters and setters
}

2)Account.xml

该映射文件包含持久类的所有信息。

<entity-mappings version="1.0" 
		xmlns="http://java.sun.com/xml/ns/persistence/orm" 
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
		http://java.sun.com/xml/ns/persistence/orm_1_0.xsd ">
	
	<entity class="com.srcmini.Account">
		<table name="account100"></table>
		<attributes>
			<id name="accountNumber">
				<column name="accountnumber"/>
			</id>
			<basic name="owner">
				<column name="owner"/>
			</basic>
			<basic name="balance">
				<column name="balance"/>
			</basic>
		</attributes>
	</entity>
</entity-mappings>

3) AccountDao.java

package com.srcmini;
import java.util.List;
import org.springframework.orm.jpa.JpaTemplate;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public class AccountsDao{
	JpaTemplate template;

	public void setTemplate(JpaTemplate template) {
		this.template = template;
	}
	public void createAccount(int accountNumber, String owner, double balance){
		Account account = new Account(accountNumber, owner, balance);
		template.persist(account);
	}
	public void updateBalance(int accountNumber, double newBalance){
		Account account = template.find(Account.class, accountNumber);
		if(account != null){
			account.setBalance(newBalance);
		}
		template.merge(account);
	}
	public void deleteAccount(int accountNumber){
		Account account = template.find(Account.class, accountNumber);
		if(account != null)
			template.remove(account);
	}
	public List<Account> getAllAccounts(){
		List<Account> accounts =template.find("select acc from Account acc");
		return accounts;
	}
}

4)persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
    
	<persistence-unit name="ForAccountsDB">
		<mapping-file>com/srcmini/Account.xml</mapping-file>
		<class>com.srcmini.Account</class>
	</persistence-unit>
</persistence>

5)applicationContext.xml

<?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:tx="http://www.springframework.org/schema/tx" 
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	
 	 <tx:annotation-driven transaction-manager="jpaTxnManagerBean" proxy-target-class="true"/>
	
	 <bean id="dataSourceBean" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
		<property name="username" value="system"></property>
		<property name="password" value="oracle"></property>
	</bean>
	 	 
 	  <bean id="hbAdapterBean" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
	 	<property name="showSql" value="true"></property>
	 	<property name="generateDdl" value="true"></property>
	 	<property name="databasePlatform" value="org.hibernate.dialect.OracleDialect"></property>
	 </bean>
	
	<bean id="emfBean" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	 	<property name="dataSource" ref="dataSourceBean"></property>
	 	<property name="jpaVendorAdapter" ref="hbAdapterBean"></property>
	 </bean>
	 
	 <bean id="jpaTemplateBean" class="org.springframework.orm.jpa.JpaTemplate">
 	 	<property name="entityManagerFactory" ref="emfBean"></property>
 	 </bean>
 	 
 	 <bean id="accountsDaoBean" class="com.srcmini.AccountsDao">
 	 	<property name="template" ref="jpaTemplateBean"></property>
 	 </bean>
 	  <bean id="jpaTxnManagerBean" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="emfBean"></property>
	</bean>
 	 	
</beans>

generateDdl属性将自动创建表。

showSql属性将在控制台上显示sql查询。


6) Accountsclient.java

package com.srcmini;

import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class AccountsClient{
public static void main(String[] args){
 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
 AccountsDao accountsDao = context.getBean("accountsDaoBean", AccountsDao.class);
		
 accountsDao.createAccount(15, "Jai Kumar", 41000);
 accountsDao.createAccount(20, "Rishi ", 35000);
 System.out.println("Accounts created");
		
 //accountsDao.updateBalance(20, 50000);
 //System.out.println("Account balance updated");
		
		
 /*List<Account> accounts = accountsDao.getAllAccounts();
 for (int i = 0; i < accounts.size(); i++) {
   Account acc = accounts.get(i);
   System.out.println(acc.getAccountNumber() + " : " + acc.getOwner() + " (" + acc.getBalance() + ")");
 }*/
		
  //accountsDao.deleteAccount(111);
  //System.out.println("Account deleted");
		
 }
}

输出

Hibernate: insert into account100 (balance, owner, accountnumber) values (?, ?, ?)
Hibernate: insert into account100 (balance, owner, accountnumber) values (?, ?, ?)
Accounts created

下载此示例(使用Myeclipse IDE开发)

赞(0)
未经允许不得转载:srcmini » Spring Data JPA教程入门介绍

评论 抢沙发

评论前必须登录!