1.1 说明

所谓的逆向工程就是通过数据库的结构生成代码。

目的:提高开发的效率

1.2 步骤

1.2.1 第一步创建JPA项目

(1)创建项目

(2)指定项目名、JPA版本

(3)完成创建

1.2.2 第二步生成JPA代码

右击项目的src文件夹,选择new --> Other.. -->JPA的JPA Entities from Tables

1.2.2.1 Step1:创建新的数据库连接

(1)选择新建数据库连接

(2)指定数据库类型

(3)新建数据库驱动

(4)配置驱动信息

驱动版本号

加载驱动jar包

配置jdbc四要素

1.2.2.2 Step2:配置表与表直接的关联关系

(1)配置表关联关系

选择表,全选即可。

配置Student、Score一对多

依次配置其它的关联关系即可。

1.2.2.3 Step3:指定生成实体类的名称及结构

(1)修改关联对象的属性名

指定实体类的生成属性

指定实体类的类名

依次修改其它类的属性即可。

1.2.2.4 Step4:生成代码

1.2.3 第三步:导入所需jar依赖

说明:Maven项目是可以导入jar包到本地的。

方法:打开DOS窗口,进入项目的pom文件所在目录,执行命令:

mvn dependency:copy-dependencies

前提:已经配置了Maven环境变量。

1.2.4 第四步:更新项目

JPQL语言 

2.1 说明 

JPQL : Java Persistence Query Language : java持久化查询语言。

它的作用是通过类似SQL的语法去操作实体类的对象。

语法和SQL一样的,SQL操作的数据表,JPQL操作的对象

作用:实现个性化的查询需求

2.2 示例代码 

package cn.zj.jpa;

import java.util.List;

import javax.persistence.EntityManager;

import javax.persistence.EntityTransaction;

import javax.persistence.Query;

import javax.persistence.TypedQuery;

import org.junit.Test;

import cn.zj.jpa.entity.Student;

import cn.zj.jpa.util.JPAUtils;

