更多JPA开发在框架开发
1 什么是JPA开发?
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 —–百度百科
Hibernate技术出现后,各种ORM模型相继出现,为了同一的规范,创造Hibernate的团队规定了ORM的一套规范,也就是JPA 。
Hibernate中有JPA的规范和实现,所以JPA的资源包同Hibernate的资源包是一样的,在Hibernate官网中下载,本文用的是 。
2 单表(user)案例入门JPA开发
Hibernate中有JPA的规范和实现,所以JPA的资源包同Hibernate的资源包是一样的,在Hibernate官网中下载,本文用的是
hibernate-release-5.2.17.Final
。
2.1 JPA 环境
hibernate 相关: hibernate-release-5.2.17.Final/lib/required
下的所有jar包
jpa 相关 : hibernate-release-5.2.17.Final/lib/jpa-metamodel-generator
下的一个jar包
数据库相关: mysql包(自行下载)和c3p0(hibernate-release-5.2.17.Final/lib/optional/c3p0
下的所有jar包)
日志jar包 : log4j 、slf4j(自行下载)
创建数据库: create database db_jpa ;
2.1 persistence.xml
src下创建名字为META-INF
的文件夹,文件夹下创建persistence.xml
文件(位置名字都是固定的)。
<?xml version="1.0" encoding="UTF-8"?>
<!--
persistence标签中的属性和属性值可在hibernate-jpamodelgen-5.2.17.Final.jar\persistence_2.1.xsd
中找到
-->
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<!-- 配置持久化单元,可以配置多个,名称不能重复
transaction-type是事务类型:JTA ,RESOURCE_LOCAL是本地事务
-->
<persistence-unit name="JPAUnit01" transaction-type="RESOURCE_LOCAL">
<!-- 连接数据相关 -->
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql:///db_jpa?useSSL=false"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<property name="hibernate.show_sql" value="true"/>
<!-- <property name="hibernate.format_sql" value="true"/> -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<!-- c3p0数据库连接池 -->
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
</properties>
</persistence-unit>
</persistence>
2.2 实体类注解
package edu.kmust.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* 用户实体类 单表
* @author zhaoyuqiang
*
*/
@Entity //表明该类是一个实体类
@Table(name="tb_user") //建立当前实体类与数据库表的关系
public class User {
@Id //表明当前属性是主键
@Column(name="user_id") //属性对应表字段的名字
//主键增长策略。 generator属性可以使用hibernate的生成策略,如(uuid和native),而strategy是jsp中提供的生成策略
@GeneratedValue(strategy=GenerationType.IDENTITY) //主键增长策略。
private Integer userId ;
@Column(name="user_name")
private String userName ;
//此处省略getter和setter方法
}
2.3 JPAUntils
package edu.kmust.units;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class JPAUnit {
private static EntityManagerFactory factory ;
static {
//相当于hibernate中的SessionFactory
factory = Persistence.createEntityManagerFactory("JPAUnit01");
}
/**
* 获取JPA操作数据库的对象
* @return
*/
public static EntityManager createEntityManager() {
return factory.createEntityManager();
}
}
2.4 添加、删除与修改
/**
* 添加
*/
@Test
public void add() {
EntityManager em = JPAUnit.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
User user = new User();
user.setUserName("赵玉强");
em.persist(user);
tx.commit();
} catch (Exception e) {
tx.rollback();
}finally {
em.close();
}
}
/**
* 根据id查询,然后更改
* find()相当于hibernate中的get(),属于立即查询
* getReference()相当于hibernate中的load(),属于延迟查询
*
*/
@Test
public void update() {
EntityManager em = JPAUnit.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
User user = em.find(User.class, 4);
user.setUserName("于鲲"); //这一步就已经更新了,之后的merge()可以不用写
em.merge(user);//合并的意思,是JPA中的更改方法。
tx.commit();
em.close();
}
/**
* 根据id查询,然后删除
*/
@Test
public void del() {
EntityManager em = JPAUnit.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
User user = em.find(User.class,1);
em.remove(user);
tx.commit();
em.close();
}
2.5 查询
/**
* 详细查询
* 和hibernate的HQL方式类似,不能省略select
*/
@Test
public void query() {
EntityManager em = JPAUnit.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
/**
* 查询所有
* javax.persistence.Query;
*/
/*Query query = em.createQuery("select u from User u");
List<User> userList = query.getResultList();*/
/**
* 条件查询
* 占位符是从0开始的,根据hibernate版本不同,可能有从1开始的版本
*/
/*Query query = em.createQuery("select u from User u where userName like ?");
query.setParameter(0, "%婷");
List<User> userList = query.getResultList();*/
/**
* 统计查询
*/
Query query = em.createQuery("select count(*) from User ");
Long count = (Long)query.getSingleResult();
System.out.println(count.intValue());
/*for (User user : userList) {
System.out.println(user.getUserName());
}*/
tx.commit();
em.close();
}
资源下载
JPA学习代码下载:
https://download.csdn.net/download/g425680992/10484800
Hibernate学习代码下载:
https://download.csdn.net/download/g425680992/10484797