这次讲的JPA前一篇文章都有所介绍,这里呢就是结合hibernate.cfg.xml来讲讲,怎么用JPA进行CURD操作,类似于Hibernate的session进行CURD操作
hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///test</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.isolation">2</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="format_sql">true</property>
<!-- mapping类声明-->
<mapping class="com.javacrazyer.domain.User" />
</session-factory>
</hibernate-configuration>
JPA使用要求SRC的META-INF下要有persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- example of a default persistence.xml -->
<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="xkkjpa">
<properties>
<property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml" />
</properties>
</persistence-unit>
</persistence>
Hibernate这里用到的实体类映射是采用的是注解方式,其实就是JPA的注解
User.java
package com.javacrazyer.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String pwd;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String toString(){
return "id=" + id + ",name=" + name + ",pwd=" + pwd;
}
}
UserDao.java
package com.javacrazyer.dao;
import java.util.List;
import javax.persistence.EntityManager;
import com.javacrazyer.common.JPAUtil;
import com.javacrazyer.domain.PageModel;
import com.javacrazyer.domain.User;
public class UserDao {
public void add(User user){
EntityManager em = JPAUtil.getEntityManager();
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();
em.close();
}
@SuppressWarnings("unchecked")
public List<User> findAll(){
EntityManager em = JPAUtil.getEntityManager();
em.getTransaction().begin();
//JPAQL
List<User> users = em.createQuery("from User").getResultList();
em.getTransaction().commit();
em.close();
return users;
}
@SuppressWarnings("unchecked")
public PageModel<User> findByPager(int pageNo, int pageSize){
PageModel<User> pm = new PageModel<User>();
EntityManager em = JPAUtil.getEntityManager();
em.getTransaction().begin();
Long count = (Long)em.createQuery("select count(o) from User o").getSingleResult();
if(count != null){
List<User> users = em.createQuery("from User")
.setFirstResult((pageNo - 1) * pageSize)
.setMaxResults(pageSize)
.getResultList();
pm.setRecordCount(count.intValue());
pm.setDatas(users);
}
em.getTransaction().commit();
em.close();
return pm;
}
public User findById(Long id){
EntityManager em = JPAUtil.getEntityManager();
em.getTransaction().begin();
//User user = em.find(User.class, id); //相当于Hibernate的get()方法
User user = em.getReference(User.class, id); //相当于Hibernate的load()方法
em.getTransaction().commit();
em.close();
return user;
}
public void update(User user){
EntityManager em = JPAUtil.getEntityManager();
em.getTransaction().begin();
user = em.merge(user);
em.getTransaction().commit();
em.close();
}
public void delete(User user){
EntityManager em = JPAUtil.getEntityManager();
em.getTransaction().begin();
em.remove(user);
em.getTransaction().commit();
em.close();
}
}
PageModel.java
package com.javacrazyer.domain;
import java.util.List;
/**
* 分页组件(包含当前页结果数据列表和总记录数)
* 注意,它不是持久化实体类
*
*/
public class PageModel<T> {
private int recordCount;
private List<T> datas;
public int getRecordCount() {
return recordCount;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
public List<T> getDatas() {
return datas;
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
}
JPAUtil.java
package com.javacrazyer.common;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class JPAUtil {
private static EntityManagerFactory factory;
static {
//加载src/META-INF/PERSISTENTCE.XML ,根据配置文件中的键加载
factory = Persistence.createEntityManagerFactory("xkkjpa");
}
private JPAUtil() {}
public static EntityManager getEntityManager() {
return factory.createEntityManager();
}
}
测试代码
package com.javacrazyer.dao.test;
import org.junit.Assert;
import org.junit.Test;
import com.javacrazyer.dao.UserDao;
import com.javacrazyer.domain.PageModel;
import com.javacrazyer.domain.User;
public class UserDaoTest {
private UserDao dao = new UserDao();
@Test
public void testAdd(){
User user = new User();
user.setName("xxxx");
user.setPwd("12345678790");
dao.add(user);
Assert.assertNotNull(user.getId());
}
@Test
public void testFindByPager(){
PageModel<User> pm = dao.findByPager(2, 1);
for(User user : pm.getDatas()){
System.out.println(user);
}
}
}
根据JPA对实体类进行CRUD的操作特点与Hibernate的处理方式做下对比
Hibernate处理方式为:通过SessionFactory获得session,然后通过session的各种方法进行CURD操作
JPA的处理方式为:通过EntityManagerFactory获得entityManager,然后通过entityManager的各种方法进行CURD
Hibernate是SessionFacotory sessionFactory=config.buidSessionFacotory()
JPA是EntityManagerFactory entityManagerFactory=Persistence.createEntityManagerFactory("xkkjpa");
hibernate是Session session=sessionFactory.openSesion()
JPA是EntityManager entityManager=factory.createEntityManager()
session的增删改查为save,delete,update,merge,createQuery()
entityManager的增删改为persist,remove,merge,createQuery