public class StudentDAOTest {

//1.查询所有学生的信息

@Test

public void findAll(){

//1获得操作对象

EntityManager manager = JPAUtils.getEntityManager();

//2.获得JPQL查询对象

//标准的JPQL是必须要使用select

//select语法: select 别名  from 类名 别名

TypedQuery<Student> query = manager.createQuery("select s from Student s", Student.class);

//返回多条查询的数据,getResultList

//TypedQuery解决了HIbernate返回有警告的问题

List<Student> students = query.getResultList();

for (Student student : students) {

System.out.println("学生名:"+student.getStuName());

}

manager.close();

}

//2.条件查询

//需求:查询名字有张字的学生

//注意:JPQL的语法,使用?设置参数,必须要在?后面设置下标值,下标值不能为负数

@Test

public void findByCondition(){

//1获得操作对象

EntityManager manager = JPAUtils.getEntityManager();

//2.获得JPQL查询对象

//标准的JPQL是必须要使用select

TypedQuery<Student> query = manager.createQuery("select s from Student s where s.stuName like ?1", Student.class);

//3.设置条件

query.setParameter(1, "%张%");

List<Student> students = query.getResultList();

for (Student student : students) {

System.out.println("学生名:"+student.getStuName());

}

manager.close();

}

@Test

public void findByCondition1(){

//1获得操作对象

EntityManager manager = JPAUtils.getEntityManager();

//2.获得JPQL查询对象

//标准的JPQL是必须要使用select

TypedQuery<Student> query = manager.createQuery("select s from Student s where s.stuName like :stuName", Student.class);

//3.设置条件

query.setParameter("stuName", "%张%");

List<Student> students = query.getResultList();

for (Student student : students) {

System.out.println("学生名:"+student.getStuName());

}

manager.close();

}

//需求:返回学生表的记录数

@Test

public void count(){

//1获得操作对象

EntityManager manager = JPAUtils.getEntityManager();

//2.获得JPQL查询对象

//标准的JPQL是必须要使用select

//JPQL中的count操作返回值是Long值,所以用Long类型接收

TypedQuery<Long> query = manager.createQuery("select count(s) from Student s", Long.class);

//如果返回的是一个值的查询,使用getSingleResult

Long count = query.getSingleResult();

System.out.println(count);

manager.close();

}

//需求:第二页,每页三条

@Test

public void findByPage(){

//1获得操作对象

EntityManager manager = JPAUtils.getEntityManager();

//2.获得JPQL查询对象

//标准的JPQL是必须要使用select

TypedQuery<Student> query = manager.createQuery("select s from Student s", Student.class);

//设置分页条件

//1.设置开始位置,下标从0开始,第四条数据的下标为3

query.setFirstResult(3);

//2.设置每页的记录

query.setMaxResults(3);

List<Student> students = query.getResultList();

for (Student student : students) {

System.out.println("学生名:"+student.getStuName());

}

manager.close();

}

/*

* 命名查询语句的调用

*

* 所谓的命名查询,就是在实体类对象使用一个名字声明一条JPQL语句

* 这样可以通过name值获得Query的语句

*

* 命名查询,在类名上做如下声明:

@NamedQuery(name="Student.findAll", query="SELECT s FROM Student s")

public class Student {

*/

@Test

public void findAllByNamedQuery(){

//1获得操作对象

EntityManager manager = JPAUtils.getEntityManager();

//2.获得一个查询命名查询语句的对象

//可以通过该对象调用实体类声明的命名查询语句

TypedQuery<Student> query = manager.createNamedQuery("Student.findAll", Student.class);

List<Student> students = query.getResultList();

for (Student student : students) {

System.out.println(student.getStuName());

}

manager.close();

}

//需求:通过JQOL删除有张字的学生

@Test

public void removeByCondition(){

//1获得操作对象

EntityManager manager = JPAUtils.getEntityManager();

EntityTransaction transaction = manager.getTransaction();

transaction.begin();

try {

//2.获得JPQL查询对象

//注意,调用操作的JPQL是不需要指定返回的类型

Query query = manager.createQuery("delete from Student s where s.stuName like ?1");

//参数对应?设置的下标值

query.setParameter(1, "%张%");

int count = query.executeUpdate();

System.out.println(count);

transaction.commit();

manager.close();

} catch (Exception e) {

transaction.rollback();

e.printStackTrace();

}

}

}

2.3 JPQL补充:N+1问题

在一对多或者多对多查询过程中,首先查询1这一方的数据,然后根据1这一份的数据,查询多的一方的数据。

当学生有N个的时候,总共查询次数N+1次。

这个就称之为N+1问题

当我们数据库的量不大的时候,N+1问题基本没有什么影响。如果当数据量很大的时候,查询数据库的次数,就很大了,这个就会影响数据库的性能。

如何解决这个问题?

可以通过JPQL来解决。

@Test

public void one2manybyOne(){

//1、获取实体操作对象

EntityManager manager = JPAUtils.getEntityManager();

//JPQL是通过fetch这个关键词,在查询学生的信息的时候,一起将分数也查询出来

//最终执行的sql就只有一条

TypedQuery<Student> query = manager.createQuery("select distinct s from Student s inner join fetch s.scores", Student.class);

List<Student> students = query.getResultList();

for (Student student : students) {

System.out.println("学生姓名:"+student.getStuName()+",学生id:"+student.getStuId());

List<Score> scores = student.getScores();

for (Score score : scores) {

System.out.println("科目:"+score.getScoSubject()+",分数:"+score.getScoScore());

}

System.out.println("---------------------------------");

}

}

执行结果:

执行过程中,确实一条sql语句!!!

解决了频繁查询数据库,带来的数据库性能损耗。

