1.導入依賴 hibernate 這個依賴自帶實現JPA接口
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.4.32.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency></dependencies>
2.在resources目錄下建立 META-INF文件夾 ,創建JPA? ?persistence.xml配置文件
?persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"><!-- 需要配置persistence-unit 節點持久化單元:name: 持久化單元名稱 可隨時切換, 若是OpenJPA的實現方式就 換成 OpenJPA 就可以了transaction-type: 事務管理方式JTA:分布式事務管理RESOURCE_LOCAL:本地事務管理--><persistence-unit name="hibernateJPA" transaction-type="RESOURCE_LOCAL"><!--JPA 的 實現方式 順序別搞錯,要放在class上面 --><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><!--需要進行ORM 的POJO類 --><class>com.kuang.pojo.Customer</class><!-- 可選配置 :配置 JPA 實現方 的 配置信息 --><properties><!-- 數據庫信息用戶名 , javax.persistence.jdbc.user密碼 , javax.persistence.jdbc.password驅動 , javax.persistence.jdbc.driver數據庫地址 , javax.persistence.jdbc.url--><property name="javax.persistence.jdbc.user" value="root"/><property name="javax.persistence.jdbc.password" value="2001"/><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/><property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/springdata_jpa?useUnicode=true&useSSL=false&characterEncoding=UTF-8"/><!-- 配置JPA實現方 (hibernate) 的配置信息顯示sql : false|true自動創建數據庫表: hibernate.hbm2ddl.autocreate: 程序運行時創建數據庫表(如果有表,先刪除在創建)update: 程序運行時創建表(如果有表,不會創建表)none: 不會創建表--><property name="hibernate.show_sql" value="true"/><property name="hibernate.hbm2ddl.auto" value="update"/><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL57InnoDBDialect"/></properties></persistence-unit></persistence>
3.創建測試類
package com.kuang.test;import com.kuang.pojo.Customer;
import org.junit.Before;
import org.junit.Test;import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.xml.soap.SAAJMetaFactory;public class JpaTest {private EntityManagerFactory factory;@Beforepublic void before() {//EntityManagerFactory 創建工廠 對應 sqlSessionFactory 用來創建 entityManagerfactory = Persistence.createEntityManagerFactory("hibernateJPA");}@Testpublic void insert() {//其實底層實現還是hibernate// entityManager 相當于 sqlSession 代碼與數據庫之間的橋梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//獲取事務對象transaction.begin();//事務開啟Customer customer = new Customer();customer.setCustName("劉備");customer.setCustAddress("錦州");entityManager.persist(customer);transaction.commit();//事務提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事務回滾} finally {if (entityManager!=null){entityManager.close();//關閉連接}}}@Testpublic void select() {//其實底層實現還是hibernate// entityManager 相當于 sqlSession 代碼與數據庫之間的橋梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//獲取事務對象transaction.begin();//事務開啟Customer customer = entityManager.find(Customer.class, 1L);
// Customer customer = entityManager.getReference(Customer.class, 1L);//延遲查詢
// System.out.println("=======");System.out.println(customer);transaction.commit();//事務提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事務回滾} finally {if (entityManager!=null){entityManager.close();//關閉連接}}}@Testpublic void update() {//其實底層實現還是hibernate// entityManager 相當于 sqlSession 代碼與數據庫之間的橋梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//獲取事務對象transaction.begin();//事務開啟Customer customer = new Customer();customer.setCustId(9L);customer.setCustName("lzl");customer.setCustAddress("為魯斯");/*** 如果指定了主鍵:* 更新 :1. 先查詢 看是否有變化* *如果有變化 更新 如果沒有變化 就不更新* 如果沒有指定主鍵:* 插入:*///存在即修改, 不存在就添加//注意: 修改是覆蓋操作,你沒給的值,就全給你覆蓋為null// 如果你不想讓他查一遍,你可以自己寫JPQL語句進行添加或者修改Customer merge = entityManager.merge(customer);transaction.commit();//事務提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事務回滾} finally {if (entityManager!=null){entityManager.close();//關閉連接}}}@Testpublic void update_JPQL() {//其實底層實現還是hibernate// entityManager 相當于 sqlSession 代碼與數據庫之間的橋梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//獲取事務對象transaction.begin();//事務開啟String jpql="update Customer set custName=:custName , custAddress=:custAddress where custId=:id";entityManager.createQuery(jpql).setParameter("custName","張杰").setParameter("custAddress","廣東").setParameter("id",3L).executeUpdate();transaction.commit();//事務提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事務回滾} finally {if (entityManager!=null){entityManager.close();//關閉連接}}}@Testpublic void test_SQL() {//其實底層實現還是hibernate// entityManager 相當于 sqlSession 代碼與數據庫之間的橋梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//獲取事務對象transaction.begin();//事務開啟String sql="update tb_customer set cust_name=:custName , cust_address=:custAddress where cust_id=:id";entityManager.createNativeQuery(sql).setParameter("custName","謝娜").setParameter("custAddress","湖南").setParameter("id",3L).executeUpdate();transaction.commit();//事務提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事務回滾} finally {if (entityManager!=null){entityManager.close();//關閉連接}}}@Testpublic void delete() {//其實底層實現還是hibernate// entityManager 相當于 sqlSession 代碼與數據庫之間的橋梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//獲取事務對象transaction.begin();//事務開啟Customer customer = entityManager.find(Customer.class, 3L);entityManager.remove(customer);// 這樣刪除,是刪除游離狀態的,會拋異常不允許這樣操作 IllegalArgumentException: Removing a detached instance com.kuang.pojo.Customer#3transaction.commit();//事務提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事務回滾} finally {if (entityManager!=null){entityManager.close();//關閉連接}}}@Testpublic void template() {//其實底層實現還是hibernate// entityManager 相當于 sqlSession 代碼與數據庫之間的橋梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//獲取事務對象transaction.begin();//事務開啟transaction.commit();//事務提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事務回滾} finally {if (entityManager!=null){entityManager.close();//關閉連接}}}
}