JPA 入门实战(2)--简单使用

打印 上一主题 下一主题

主题 873|帖子 873|积分 2619

本文主要介绍 JPA 的实际使用,相关的环境及软件信息如下:JPA 2.2(eclipselink 2.7.10、hibernate-entitymanager 5.6.10.Final、openjpa 3.2.2),JPA 3.0(eclipselink 3.0.2、hibernate-core-jakarta 5.6.10.Final)。
1、JPA 2.2 使用

工程目录结构如下:

1.1、引入依赖

这里使用 eclipselink 作为 JPA 的实现框架。
  1. <dependency>
  2.     <groupId>org.eclipse.persistence</groupId>
  3.     <artifactId>org.eclipse.persistence.jpa</artifactId>
  4.     <version>2.7.10</version>
  5. </dependency>
复制代码
其他的依赖可自行引入,如数据库驱动、lombok 等。
1.2、创建实体类

1.2.1、Student.java
  1. package com.abc.demojpa.entity;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import org.hibernate.annotations.CreationTimestamp;
  6. import org.hibernate.annotations.UpdateTimestamp;
  7. import javax.persistence.*;
  8. import java.time.LocalDateTime;
  9. @NoArgsConstructor
  10. @AllArgsConstructor
  11. @Data
  12. @Entity
  13. @Table(name = "a_student")
  14. @NamedQuery(name = "queryAll", query = "select s from Student s")
  15. public class Student {
  16.     @Id
  17.     @GeneratedValue
  18.     private Long id;
  19.     @Column(name = "create_time")
  20.     private LocalDateTime createTime;
  21.     @Column(name = "modify_time")
  22.     private LocalDateTime modifyTime;
  23.     private String name;
  24.     private Integer age;
  25.     @Column(name = "home_address")
  26.     private String homeAddress;
  27. }
复制代码
1.2.2、BaseEntity.java
  1. package com.abc.demojpa.entity;
  2. import lombok.Data;
  3. import javax.persistence.Column;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.Id;
  6. import javax.persistence.MappedSuperclass;
  7. import java.time.LocalDateTime;
  8. @Data
  9. //该类的属性都将映射到其子类的数据库字段中
  10. @MappedSuperclass
  11. public class BaseEntity {
  12.     @Id
  13.     @GeneratedValue
  14.     private Long id;
  15.     @Column(name = "create_time")
  16.     private LocalDateTime createTime;
  17. }
复制代码
1.2.3、Teacher.java

Teacher 继承了 BaseEntity,主要为了测试属性的继承。
  1. package com.abc.demojpa.entity;
  2. import lombok.Data;
  3. import lombok.NoArgsConstructor;
  4. import javax.persistence.*;
  5. @NoArgsConstructor
  6. @Data
  7. @Entity
  8. @Table(name = "a_teacher")
  9. public class Teacher extends BaseEntity {
  10.     private String name;
  11.     private Integer age;
  12. }
复制代码
1.3、编写 JPA 配置文件 (persistence.xml)

该配置文件需放在 META-INF 目录下。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persistence version="2.2"
  3.              xmlns="http://xmlns.jcp.org/xml/ns/persistence"
  4.              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5.              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
  6.     <persistence-unit name="myUnit">
  7.         <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
  8.         <class>com.abc.demojpa.entity.Student</class>
  9.         <class>com.abc.demojpa.entity.Teacher</class>
  10.         <properties>
  11.             <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
  12.             <property name="javax.persistence.jdbc.url" value="jdbc:mysql://10.49.196.10:3306/test?useUnicode=true&characterEncoding=UTF-8"/>
  13.             <property name="javax.persistence.jdbc.user" value="root"/>
  14.             <property name="javax.persistence.jdbc.password" value="123456"/>
  15.             <property name="eclipselink.logging.level" value="INFO" />
  16.             <property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
  17.         </properties>
  18.     </persistence-unit>
  19. </persistence>
