4.2 JPA的环境搭建和入门案例

导入jar包,jpa和hibernate required
image.png
新建文件夹和xml文件
4.2 JPA的环境搭建和入门案例_第1张图片
image.png
引用的库下找到xsd文件
4.2 JPA的环境搭建和入门案例_第2张图片
image.png

XML文件配置


  
  

将提示信息导入


4.2 JPA的环境搭建和入门案例_第3张图片
image.png

4.2 JPA的环境搭建和入门案例_第4张图片
image.png

主配置persistence.xml


  
  
    
    
        
        org.hibernate.jpa.HibernatePersistenceProvider
        
        com.itheima.domain.Customer
        
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
    

数据库新建数据库

4.2 JPA的环境搭建和入门案例_第5张图片
image.png

创建工具类

JPAUtils.java

package com.itheima.utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/*
 * JPA工具类
 * */
public class JPAUtil {
    //就相当于SessionFactory
    private static EntityManagerFactory factory;

    static {
        //到配置文件中找
        factory = Persistence.createEntityManagerFactory("myJPAUnit");
    }
    
    /*
     * 获取JPA操作数据库的对象
     * */
    public static EntityManager createEntityManager() {
        return factory.createEntityManager();
    }
    
    public static void main(String[] args) {
        createEntityManager();
    }
}

运行生成表

增删改查

package com.itheima.test;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;

import org.junit.Test;

import com.itheima.domain.Customer;
import com.itheima.utils.JPAUtil;

/*
 * JPA的入门案例
 *      JPA单表操作数据库
 * 
 * */

public class JPADemo1 {
    //保存
    @Test
    public void test1() {
        //创建客户对象
        Customer c = new Customer();
        c.setCustName("JPA haha");
        
        //获取EntityManager对象
        EntityManager em = JPAUtil.createEntityManager();
        
        //获取事务对象,并开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        
        //执行保存操作
        em.persist(c);
        
        //提交事务
        tx.commit();
        
        //关闭资源
        em.close();
        
    }
    
    //查询一个实体
    @Test
    public void test2() {
        
        //获取EntityManager对象
        EntityManager em = JPAUtil.createEntityManager();
        
        //获取事务对象,并开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        
        //执行更新操作(需要把更新的对象先查询出来)
        Customer c = em.find(Customer.class, 1L);
        System.out.println(c);
        
        //提交事务
        tx.commit();
        
        //关闭资源
        em.close();
        
    }
    

//查询一个实体,延迟加载
        @Test
        public void test2_1() {
            
            //获取EntityManager对象
            EntityManager em = JPAUtil.createEntityManager();
            
            //获取事务对象,并开启事务
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            
            //执行更新操作(需要把更新的对象先查询出来)
            Customer c = em.getReference(Customer.class, 1L);
            System.out.println(c);
            
            //提交事务
            tx.commit();
            
            //关闭资源
            em.close();
            
        }

    
    //查询一个实体
        @Test
        public void test3() {
            
            //获取EntityManager对象
            EntityManager em = JPAUtil.createEntityManager();
            
            //获取事务对象,并开启事务
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            
            //执行更新操作(需要把更新的对象先查询出来)
            Customer c = em.find(Customer.class, 1L);
            System.out.println(c);
            
            //修改客户地址为:顺义区
            c.setCustAddress("顺义区");
            
            //提交事务
            tx.commit();
            
            //关闭资源
            em.close();
            
        }
        
        //更新的另一种操作方式
        //merge合并(两个实体合并)
        @Test
        public void test4() {
            
            //获取EntityManager对象
            EntityManager em = JPAUtil.createEntityManager();
            
            //获取事务对象,并开启事务
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            
            //执行更新操作(需要把更新的对象先查询出来)
            Customer c = em.find(Customer.class, 1L);
            
            //修改客户地址为:顺义区
            c.setCustAddress("北京市顺义区");
            em.merge(c);
            
            //提交事务
            tx.commit();
            
            //关闭资源
            em.close();
            
        }
        
    //删除操作
        @Test
        public void test5() {
            
            //获取EntityManager对象
            EntityManager em = JPAUtil.createEntityManager();
            
            //获取事务对象,并开启事务
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            
            //执行更新操作(需要把更新的对象先查询出来)
            Customer c = em.find(Customer.class, 1L);
            
            //删除
            em.remove(c);
            
            //提交事务
            tx.commit();
            
            //关闭资源
            em.close();
            
        }
        
        
        //查询所有
        /*
         * 涉及的对象:
         *      JPA的Query
         * 用EntityManager的createQuery(String jpql)
         *参数含义:
         *  JQPL:Java Persistence Query Language
         *  写法和HQL很相似,也是把表明换成类名,把字段名换成属性名称
         *  它在写查询所有时,不能直接用
         *  from 实体类
         *  需要select使用关键字
         *      select c from Customer c
         * */
                @Test
                public void test6() {
                    
                    //获取EntityManager对象
                    EntityManager em = JPAUtil.createEntityManager();
                    
                    //获取事务对象,并开启事务
                    EntityTransaction tx = em.getTransaction();
                    tx.begin();
                    
                    //执行更新操作(需要把更新的对象先查询出来)
                    Query query = em.createQuery("select c from Customer c where custName like ? and custLevel = ?");
                    
                    //给占位符赋值
                    query.setParameter(1, "%集%");
                    query.setParameter(2, "23");
                    
                    //执行方法获取结果集
                    List list = query.getResultList();
                    for(Object o : list) {
                        System.out.println(o);
                    }
                    
                    //提交事务
                    tx.commit();
                    
                    //关闭资源
                    em.close();
                    
                }
    
    
}

merge方法的实际作用

package com.itheima.domain;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.itheima.utils.HibernateUtils;

/*
 * 演示hibernate的update方法的问题
 * */

public class HibernateDemo7 {
    /*
     * 查询id为1的客户
     * 关闭session(清空一级缓存和快照)
     * 修改id为1的客户名称为 hahaha
     * 再次获取session
     * 再次查询id为1的客户
     * 更新刚才修改的客户
     * 
     * */
    @Test
    public void test1() {
        Session s = HibernateUtils.openSession();
        Transaction tx = s.beginTransaction();
        
        Customer c = s.get(Customer.class, 1L);
        
        tx.commit();
        s.close();//关闭
        
        c.setCustName("hahaha");//托管态
        
        Session s1 = HibernateUtils.openSession();
        Transaction tx1 = s1.beginTransaction();
        //再次查询
        Customer c1 = s.get(Customer.class, 1L);//持久态
        //更新修改对象
        //s1.update(c);//把托管态转换成持久态
        
//      只能用merge
        s1.merge(c);
        tx1.commit();
        s1.close();
        
    }
}

当我们更改托管态的值时,update就会出错,出现两个OID一样,值却不一样的数据,只能用merge

你可能感兴趣的:(4.2 JPA的环境搭建和入门案例)