JPA操作数据库
文章目录
前言
本人纯新手,学习记录
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的特性进行灵活的查询。