Spring Boot&JPA&Hibernate&Oracle

在本教程中,我们将展示如何创建一个Spring Boot应用程序,该应用程序通过Hibernate与Oracle数据源进行通信。

先决条件:

  • Eclipse IDE(最新版本)
  • Maven的4
  • Java 1.8

1-创建Maven项目

打开eclipse,然后创建一个新的Maven项目并将其命名为SpringBootHibernate

在本教程的最后,我们将获得以下项目结构:

2-pom.xml

通过添加以下父依赖项在pom.xml中配置Spring Boot:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.10.RELEASE</version>
</parent>

然后添加spring-boot-starter依赖性,以将我们的应用程序作为独立的jar应用程序运行:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>

现在,为了利用Spring数据jpa和休眠状态,我们只需添加spring-boot-starter-data-jpa作为依赖项:

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

一旦在项目中包含Spring Boot Starter JPA ,我们就会从各种各样的依赖项中获得以下功能:

  • 自动配置内存中嵌入式数据库,使您无需设置数据库即可运行应用程序。
  • 自动导入JPA APIHibernate,添加此依赖项将自动导入JPA API并使用Hibernate作为默认实现。
  • application.properties自动读取数据源和休眠配置
  • 自动创建表实体并自动执行import.sql。

这是整个pom.xml供参考:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.programmer.gate</groupId><artifactId>SpringBootHibernate</artifactId><packaging>jar</packaging><version>0.0.1-SNAPSHOT</version><name>SpringBootHibernate</name><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.10.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

3-将Oracle驱动程序添加到类路径

在本教程中,我们将覆盖Spring Boot提供的默认内存数据库,并使用我们自己的oracle数据库。

为此,我们在WEB-INF / lib下添加“ oracle-ojdbc6-11.2.0.3.jar” ,并在类路径中对其进行定义。

4- application.properties

配置oracle数据源并在application.properties中休眠:

# create and drop tables and sequences, loads import.sql
spring.jpa.hibernate.ddl-auto=create-drop# Oracle settings
spring.datasource.url=jdbc:oracle:thin:@localhost:1522:orcl
spring.datasource.username=HIBERNATE_TEST
spring.datasource.password=HIBERNATE_TEST
spring.datasource.driver.class=oracle.jdbc.driver.OracleDriver# logging
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n
logging.level.org.hibernate.SQL=debug

5个实体

我们的实体代表一个球员和一个具有一对多关系的球队,每个球队可以有很多球员,而一个球员一次只能与一个球队比赛。

因此,我们在com.programmer.gate.model包下创建实体:

播放器

package com.programmer.gate.model;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;@Entity
public class Player {@Id@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "player_Sequence")@SequenceGenerator(name = "player_Sequence", sequenceName = "PLAYER_SEQ")private Long id;@Column(name = "name")private String name;@Column(name = "num")private int num;@Column(name = "position")private String position;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "team_id", nullable = false)private Team team;public Player() {}// getters/setters
}

Team.java

package com.programmer.gate.model;import java.util.List;import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;@Entity
public class Team {@Id@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "team_Sequence")@SequenceGenerator(name = "team_Sequence", sequenceName = "TEAM_SEQ")private Long id;@Column(name = "name")private String name;@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER,mappedBy = "team")private List<Player> players;public Team() {}// getters/setters
}

由于我们在application.properties中设置了spring.jpa.hibernate.ddl-auto = create-drop ,因此我们的应用程序将在数据库中自动创建PlayerTeam实体以及它们的顺序和约束。

我们的应用程序还将在类路径中查找import.sql并执行(如果找到)。

在我们的示例中,我们在src / main / resources下定义import.sql ,以便用静态数据填充表:

insert into Team (id,name) values(1,'Barcelona');insert into Player (id, team_id, name, num, position) values(1,1,'Lionel Messi', 10, 'Forward');
insert into Player (id, team_id, name, num, position) values(2,1,'Andreas Inniesta', 8, 'Midfielder');
insert into Player (id, team_id, name, num, position) values(3,1,'Pique', 3, 'Defender');

6-存储库

我们在com.programmer.gate.repository下定义我们的存储库接口。 每个存储库都扩展了Spring CrudRepository ,它为基本的find,save和delete方法提供了默认实现,因此我们不必为它们定义实现类。

播放器存储库

