搭建第一个JPA工程
-
创建Java工程
-
导入jar包或者maven坐标
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.hibernate.version>5.0.7.Final</project.hibernate.version> </properties> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- hibernate对jpa的支持包 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${project.hibernate.version}</version> </dependency> <!-- c3p0 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${project.hibernate.version}</version> </dependency> <!-- log日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- Mysql and MariaDB --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> </dependencies>
-
创建核心配置文件
在resources下面创建METE-INF文件夹,创建persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <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_2_0.xsd" version="2.0"> <!--配置持久化单元 name:持久化单元名称 transaction-type:事务类型 RESOURCE_LOCAL:本地事务管理 JTA:分布式事务管理 --> <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL"> <!--配置JPA规范的服务提供商 --> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <properties> <!-- 数据库驱动 --> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <!-- 数据库地址 --> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=UTF-8" /> <!-- 数据库用户名 --> <property name="javax.persistence.jdbc.user" value="root" /> <!-- 数据库密码 --> <property name="javax.persistence.jdbc.password" value="123456" /> <!--jpa提供者的可选配置:我们的JPA规范的提供者为hibernate,所以jpa的核心配置中兼容hibernate的配 --> <!--配置jpa实现方(hibernate)的配置信息 显示sql : false|true 自动创建数据库表: hibernate.hbm2ddl.auto create:程序运行时创建数据库表(如有表,先删除表再创建) update:程序运行时创建表(如果有表,不会创建表) none:不会创建表 --> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="hibernate.hbm2ddl.auto" value="create" /> </properties> </persistence-unit> </persistence>
-
创建实体类与数据表
/* @Entity 实体类映射 @Table 映射的表格 name 表格名称 @Id 主键 @GeneratedValue 主键生成策略 IDENTITY 主键自动递增(适用于底层支持自动递增的数据库) SEQUENCE 序列(适用于Oracle) AUTO 自动创建第三张表维护主键的下一个值 TABLE 创建第三张表维护主键的下一个值 */ @Entity @Table(name = "t_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String username; private String password;
-
测试
@Test public void jpaTest(){ //创建实体管理器工厂 EntityManagerFactory factory= Persistence.createEntityManagerFactory("myJpa"); //创建实体管理器 EntityManager entityManager = factory.createEntityManager(); User user=new User("张三","123456"); //开启事务 EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //执行添加(持久化)操作 entityManager.persist(user); //提交事务 transaction.commit(); }
基本增删改查操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DrKwFphx-1628341715797)(file:///C:/Users/LJW/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png)]
对象状态:
临时状态对象:new关键字创建的对象(不被数据库管理,不被实体类管理)
持久化对象:数据库中存在,被entityManager管理
增加:persist(临时状态对象)
删除:remove(持久化对象)
修改:
merge(带有id的临时状态对象)
如果id在数据库中存在,则执行修改操作,但是在修改的时候需要提供所有的字段值
如果id在数据库中不存在,则执行添加操作
merge(持久化状态对象)
正常执行修改操作
先调用find方法查询到持久化对象,在对象的基础之上直接修改属性,事务提交会默认执行修改语句
查询:find(反射类型,主键)通过find查询到的对象都是持久化对象
不管是否使用到对象,都会发送sql语句,及时加载
问题一:在使用对象的时候,关闭entityManager,不影响对象使用
问题二:当查询的id在数据库中不存在的时候,返回null,后期需要注意空指针问题
getReference(反射类型,主键)
什么时候使用对象,什么时候发送sql语句,懒加载
问题一:如果在使用对象的时候,关闭entityManager,会报错:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
问题二:当查询的id在数据库中不存在的时候,会报错:
javax.persistence.EntityNotFoundException
JPA中的复杂查询
JPQL全称Java Persistence Query Language
Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。
查询全部
//查询所有
@Test
public void getAllUser(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("myJpa");
EntityManager entityManager= factory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Query query = entityManager.createQuery("from User");
List list = query.getResultList();
System.out.println(list);
transaction.commit();
entityManager.close();
}
分页查询
//分页查询
@Test
public void findPage(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("myJpa");
EntityManager entityManager= factory.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Query query = entityManager.createQuery("from User");
//起始索引
query.setFirstResult(0);
//每页显示条数
query.setMaxResults(2);
List list = query.getResultList();
System.out.println(list);
transaction.commit();
entityManager.close();
}
条件查询
//条件查询
@Test
public void test01(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("myJpa");
EntityManager entityManager = factory.createEntityManager();
Query query = entityManager.createQuery("from User where username=?");
query.setParameter(1,"admin");
List list = query.getResultList();
//单一对象接收
//User user = (User) query.getSingleResult();
System.out.println(list);
}
统计查询
//统计查询
@Test
public void test02(){
EntityManagerFactory factory=Persistence.createEntityManagerFactory("myJpa");
EntityManager entityManager = factory.createEntityManager();
Query query = entityManager.createQuery("select count(id) from User");
List list = query.getResultList();
System.out.println(list);
}