JPA逆向工程的更多相关文章

  1. SpringBoot 阶段测试 1

    SpringBoot 阶段测试 1 目录 SpringBoot 阶段测试 1 1.使用JDK8新语法完成下列集合练习: 1.1 List中有1,2,3,4,5,6,7,8,9几个元素要求; (1) 将 ...

  2. SpringBoot (四) - 整合Mybatis,逆向工程,JPA

    1.SpringBoot整合MyBatis 1.1 application.yml # 数据源配置 spring: datasource: driver-class-name: com.mysql.c ...

  3. SpringBoot+Mybatis+Maven+MySQL逆向工程实现增删改查

    SpringBoot+Mybatis+MySQL+MAVEN逆向工程实现增删改查 这两天简单学习了下SpringBoot,发现这玩意配置起来是真的方便,相比于SpringMVC+Spring的配置简直 ...

  4. MyEclipse使用教程:使用REST Web Services管理JPA实体

    MyEclipse 在线订购专享特惠!火爆开抢>> MyEclipse最新版下载 使用REST Web Services来管理JPA实体.在逆向工程数据库表后生成REST Web服务,下面 ...

  5. 用MyEclipse JPA创建项目(二)

    MyEclipse 3.15 Style——在线购买低至75折!火爆开抢>> [MyEclipse最新版下载] 本教程介绍了MyEclipse中的一些基于PA的功能. 阅读本教程时,了解J ...

  6. MyEclipse持续性开发教程:用JPA和Spring管理数据(二)

    MyEclipse红运年货节 在线购买低至69折!火爆开抢>> [MyEclipse最新版下载] 本教程介绍了MyEclipse中的一些基于JPA / Spring的功能.有关设置JPA项 ...

  7. 用MyEclipse JPA创建项目

    http://www.myeclipsecn.com/learningcenter/persistence-development/myeclipse-jpa/ 用MyEclipse JPA创建项目 ...

  8. 为什么放弃Hibernate、JPA、Mybatis,最终选择JDBCTemplate

    一.前言 因为项目需要选择数据持久化框架,看了一下主要几个流行的和不流行的框架,对于复杂业务系统,最终的结论是,JOOQ是总体上最好的,可惜不是完全免费,最终选择JDBC Template. Hibe ...

  9. 快速搭建springmvc+spring data jpa工程

    一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...

随机推荐

  1. Python ( )、[ ]、{}的区别

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ },分别用来代表不同的python基本内置数据类型. python中的小括号( ):代表tuple元组数据 ...

  2. RNA剪接体 Spliceosome | 冷冻电镜 | 结构生物学

    冷冻电镜 为什么冷冻电镜 (Cryo-EM) 技术的发明可以获得2017诺贝尔化学奖?知乎看法 Press release: The Nobel Prize in Chemistry 2017 We ...

  3. Leetcode: 24 Game

    You have 4 cards each containing a number from 1 to 9. You need to judge whether they could operated ...

  4. flutte的第一个hello world程序

    用命令行创建项目: flutter create flutterdemo VSCode或者AS连接手机后 输入 flutter run 编译后就可以将默认的代码显示在手机上了 开始写hello wor ...

  5. ISO/IEC 9899:2011 条款6.3——转换

    6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...

  6. python中的修饰符@的作用

    1.一层修饰符 1)简单版,编译即实现 在一个函数上面添加修饰符 @另一个函数名 的作用是将这个修饰符下面的函数作为该修饰符函数的参数传入,作用可以有比如你想要在函数前面添加记录时间的代码,这样每个函 ...

  7. 008-guava 并发工具ListenableFuture、Service

    一.ListenableFuture工具使用 guava 并发工具:ListenableFuture jdk8 提供了:CompletableFuture 实现,推荐使用 jdk 8 Completa ...

  8. window.location.href重定向失败的问题

    如题,在js中通过window.location.href=URL来跳转到另一个页面(也可以是另一个项目的另一个页面). 打开的页面地址是:www.a.com/project1/index 要跳转的页 ...

  9. PAT 甲级 1064 Complete Binary Search Tree (30 分)(不会做,重点复习,模拟中序遍历)

    1064 Complete Binary Search Tree (30 分)   A Binary Search Tree (BST) is recursively defined as a bin ...

  10. Spring Cloud Hystrix 服务容错保护 5.1

    Spring Cloud Hystrix介绍 在微服务架构中,通常会存在多个服务层调用的情况,如果基础服务出现故障可能会发生级联传递,导致整个服务链上的服务不可用为了解决服务级联失败这种问题,在分布式 ...