复制代码
eclipselink 开头的配置是 eclipselink 自带的扩展配置,用于实现功能的增强;详细的扩展配置说明可参考官网说明:https://www.eclipse.org/eclipselink/documentation/2.7/jpa/extensions/toc.htm。
1.4、使用例子

1.4.1、插入实体
  1. @Test
  2. public void persist() {
  3.     entityManager.getTransaction().begin();
  4.     Student student = new Student();
  5.     student.setName("小明");
  6.     student.setCreateTime(LocalDateTime.now());
  7.     student.setModifyTime(LocalDateTime.now());
  8.     student.setAge(15);
  9.     student.setHomeAddress("江苏");
  10.     Student student2 = new Student();
  11.     student2.setName("小红");
  12.     student2.setAge(18);
  13.     student2.setHomeAddress("广东");
  14.     Teacher teacher = new Teacher();
  15.     teacher.setCreateTime(LocalDateTime.now());
  16.     teacher.setName("张三");
  17.     teacher.setAge(35);
  18.     entityManager.persist(student);
  19.     entityManager.persist(student2);
  20.     entityManager.persist(teacher);
  21.     entityManager.getTransaction().commit();
  22. }
复制代码
1.4.2、查询实体
  1. @Test
  2. public void find() {
  3.     Student student = entityManager.find(Student.class, 1501L);
  4.     logger.info("student={}", student);
  5. }
复制代码
1.4.3、更新实体(先查再更新)
  1. @Test
  2. public void modify() {
  3.     entityManager.getTransaction().begin();
  4.     Student student = entityManager.find(Student.class, 1501L);
  5.     student.setName("小明2");
  6.     entityManager.getTransaction().commit();
  7. }
复制代码
1.4.4、更新实体(直接根据id更新)
  1. @Test
  2. public void merge() {
  3.     entityManager.getTransaction().begin();
  4.     Student student = new Student();
  5.     student.setId(1501L);
  6.     student.setName("小明3");
  7.     student.setAge(16);
  8.     entityManager.merge(student);
  9.     entityManager.getTransaction().commit();
  10. }
复制代码
1.4.5、删除实体
  1. @Test
  2. public void remove() {
  3.     entityManager.getTransaction().begin();
  4.     Student student = entityManager.find(Student.class, 1501L);
  5.     entityManager.remove(student);
  6.     entityManager.getTransaction().commit();
  7. }
复制代码
1.4.6、JPQL 查询
  1. @Test
  2. public void select() {
  3.     //查询一个字段
  4.     Query query = entityManager.createQuery("select s.name from Student s where s.age>10", String.class);
  5.     List<String> result = query.getResultList();
  6.     logger.info("result={}", result);
  7.     //查询多个字段 (?n 占位符:传统 ? 占位符的改良占位符,仅仅适应 JPQL 查询)
  8.     query = entityManager.createQuery("select s.name,s.homeAddress from Student s where s.age>?1 and s.name like ?2", Object[].class);
  9.     query.setParameter(1, 10);
  10.     query.setParameter(2, "%小%");
  11.     List<Object[]> result2 = query.getResultList();
  12.     for (Object[] arr : result2) {
  13.         String s = "";
  14.         for (Object o : arr) {
  15.             s += o.toString() + ",";
  16.         }
  17.         logger.info(s);
  18.     }
  19.     //查询对象 (:name 占位符:变量名形式的占位符,仅仅适应 JPQL 查询)
  20.     query = entityManager.createQuery("select s.name,s.homeAddress from Student s where s.age between :min and :max and s.name like '%小%' order by s.id", Student.class);
  21.     query.setParameter("min", 10);
  22.     query.setParameter("max", 40);
  23.     //设置结果的开始位置,最大记录条数,可用来实现分页
  24.     query.setFirstResult(0);
  25.     query.setMaxResults(10);
  26.     List<Student> result3 = query.getResultList();
  27.     logger.info("result3={}", result3);
  28.     //聚合操作
  29.     query = entityManager.createQuery("select max(s.age) from Student s");
  30.     Object result4 = query.getSingleResult();
  31.     logger.info("result4={}", result4);
  32.     //对应Student实体类中定义的静态查询”queryAll“
  33.     query = entityManager.createNamedQuery("queryAll");
  34.     List<Student> result5 = query.getResultList();
  35.     logger.info("result5={}", result5);
  36. }
