Spring-JPA,帶一小例子

一、JPA簡介:

       JPA全稱Java Persistence API。JPA通過JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。

 

二、這裏用OpenJPA 2.0 和Spring 3.0作爲例子

 

三、搭建Spring 和 JPA的框架步驟

1.搭建Spring3.0框架,然後Finish。

 

2.然後搭建JPA框架,這裏選用OpenJPA2.0版本


 

Next

 

選上所鏈接的數據庫,還有數據庫驅動,這裏用的是Oracle數據庫。接着Finish

 

 

四、框架搭建完成後,映射實體類

1.當框架搭建完之後,會在src目錄下發現一個新建的文件夾和文件


 

2.映射實體,選擇JPA的反向工程


 

勾上以下選項,會自動生成接口類,實現類,和工具類。接着Next就行了,和Hibernate的差不多。

 

 

五、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:p="http://www.springframework.org/schema/p"
	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.xsd"
	xmlns:tx="http://www.springframework.org/schema/tx">


	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="E276-JPA" />
	</bean>
	
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>

	<!-- dao -->
	<bean id="employeeDao" class="org.e276.dao.impl.EmployeeDAO">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	
	<!-- 註解式事務的配置 -->
	<tx:annotation-driven transaction-manager="transactionManager" />
	
</beans>

 

 

七、測試類

package org.e276.test;

import java.util.Date;
import java.util.List;
import org.e276.dao.IEmployeeDAO;
import org.e276.entity.Department;
import org.e276.entity.Employee;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 注意這裏的寫法Spring 3.0不同
		IEmployeeDAO employeeDao = context.getBean(IEmployeeDAO.class);
		// 查詢所有的員工
		List<Employee> employees = employeeDao.findAll();
		for (Employee employee : employees) {
			System.out.println("姓名:" + employee.getName() + ",性別:" + employee.getSex());
		}
		
		//添加新的員工
		Employee employee = new Employee(null, new Department((short) 5), "小屁孩", true, 1438d, new Date());
		employeeDao.save(employee);
	}

}

 

 

八、又或者添加單元測試框架來測試

package org.e276.test;

import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import org.e276.entity.Department;
import org.e276.entity.Employee;
import org.e276.util.EntityManagerHelper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class TestEmployee {

	// 得到EntityManager對象
	EntityManager manager = null;

	@Before
	public void setUp() throws Exception {
		manager = EntityManagerHelper.getEntityManager();
		// 開始事務
		EntityManagerHelper.beginTransaction();
	}

	@After
	public void tearDown() throws Exception {
		// 提交事務
		EntityManagerHelper.commit();
		EntityManagerHelper.closeEntityManager();
	}

	public void saveEmployee() {
		Department department = new Department((short) 2);
		// 因爲主鍵是通過序列產生,所以一定要設置成null
		Employee employee = new Employee(null, department, "李培翔", true, 4500d, new Date());
		manager.persist(employee);
		System.out.println(employee.getName() + "添加成功!");
	}

	public void findEmployee() {
		Employee employee = manager.find(Employee.class, 1004);
		System.out.println("找到一隻小夥伴:" + employee.getName());
	}

	public void deleteEmployee() {
		Employee employee = manager.find(Employee.class, 1005);
		manager.remove(employee);
		System.out.println("含淚忍痛刪掉一小夥伴,他名字是:" + employee.getName());
	}

	public void updateEmployee() {
		Employee employee = manager.find(Employee.class, 1);
		employee.setSalary(15000d);
		manager.merge(employee);
	}

	/**
	 * 查詢某部門的員工人數
	 */
	public void findDepartmentCount() {
		// JPA-QL不支持*號
		Long count = (Long) manager
				.createQuery("select count(e) from Employee e where e.department.name=:name")
				.setParameter("name", "生產部").getSingleResult();
		System.out.println("生產部的人數是:" + count);
	}

	/**
	 * 查詢某個部門的所有員工
	 */
	@Test
	@SuppressWarnings("unchecked")
	public void findEmployeeByDepartment() {
		List<Employee> list = manager
				.createQuery("select e from Employee e where e.department.name=:name")
				.setParameter("name", "生產部").getResultList();
		for (Employee employee : list) {
			System.out.println(employee.getName() + "工資:" + employee.getSalary());
		}
	}
}

 

 

九、demo

E276-JPA.zip

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章