package com.programmer.gate.repository;import java.util.List;import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;import com.programmer.gate.model.Player;@Repository
public interface PlayerRepository extends CrudRepository<Player, Long> {List<Player> findByTeamId(long teamId);
}

团队资料库

package com.programmer.gate.repository;import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;import com.programmer.gate.model.Team;@Repository
public interface TeamRepository extends CrudRepository<Team, Long> {Team findByPlayers(long playerId);
}

7-服务

现在,我们定义服务类来保存应用程序的业务逻辑,我们的服务公开两种方法: getAllTeamPlayers()addBarcelonaPlayer()如果您不喜欢Barcelona :D, 只需将其重命名为您喜欢的俱乐部 ),我们的服务层直接与存储库层通信。

SoccerService.java

package com.programmer.gate.service;import java.util.List;public interface SoccerService {public List<String> getAllTeamPlayers(long teamId);public void addBarcelonaPlayer(String name, String position, int number);
}

足球服务Impl

package com.programmer.gate.service;import java.util.ArrayList;
import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.programmer.gate.model.Player;
import com.programmer.gate.model.Team;
import com.programmer.gate.repository.PlayerRepository;
import com.programmer.gate.repository.TeamRepository;@Service
public class SoccerServiceImpl implements SoccerService {@Autowiredprivate PlayerRepository playerRepository;@Autowiredprivate TeamRepository teamRepository;public List<String> getAllTeamPlayers(long teamId) {List<String> result = new ArrayList<String>();List<Player> players = playerRepository.findByTeamId(teamId);for (Player player : players) {result.add(player.getName());}return result;}public void addBarcelonaPlayer(String name, String position, int number) {Team barcelona = teamRepository.findOne(1l);Player newPlayer = new Player();newPlayer.setName(name);newPlayer.setPosition(position);newPlayer.setNum(number);newPlayer.setTeam(barcelona);playerRepository.save(newPlayer);}
}

8- Application.java

最后一步是创建Spring Boot初始化程序,这是我们应用程序的入口。 我们在com.programmer.gate下定义Application.java

package com.programmer.gate;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import com.programmer.gate.service.SoccerService;@SpringBootApplication
public class Application implements CommandLineRunner{@AutowiredSoccerService soccerService;public static void main(String[] args) {SpringApplication.run(Application.class, args);}@Overridepublic void run(String... arg0) throws Exception {soccerService.addBarcelonaPlayer("Xavi Hernandez", "Midfielder", 6);List<String> players = soccerService.getAllTeamPlayers(1);for(String player : players){System.out.println("Introducing Barca player => " + player);}}
}

PS:值得一提的是,Spring Boot应用程序会自动读取并创建相对于初始化程序类所在位置的相同或子包中定义的实体,存储库和服务,因此如果我们在不同的包下定义Application.java,我们需要明确指定模型,存储库和服务的包。

输出:

当将应用程序作为标准Java应用程序运行时,我们将在控制台中获得以下输出。

2018-04-13 14:54:47 DEBUG org.hibernate.SQL - create sequence player_seq start with 1 increment by 1
2018-04-13 14:54:47 DEBUG org.hibernate.SQL - create sequence team_seq start with 1 increment by 1
2018-04-13 14:54:47 DEBUG org.hibernate.SQL - create table player (id number(19,0) not null, name varchar2(255 char), num number(10,0), position varchar2(255 char), team_id number(19,0) not null, primary key (id))
2018-04-13 14:54:47 DEBUG org.hibernate.SQL - create table team (id number(19,0) not null, name varchar2(255 char), primary key (id))
2018-04-13 14:54:47 DEBUG org.hibernate.SQL - alter table player add constraint FKdvd6ljes11r44igawmpm1mc5s foreign key (team_id) references team
2018-04-13 14:54:47 INFO  o.h.tool.hbm2ddl.SchemaExport - HHH000476: Executing import script '/import.sql'
2018-04-13 14:54:47 INFO  o.h.tool.hbm2ddl.SchemaExport - HHH000230: Schema export complete
2018-04-13 14:54:47 INFO  o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default'
2018-04-13 14:54:48 INFO  o.s.j.e.a.AnnotationMBeanExporter - Registering beans for JMX exposure on startup
2018-04-13 14:54:48 DEBUG org.hibernate.SQL - select team0_.id as id1_1_0_, team0_.name as name2_1_0_, players1_.team_id as team_id5_0_1_, players1_.id as id1_0_1_, players1_.id as id1_0_2_, players1_.name as name2_0_2_, players1_.num as num3_0_2_, players1_.position as position4_0_2_, players1_.team_id as team_id5_0_2_ from team team0_, player players1_ where team0_.id=players1_.team_id(+) and team0_.id=?
2018-04-13 14:54:48 DEBUG org.hibernate.SQL - select player_seq.nextval from dual
2018-04-13 14:54:48 DEBUG org.hibernate.SQL - insert into player (name, num, position, team_id, id) values (?, ?, ?, ?, ?)
2018-04-13 14:54:48 INFO  o.h.h.i.QueryTranslatorFactoryInitiator - HHH000397: Using ASTQueryTranslatorFactory
2018-04-13 14:54:48 DEBUG org.hibernate.SQL - select player0_.id as id1_0_, player0_.name as name2_0_, player0_.num as num3_0_, player0_.position as position4_0_, player0_.team_id as team_id5_0_ from player player0_, team team1_ where player0_.team_id=team1_.id(+) and team1_.id=?Introducing Barca player => Lionel Messi
Introducing Barca player => Andreas Inniesta
Introducing Barca player => Pique
Introducing Barca player => Xavi Hernandez2018-04-13 14:54:49 INFO  com.programmer.gate.Application - Started Application in 4.213 seconds (JVM running for 4.555)

