这次讲的JPA前一篇文章都有所介绍,这里呢就是结合hibernate.cfg.xml来讲讲,怎么用JPA进行CURD操作,类似于Hibernate的session进行CURD操作
hibernate.cfg.xml
- <span style="font-size: large;"><?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></span>
JPA使用要求SRC的META-INF下要有persistence.xml
- <span style="font-size: large;"><?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></span>
Hibernate这里用到的实体类映射是采用的是注解方式,其实就是JPA的注解
User.java
- <span style="font-size: large;">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;
- }
- }
- </span>
UserDao.java
- <span style="font-size: large;">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();
- }
- }
- </span>
PageModel.java
- <span style="font-size: large;">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;
- }
- }
- </span>
JPAUtil.java
- <span style="font-size: large;">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();
- }
- }
- </span>
测试代码
- <span style="font-size: large;">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);
- }
- }
- }
- </span>
根据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