javascript
Spring Boot&JPA&Hibernate&Oracle
在本教程中,我們將展示如何創(chuàng)建一個Spring Boot應用程序,該應用程序通過Hibernate與Oracle數(shù)據(jù)源進行通信。
先決條件:
- Eclipse IDE(最新版本)
- Maven的4
- Java 1.8
1-創(chuàng)建Maven項目
打開eclipse,然后創(chuàng)建一個新的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>現(xiàn)在,為了利用Spring數(shù)據(jù)jpa和休眠狀態(tài),我們只需添加spring-boot-starter-data-jpa作為依賴項:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>一旦在項目中包含Spring Boot Starter JPA ,我們就會從各種各樣的依賴項中獲得以下功能:
- 自動配置內(nèi)存中嵌入式數(shù)據(jù)庫,使您無需設置數(shù)據(jù)庫即可運行應用程序。
- 自動導入JPA API和Hibernate,添加此依賴項將自動導入JPA API并使用Hibernate作為默認實現(xiàn)。
- 從application.properties自動讀取數(shù)據(jù)源和休眠配置。
- 自動創(chuàng)建表實體并自動執(zhí)行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驅(qū)動程序添加到類路徑
在本教程中,我們將覆蓋Spring Boot提供的默認內(nèi)存數(shù)據(jù)庫,并使用我們自己的oracle數(shù)據(jù)庫。
為此,我們在WEB-INF / lib下添加“ oracle-ojdbc6-11.2.0.3.jar” ,并在類路徑中對其進行定義。
4- application.properties
配置oracle數(shù)據(jù)源并在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=debug5個實體
我們的實體代表一個球員和一個具有一對多關系的球隊,每個球隊可以有很多球員,而一個球員一次只能與一個球隊比賽。
因此,我們在com.programmer.gate.model包下創(chuàng)建實體:
播放器
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 ,因此我們的應用程序?qū)⒃跀?shù)據(jù)庫中自動創(chuàng)建Player和Team實體以及它們的順序和約束。
我們的應用程序還將在類路徑中查找import.sql并執(zhí)行(如果找到)。
在我們的示例中,我們在src / main / resources下定義import.sql ,以便用靜態(tài)數(shù)據(jù)填充表:
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方法提供了默認實現(xiàn),因此我們不必為它們定義實現(xiàn)類。
播放器存儲庫
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-服務
現(xiàn)在,我們定義服務類來保存應用程序的業(yè)務邏輯,我們的服務公開兩種方法: 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
最后一步是創(chuàng)建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應用程序會自動讀取并創(chuàng)建相對于初始化程序類所在位置的相同或子包中定義的實體,存儲庫和服務,因此如果我們在不同的包下定義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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 设计模式 示例_Java中的策
- 下一篇: TestContainers和Sprin