9-源代码

您可以从此存储库下载源代码: spring-boot-jpa-hibernate

翻译自: https://www.javacodegeeks.com/2018/04/spring-boot-jpa-hibernate-oracle.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电磁场与电磁波实验三 熟悉Mathematica软件在电磁场领域的应用

微信公众号&#xff1a;创享日记 发送&#xff1a;mathematica 获取完整报告 一、电磁波 该模型显示了极化正弦波的垂直电、磁分量。 在真空中&#xff0c;这种波以光速传播。 二、电磁环 假设一个铜环(或其他导电环)放在电磁铁的一极上。当电流接通时(如图中红色的电路颜色…

基于平滑、差分的矩形波零漂(基线漂移)消除算法(MATLAB实现,代码和数据见CSDN同名资源)

问题背景 矩形波数据存放在txt中,如下图所示 数据说明:1、每个文档第一列都是时间,可以去掉; 2、共10个文件,每个文件一共17列,第一列是时间,后面是数据,其中2-5列的数据是比较好。 3、10个文件按照编号是从1到10时间上是连续的。 处理前数据波形如下 目标是做零漂…

思维-网页技术设计大作业前端HTML+CSS+JS(精美完整)

微信公众号&#xff1a;创享日记 发送&#xff1a;思维网站 获取完整源码&#xff08;打开即可用&#xff09; 网页的结构与分解 主要分以下几个版块&#xff1a; 一&#xff1a;主页版块 二&#xff1a;登录版块 三&#xff1a;注册板块 四&#xff1a;个人设置板块 五&#x…

java 设计模式 示例_Java中的中介器设计模式-示例教程

java 设计模式 示例中介者模式是行为设计模式之一 &#xff0c;因此它处理对象的行为。 中介器设计模式用于在系统中不同对象之间提供集中式通信介质。 根据GoF&#xff0c;中介者模式意图是&#xff1a; 通过封装不同对象集相互交互和通信的方式&#xff0c;允许松散耦合。 允…

二级倒立摆系统的稳定控制与仿真(Matlab/Simulink)

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;二级倒立摆…

伪随机交织抑制突发噪声的MATLAB仿真(采用(2,1,3)卷积码)

在上一篇文章中 BPSK调制下(2,1,3)、(2,1,6)卷积码与QC-LDPC码译码性能和抑制突发噪声性能对比(MATLAB实现) 伪随机交织抑制突发噪声的仿真曲线不是很明显,虽然之前的程序没问题的,只是那样不好表现出伪随机交织的性能,突发奇想,换了一种方式,一帧一帧的做,正好利用MA…

电磁场与电磁波实验四 熟悉CST Studio软件在电磁领域的应用

微信公众号&#xff1a;创享日记 发送&#xff1a;cst 免费获取完整报告 一、实验要求 要求&#xff1a;仿真H面90波导弯头的S参数 尺寸&#xff1a; 2x4x10cm 频带&#xff1a;4~5GHz 二、实验过程 1.创建第一个立方体 2.设置旋转轴 3.选取端面&#xff0c;设置旋转结构&am…

