在本教程中,我们将展示如何创建一个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

Spring Boot&JPA&Hibernate&Oracle相关推荐

  1. Primefaces,Spring 4 with JPA(Hibernate 4 / EclipseLink)示例教程

    Primefaces,Spring 4 with JPA(Hibernate 4 / EclipseLink)示例教程 Java Persistence API是标准规范.它提供了一个由不同实现者框架 ...

  2. spring boot 系列之四:spring boot 整合JPA

    上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...

  3. Spring Boot集成JPA的Column注解命名字段无效的问题

    偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名. Spring Boot版本:1.5.4.release 数据表: id int, userNam ...

  4. 使用PostgreSQL使用Spring Boot和JPA构建基本应用

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 每个不平 ...

  5. Spring Boot Data JPA

    Spring Data JPA简介 用来简化创建 JPA 数据访问层和跨存储的持久层功能. Spring Data JPA提供的接口 Repository:最顶层的接口,是一个空的接口,目的是为了统一 ...

  6. Spring Boot整合Jpa多数据源

    Spring Boot整合Jpa多数据源 本文是Spring Boot整合数据持久化方案的最后一篇,主要和大伙来聊聊Spring Boot整合Jpa多数据源问题.在Spring Boot整合JbdcT ...

  7. Spring boot整合jpa Jquery实现三级联动

    Spring boot 整合jpa JQuery 实现省,市,区, 三级联动效果 三级联动在很多项目都必不可少,尤其是在付款时,需要选取地址,为了更好的用户体验感,从而出现了三级联动. 实现三级联动的 ...

  8. Spring ORM示例 - JPA,Hibernate,Transaction

    Spring ORM示例 - JPA,Hibernate,Transaction 欢迎来到Spring ORM示例教程.今天我们将使用Hibernate JPA事务管理来研究Spring ORM示例. ...

  9. Spring Boot基础学习笔记07:Spring Boot整合JPA

    文章目录 零.学习目标 1.熟悉Spring Data JPA基本语法和使用 2.掌握Spring Boot与JPA的整合使用 一.Spring Data JPA概述 1.Spring Data JP ...

  10. Spring Boot整合JPA和人大金仓(Kingbase8)数据库

    Spring Boot整合JPA和人大金仓(Kingbase8)数据库 简介 在开发Java应用程序时,使用JPA(Java Persistence API)可以方便地进行数据库操作.而人大金仓(Ki ...

最新文章

  1. Ghost后只有一个C盘解决方法(转)
  2. 看微信了解MySQL及相关IT技术
  3. Qt QTcpSocket 对连接服务器中断的不同情况进行判定
  4. 常用于解决放缩问题的基本不等式及其几何直观证明
  5. SCI EI 期刊等讨论站点
  6. Picasso源码阅读笔记六
  7. Flashcache
  8. Java 学习笔记(官方不推荐写法篇)
  9. Javascript 判断浏览器是否为IE的最短方法
  10. MyEclipse SVN插件的安装
  11. VB2010连接 三种数据库 源代码
  12. 以太坊Whisper协议
  13. 10大改变世界的未来科技
  14. Python之signal模块详解
  15. CSS核心内容-标准流、盒子模型、浮动、定位
  16. 6-6 使用函数判断完全平方数 (10 分)(C语言版)
  17. windows开机的问题
  18. 「wps教程」Word里的大神器隐藏技能
  19. Shell脚本 单引号、双引号和反引号的区别
  20. python pip安装报错_Python pip安装失败:无效命令egg_info

热门文章

  1. 15、sql编程基本语法介绍
  2. Spring框架-事务管理注意事项
  3. Oracle入门(十二B)之表创建
  4. 使用ADO.NET查询和操作数据
  5. java实现字符逆序输出
  6. SpringCloud Netflix Hystrix
  7. JavaScript ECMA
  8. React中的方法调用
  9. 稀疏数组与二维数组相互转化
  10. SpringBoot+MyBatis搭建迷你小程序