JPA操作数据库(使用JPA进行增删改查操作)

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<Course> 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<Course> 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<Student> 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的特性进行灵活的查询。

你可能感兴趣的:(数据库,java,java-ee)