(2,1,3)卷积码与一种QC-LDPC码的译码性能对比

在上一篇文章中 BPSK调制下(2,1,3)、(2,1,6)卷积码与QC-LDPC码译码性能和抑制突发噪声性能对比(MATLAB实现) 重写了(2,1,3)卷积码与一种QC-LDPC码的译码性能对比代码,同样采用MATLAB中的CPU并行计算,能够提高程序运行速度。 结果如下: 代码如下: clear; close all; c…

科学计算与仿真-高斯牛顿法的非线性最小二乘问题简单介绍与应用

微信公众号&#xff1a;创享日记 发送&#xff1a;高斯牛顿 获取完整报告&#xff08;含源程序代码&#xff09; 一、问题的提出 在日常生活和科学研究中&#xff0c;人们经常会遇到这样一类问题&#xff1a;在某些条件下&#xff0c;寻求某一数量指标的最大或最小值。例如&…

一种QC-LDPC码对突发噪声抑制的MATLAB仿真

欢迎同步关注公众号【逆向通信猿】 对博客BPSK调制下(2,1,3)、(2,1,6)卷积码与QC-LDPC码译码性能和抑制突发噪声性能对比(MATLAB实现)中 LDPC码对突发噪声的抑制性能作一个补充仿真,结果如下 代码如下: % LDPC code clear; close all; clc Nb = 203000; % number of bit…

锅炉汽包温度控制系统设计(过程控制课程设计matlab/simulink)

微信公众号&#xff1a;创享日记 发送&#xff1a;锅炉汽包 获取完整报告matlab/simulink仿真源文件 一、组员任务分工说明 xxx同学负责绘画出带控制点的工艺流程图&#xff0c;并构建控制方案的原理方框图。xxx同学完成了在MATLAB中仿真模型的搭建&#xff0c;参数调试和仿真结…

仿王者荣耀网页-前端网页技术设计完整精美源码HTML+CSS+JS

效果预览①主页首页 效果预览②游戏介绍页 效果预览③游戏攻略页 效果预览④手办商城页 效果预览⑤问卷调查页 效果预览⑥加入我们页 微信公众号&#xff1a;创享日记 发送&#xff1a;王者荣耀 获取完整源码&#xff08;打开即可用&#xff09; 其余及源码详见下载&…

仿今日头条实时新闻微信小程序项目源码

微信公众号&#xff1a;创享日记 发送&#xff1a;今日头条 获取完整源码&#xff08;微信开发者工具导入即可用&#xff09; 以下可以忽略不看&#xff01; 今日头条是北京字节跳动科技有限公司开发的一款基于数据挖掘的推荐引擎产品&#xff0c;为用户推荐信息、提供连接人与…

perl大骆驼和小骆驼_从代码内部:骆驼路由引擎第一部分

perl大骆驼和小骆驼因此&#xff0c;最近我重新燃起了对Apache Camel的工作方式的兴趣。 Camel是一种功能强大的集成工具&#xff0c;使用非常广泛&#xff0c;但是只要我将其投入使用&#xff0c;我都会忍不住想“好吧&#xff0c;这到底是怎么做的&#xff01;” …我只是有一…

高频小信号谐振放大器设计-课程设计Multisim仿真

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;高频课设 获…

微波技术基础实验二 功分器与定向耦合器设计

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;耦合器 获取…

微波技术基础实验一 滤波器的设计

微信公众号&#xff1a;创享日记 发送&#xff1a;滤波器 获取完整报告工程源文件 一、新建滤波器工程和设计原理图 新建一个workspace&#xff0c;并创建原理图。在图中放置电容、电感并用导线连接。双击电容和电感&#xff0c;设置电容为2pF&#xff0c;电感为1.5nH&#xff…

微波技术大作业课设-分立电容电感+微带单枝短截线+微带双枝短截线

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;微带 获取完…

java 观察者模式示例_Java中的观察者设计模式-示例教程

java 观察者模式示例观察者模式是行为设计模式之一 。 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时&#xff0c;观察者设计模式很有用。 在观察者模式中&#xff0c;监视另一个对象状态的对象称为Observer &#xff0c;而正在监视的对象称为Subject 。 根据GoF&am…

电磁场与电磁波实验一 熟悉Matlab软件在电磁场领域的应用

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记 发送&#xff1a;matlab电磁…