引言
在 hibernate 中,有三种方式来实现crud。
- hibernate api+ hbm.xml(xml配置文件)
- hibernate api+Annotation Mappings(注解)
- Java persistence API ( jpa )
熟悉hibernate的同学都知道,前两种是用的比较多的。jpa呢在spring data 中也用过,但是原生的jpa这套api本人还没有用过。所以今天趁机来玩一玩,应该对学spring data jpa有些帮助。
什么是JPA
JPA是Java Persistence API的简称,早期有很多orm框架,这些框架各自为王,自己都有自己标准,因此sun为了统一orm框架,因此提出了这套规范,很明显hibernate就实现了这套规范。
环境搭建
导入jar包
特别注意的是 hibernate-entitymanager-5.0.7.Final.jar,一定要导。在jpa文件下面。
新建persistence.xml
这里需要注意的,此文件必须放在META-INF包下,比如:
至于为什么嘛,乌龟的屁股,规定啊。
编写 Persistence .xml
<persistence xmlns="" xmlns:xsi="" xsi:schemaLocation=" " version="2.0"> <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL"> <!-- 配置jpa ORM产品 --> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <!-- 添加对应的持久化类 --> <class>com.javazzh.hibernate.demo1.CstCustomer</class> <properties> <!-- 数据源 --> <property name=" javax .persistence. jdbc .driver" value="com. mysql .jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/hibernate_jpa" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="root"/> <!-- hibernate特殊属性 --> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> </properties> </persistence-unit> </persistence>
创建持久化类
import javax.persistence.*; @Entity @Table(name="cst_customer") public class Customer { @Id @Column(name = "cust_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long custId; @Column(name = "cust_name") private String custName; @Column(name = "cust_user_id") private Long custUserId; @Column(name = "cust_create_Id") private Long custCreateId; @Column(name = "cust_source") private String custSource; @Column(name = "cust_industry") private String custIndustry; @Column(name = "cust_level") private String custLevel; @Column(name = "cust_linkman") private String custLinkman; @Column(name = "cust_phone") private String custPhone; @Column(name = "cust_mobile") private String custMobile; 省略getter/setter... }
api使用
保存
查询单个对象
修改
删除
查询列表
这里的 from Customer 看上去和hql一样,但是实际上叫做 jpql,哈哈 换汤不换药。
分页查询
代码如下:
/** * 保存客户 */ @Test public void test0(){ /*1.获取实体管理工厂*/ EntityManagerFactory factory = Persistence. createEntityManagerFactory("jpa"); /*2.获取实体管理*/ EntityManager entityManager = factory.createEntityManager(); /*3.获取事务对象*/ EntityTransaction transaction = entityManager.getTransaction(); /*4.开启事务*/ transaction.begin(); Customer customer = new Customer(); customer.setCustName("学友"); customer.setCustLevel("王者"); /*5.操作*/ entityManager.persist(customer); /*6.提交事务*/ transaction. commit (); /*7.关闭实体管理*/ entityManager. close (); } /** * 根据id查询客户 */ @Test public void test1(){ /*1.获取实体管理工厂*/ EntityManagerFactory factory = Persistence. createEntityManagerFactory("jpa"); /*2.获取实体管理*/ EntityManager entityManager = factory.createEntityManager(); /*3.获取事务对象*/ EntityTransaction transaction = entityManager.getTransaction(); /*4.开启事务*/ transaction.begin(); /*5.操作*/ // find == session.get //Customer customer = entityManager.find(Customer.class, 2L); //getReference == session.load Customer customer = entityManager.getReference(Customer.class, 2L); System.out.println(customer.getCustName()); /*6.提交事务*/ transaction.commit(); /*7.关闭实体管理*/ entityManager.close(); } /** * 修改客户 */ @Test public void test2(){ /*1.获取实体管理工厂*/ EntityManagerFactory factory = Persistence. createEntityManagerFactory("jpa"); /*2.获取实体管理*/ EntityManager entityManager = factory.createEntityManager(); /*3.获取事务对象*/ EntityTransaction transaction = entityManager.getTransaction(); /*4.开启事务*/ transaction.begin(); /*5.操作*/ Customer customer = entityManager.find(Customer.class, 2L); customer.setCustName("学友"); entityManager.persist(customer); /*6.提交事务*/ transaction.commit(); /*7.关闭实体管理*/ entityManager.close(); } /** * 删除客户 */ @Test public void test3(){ /*1.获取实体管理工厂*/ EntityManagerFactory factory = Persistence. createEntityManagerFactory("jpa"); /*2.获取实体管理*/ EntityManager entityManager = factory.createEntityManager(); /*3.获取事务对象*/ EntityTransaction transaction = entityManager.getTransaction(); /*4.开启事务*/ transaction.begin(); /*5.操作*/ Customer customer = entityManager.find(Customer.class, 2L); entityManager.remove(customer); /*6.提交事务*/ transaction.commit(); /*7.关闭实体管理*/ entityManager.close(); } /** * 查询列表 */ @Test public void test4(){ /*1.获取实体管理工厂*/ EntityManagerFactory factory = Persistence. createEntityManagerFactory("jpa"); /*2.获取实体管理*/ EntityManager entityManager = factory.createEntityManager(); /*3.获取事务对象*/ EntityTransaction transaction = entityManager.getTransaction(); /*4.开启事务*/ transaction.begin(); /*5.操作*/ List<Customer> list = entityManager.createQuery("from Customer", Customer.class).getResultList(); list.forEach(customer -> System.out.println(customer.getCustName())); /*6.提交事务*/ transaction.commit(); /*7.关闭实体管理*/ entityManager.close(); } /** * 查询分页列表 */ @Test public void test5(){ /*1.获取实体管理工厂*/ EntityManagerFactory factory = Persistence. createEntityManagerFactory("jpa"); /*2.获取实体管理*/ EntityManager entityManager = factory.createEntityManager(); /*3.获取事务对象*/ EntityTransaction transaction = entityManager.getTransaction(); /*4.开启事务*/ transaction.begin(); /*5.操作*/ List<Customer> list = entityManager.createQuery("from Customer", Customer.class) .setFirstResult(0) .setMaxResults(2) .getResultList(); list.forEach(customer -> System.out.println(customer.getCustName())); /*6.提交事务*/ transaction.commit(); /*7.关闭实体管理*/ entityManager.close(); }
总结
头条中,贴代码简直就是人间地狱啊,不过这既然是总结,为了方便后面用的着,除了图片外,还是把代码贴上。
以上就是jpa api的基本用法。整体的思路和hibernate 同出一辙,懂hibernate api就自然懂jpa api。