JPA操作数据库

文章目录

前言一、JPA是什么?二、JPA注解例子:

三、JPA操作数据库1.创建EntityManagerFactory对象2.创建EntityManager对象3.开启事务4.操作数据库5.提交事务6.关闭EntityManager和EntityManagerFactory对象

注意

前言

本人纯新手,学习记录

JPA操作数据库,代码示例基本上涵盖了使用JPA进行增删改查操作的全部流程。

一、JPA是什么?

Java Persistence API(JPA)是Java EE平台的一部分,它为Java开发人员提供了一种面向对象的持久化框架。JPA可以通过注解或XML来映射Java类和关系型数据库表之间的映射关系,使得开发人员可以使用面向对象的方式来操作数据库。

二、JPA注解

下面展示一些 JPA注解。

@Entity:用于标注一个Java类,表示这个类是一个实体类,它映射到数据库中的一张表。

@Table:用于标注实体类和数据库表之间的映射关系。

@Id:用于标注实体类中的主键字段。

@GeneratedValue:用于指定主键的生成策略。

@Column:用于标注实体类中的属性与数据库表中的字段之间的映射关系。

@OneToMany:用于标注实体类中的一对多关系。

@ManyToOne:用于标注实体类中的多对一关系。

@ManyToMany:用于标注实体类中的多对多关系。

例子:

以下是一个简单的例子,使用了JPA的注解来建立Java类和数据库表之间的映射关系。这个例子中,我们建立了三个实体类:Student、Teacher、Course,它们之间建立了一些复杂的关系,但是通过使用JPA注解,我们可以非常方便地将它们映射到数据库表中,而无需手动编写SQL语句。

@Entity

@Table(name = "student")

public class Student {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column(name = "name")

private String name;

@Column(name = "age")

private int age;

@ManyToMany(mappedBy = "students")

private List courses;

// 省略构造方法和getter/setter方法

}

/*

在这个实体类中,我们使用了以下注解:

@Entity:表示这个类是一个实体类,需要映射到数据库中的一张表。

@Table:表示实体类和数据库表之间的映射关系,name属性指定对应的表名。

@Id:表示实体类中的主键字段。

@GeneratedValue:表示主键的生成策略,strategy属性指定为IDENTITY,表示使用数据库自增的方式生成主键。

@Column:表示实体类中的属性与数据库表中的字段之间的映射关系,name属性指定对应的列名。

@ManyToMany:表示实体类中的多对多关系,mappedBy属性指定了关系的维护端在Course实体类中的属性名。

*/

@Entity

@Table(name = "teacher")

public class Teacher {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column(name = "name")

private String name;

@Column(name = "title")

private String title;

@OneToMany(mappedBy = "teacher")

private List courses;

// 省略构造方法和getter/setter方法

}

/*

在这个实体类中,我们使用了以下注解:

@Entity:表示这个类是一个实体类,需要映射到数据库中的一张表。

@Table:表示实体类和数据库表之间的映射关系,name属性指定对应的表名。

@Id:表示实体类中的主键字段。

@GeneratedValue:表示主键的生成策略,strategy属性指定为IDENTITY,表示使用数据库自增的方式生成主键。

@Column:表示实体类中的属性与数据库表中的字段之间的映射关系,name属性指定对应的列名。

@OneToMany:表示实体类中的一对多关系,mappedBy属性指定了关系的维护端在Course实体类中的属性名。

*/

@Entity

@Table(name = "course")

public class Course {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column(name = "name")

private String name;

@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name = "teacher_id")

private Teacher teacher;

@OneToMany(mappedBy = "course")

private List students;

// 省略构造方法和getter/setter方法

}

}

/*

在这个实体类中,我们使用了以下注解:

@Entity和@Table注解,表示它是一个实体类,并且映射到数据库中的course表。

@Id和@GeneratedValue注解用于指定主键和主键的生成策略,

strategy属性指定了主键生成策略的类型:使用了自增长策略。

@Column 注解用于标注实体类中的属性与数据库表中的字段之间的映射关系,它可以用于声明列名、长度、是否唯一等属性。

在Course实体中,使用@Column注解来指定对应数据库表中的列名和数据类型等信息。

@OneToMany 注解用于标注实体类中的一对多关系,即该实体类中包含多个其他实体类的对象。

在Course实体中,使用@OneToMany注解来标注与Teacher实体类之间的一对多关系,mappedBy属性指定了关联Teacher实体类的Course属性。

@JoinTable 注解用于标注两个实体类之间的多对多关系,即一个实体类中包含多个其他实体类的集合。

在Course实体中,使用@JoinTable注解来标注与Student实体类之间的多对多关系,name属性指定了中间表的名称,

joinColumns属性指定了当前实体类在中间表中的外键列,inverseJoinColumns属性指定了关联实体类在中间表中的外键列。

*/

三、JPA操作数据库

1.创建EntityManagerFactory对象

在JPA中,EntityManagerFactory是一个重要的接口,它的主要作用是创建EntityManager对象。EntityManagerFactory通常由一个PersistenceProvider实现类来创建,这个实现类必须在persistence.xml中进行配置。 代码如下(示例):

EntityManagerFactory factory = Persistence.createEntityManagerFactory("myPersistenceUnit");

// "myPersistenceUnit" 是 persistence.xml 中配置的持久化单元名称。

2.创建EntityManager对象

EntityManager是JPA的核心类之一,用于执行实体类的持久化操作。要获得EntityManager对象,需要使用EntityManagerFactory创建。 代码如下(示例):

EntityManager em = factory.createEntityManager();

3.开启事务

在JPA中,每个操作都需要在事务的上下文中进行。因此,在进行任何数据库操作之前,需要先开启事务。 代码如下(示例):

em.getTransaction().begin();

4.操作数据库

在事务的上下文中,可以对实体类进行增删改查等数据库操作。 代码如下(示例):

// 查询

String jpql = "SELECT e FROM Employee e WHERE e.id = :id";

Employee employee = em.createQuery(jpql, Employee.class)

.setParameter("id", 1L)

.getSingleResult();

// 添加

em.persist(employee);

// 更新

employee.setName("newName");

em.merge(employee);

// 删除

em.remove(employee);

5.提交事务

当所有操作完成后,需要提交事务以将它们保存到数据库中。 代码如下(示例):

em.getTransaction().commit();

6.关闭EntityManager和EntityManagerFactory对象

完成所有操作后,需要关闭EntityManager和EntityManagerFactory对象。 代码如下(示例):

em.close();

factory.close();

注意

在使用JPA进行数据库操作时,需要注意各种异常的处理和事务的控制。同时,在查询操作中,使用JPQL语句可以更好地利用JPA的特性进行灵活的查询。

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: