Java EE开发系列教程 - 添加JPA模块

Posted 前端罗欢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java EE开发系列教程 - 添加JPA模块相关的知识,希望对你有一定的参考价值。

选择Upload a new deployment。点击Next。

选择解压得到的jar文件。点击Next。

保持默认,点击Finish。

回到首页,点击Create a datasource旁边的start链接。在随后出现的页面中选择 Subsystems -> Datasources -> Non-XA。点击右边的 Add。

选择mysql datasource. 点击Next。

指定一个Datasource名称和JNDI名称。 JNDI 名称十分重要,会在JPA连接到JDBC Resource的时候用到。点击Next。

选择Detected driver并选择第一个检测出来的驱动。点击next。

定义连接 URL。这里我创建的数据库名称为notebook,在配置URL之前,先在mysql中使用“create database notebook”命令创建此数据库。指定MySQL用户名和密码之后,点击next。

查看配置概要,如果正确点击finish。

可通过下图的方式测试是否连接成功:

如果成功连接到数据库,会弹出下图提示框:

创建JPA module

============

从IntelliJ中创建一个Maven 模块。使用下图所示的groupId, artifactId, 并选择择之前所创建的notebookRoot做为父项目: com.zxuqian:notebookRoot:0.0.1-SNAPSHOT

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bfQkS6gV-1651211626187)(http://upload-images.jianshu.io/upload_images/4914554-e9bbe8b416b8aaf1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

创建完成后,修改pom.xml文件内容:

4.0.0

com.zxuqian

notebookDomain

jar

com.zxuqian

notebookRoot

0.0.1-SNAPSHOT

…/notebookRoot/pom.xml

maven-compiler-plugin

3.5.1

1.8

1.8

org.hibernate.javax.persistence

hibernate-jpa-2.1-api

provided

此模块打包为Jar项目,为Java EE所要求的JPA模块打包结构。

因为wildfly运行环境提供JPA实现,所以这里JPA依赖的scope为provided,仅在编译时提供。

创建一个 Entity


Entity是Java对象和数据库表建立关系的桥梁,使用JPA注解来配置如何生成对应的数据库表。首先创建一个class,类名为User,并填入如下代码:

package com.zxuqian.notebook.domain;

import java.io.Serializable;

import java.util.Date;

import javax.persistence.*;

/**

  • Entity implementation class for Entity: User

*/

@Entity

public class User implements Serializable

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)

private long id;

private String username;

private String password;

private Date dateOfBirth;

private String email;

private String phone;

public User()

super();

public long getId()

return id;

public void setId(long id)

this.id = id;

public String getUsername()

return username;

public void setUsername(String username)

this.username = username;

public String getPassword()

return password;

public void setPassword(String password)

this.password = password;

public Date getDateOfBirth()

return dateOfBirth;

public void setDateOfBirth(Date dateOfBirth)

this.dateOfBirth = dateOfBirth;

public String getEmail()

return email;

public void setEmail(String email)

this.email = email;

public String getPhone()

return phone;

public void setPhone(String phone)

this.phone = phone;

此类为POJO(simple plain old java bean),意思为此类提供一组属性,并提供用这些属性初始化对象的构造方法,以及访问和设置这些属性的getter和setter方法。Entity需要实现Serializable接口以便JPA把对象序列化到数据库和从数据库中反序列化出来。

@Entity注解表明此类为Entity,默认使用类名作为表名。

@Id注解声明此成员变量为数据库中的主键,使用IDENTITY生成策略,即JPA负责生成ID的数值。

在src/META-INF 目录, 创建名为 persistence.xml 的文件,填入如下内容:

<?xml version="1.0" encoding="UTF-8"?>

java:/MySqlDS

此文件为JPA的配置文件。 <jta-data-source> 使用在wildfly下创建的JNDI名称。 javax.persistence.schema-generation.database.action 属性的值,drop-and-create ,表示数据库表会在每次项目部署后重新创建。 javax.persistence.schema-generation.scripts.action 表示是否生成SQL 文件。

创建EAR 模块


因为JSF模块和JPA模块为独立的两个项目,所以我们需要把它们打包成一个EAR包部署到wildfly服务器中。它包含的JSF和JPA模块会自动被wildfly识别并部署。创建此项目(groupId和artifacitId请参考下方pom文件),并在pom.xml中填入下方代码:

4.0.0

com.zxuqian

notebookEAR

0.0.1-SNAPSHOT

ear

maven-ear-plugin

2.10

EarContent

7

lib

com.zxuqian

notebook

/notebook

org.wildfly.plugins

wildfly-maven-plugin

1.2.0.Alpha2

/Users/zxuqian/development/tools/wildfly-10.1.0.Final

com.zxuqian

notebook

0.0.1-SNAPSHOT

war

com.zxuqian

notebookDomain

0.0.1-SNAPSHOT

iguration>

/Users/zxuqian/development/tools/wildfly-10.1.0.Final

com.zxuqian

notebook

0.0.1-SNAPSHOT

war

com.zxuqian

notebookDomain

0.0.1-SNAPSHOT

SpringBoot系列:四SpringBoot集成JPA

首先要明白的是JPA不是产品,它是一个规范。

Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。

它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面

在pom.xml中添加引用:jpa和mysql

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>


在配置文件中添加数据库链接配置
链接字符串要指定时区和编码格式不然会导致中文乱码和报错

技术图片

 

 

 

 

 

然后声明一个实体类,添加@Table注解制定表名,@Entity表明它是一个实体类Bean

@Id标明主键,@GeneratedValue标明主键类型,下图是mysql自增主键的例子

@Column指定映射的数据库列名,同名的话可以不写

技术图片

 

 

 

创建一个接口继承JpaRepository,然后我们就可以使用框架为我们封装好的CURD了 

技术图片

 

技术图片

 

 调用接口看一下返回效果

技术图片

 

 剩下的删除修改就不贴了都是一样的。

接下来是JPA的查询,JPA会根据方法的名字来生成对应的查询

技术图片

 

 到控制器层试一下

技术图片

 

 调用一下接口,完美返回

技术图片

 

删除跟新什么的都是这个套路,下面是一张对照表

KeywordSampleJPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age ⇐ ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection age) … where x.age not in ?1
TRUE findByActiveTrue() … where x.active = true
FALSE findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

 

 

 

 接下来是JPA的分页,JPA中自带了分页可以让我们直接使用

 

 技术图片

 

调用接口返回

技术图片

 

 开箱即用

下一章,我们讲集成Mybaits

 

以上是关于Java EE开发系列教程 - 添加JPA模块的主要内容,如果未能解决你的问题,请参考以下文章

将@NamedQuery 用于单列选择(J2EE/JPA、Hibernate)是一种好习惯吗?

jpa教程+ 常见的jpa报错以及解决方式

SpringBoot系列:四SpringBoot集成JPA

使用MyEclipse开发Java EE应用:EJB项目开发初探(下)

勤拂拭软件系列教程 - java web开发

SpringBoot 系列教程 JPA 错误姿势之环境配置问题