复制代码
1.4.7、JPQL 更新
  1. @Test
  2. public void update() {
  3.     entityManager.getTransaction().begin();
  4.     Query query = entityManager.createQuery( "update Student SET age=16 where name='小明'");
  5.     query.executeUpdate();
  6.     entityManager.getTransaction().commit();
  7. }
复制代码
1.4.8、JPQL 删除
  1. @Test
  2. public void delete() {
  3.     entityManager.getTransaction().begin();
  4.     Query query = entityManager.createQuery( "delete from Student where id=1501");
  5.     query.executeUpdate();
  6.     entityManager.getTransaction().commit();
  7. }
复制代码
1.4.9、JPQL 本地查询,直接 SQL 语句查询数据
  1. @Test
  2. public void nativeSelect() {
  3.     Query query = entityManager.createNativeQuery("select s.* from a_student s where s.age>?", Student.class);
  4.     query.setParameter(1, 10);
  5.     List<Student> result = query.getResultList();
  6.     logger.info("result={}", result);
  7. }
复制代码
1.4.10、JPA 标准 API 使用一

类似 SQL:select name from student where name='小明'
  1. @Test
  2. public void criteria() {
  3.     CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
  4.     CriteriaQuery<String> criteriaQuery = criteriaBuilder.createQuery(String.class);
  5.     Root<Student> root = criteriaQuery.from(Student.class);
  6.     criteriaQuery.select(root.get("name"));
  7.     criteriaQuery.where(criteriaBuilder.equal(root.get("name"), "小明"));
  8.     TypedQuery<String> query = entityManager.createQuery(criteriaQuery);
  9.     List<String> list = query.getResultList();
  10.     logger.info(list.toString());
  11. }
复制代码
1.4.11、JPA 标准 API 使用二

类似 SQL:select id,name,age from student where age>=10 order by age,name desc
  1. @Test
  2. public void criteria2() {
  3.     CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
  4.     CriteriaQuery<Student> criteriaQuery = criteriaBuilder.createQuery(Student.class);
  5.     Root<Student> root = criteriaQuery.from(Student.class);
  6.     //Student 实体类需要有对应的构造方法
  7.     criteriaQuery.multiselect(root.get("id"), root.get("name"), root.get("age"), root.get("homeAddress"));
  8.     criteriaQuery.where(criteriaBuilder.ge(root.get("age"), 10));
  9.     criteriaQuery.orderBy(criteriaBuilder.asc(root.get("age"))).orderBy(criteriaBuilder.desc(root.get("name")));
  10.     TypedQuery<Student> query = entityManager.createQuery(criteriaQuery);
  11.     List<Student> list = query.getResultList();
  12.     logger.info(list.toString());
  13. }
复制代码
1.4.12、JPA 标准 API 使用三


类似 SQL:select age,count(*) from student group by age having age=10 order by age,name desc     */    @Test    public void criteria2() {        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();        CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Student.class);        Root root = criteriaQuery.from(Student.class);        //Student 实体类需要有对应的构造方法        criteriaQuery.multiselect(root.get("id"), root.get("name"), root.get("age"), root.get("homeAddress"));        criteriaQuery.where(criteriaBuilder.ge(root.get("age"), 10));        criteriaQuery.orderBy(criteriaBuilder.asc(root.get("age"))).orderBy(criteriaBuilder.desc(root.get("name")));        TypedQuery query = entityManager.createQuery(criteriaQuery);        List list = query.getResultList();        logger.info(list.toString());    }    /**     * Criteria API     * select age,count(*) from student group by age having age

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表