本文用到

1、linux服务器(阿里云服务器,CentOS 7.3 64位 ),并利用docker安装好oracle

2、服务器远程连接工具(Xshell 5);

3、数据库管理工具(navicat for oracle);

4、java ide(IntelliJ IDEA 2017);

5、oracle驱动(ojdbc-6.jar);

6、maven(apache-maven-3.2.3),配好阿里云镜像

7、springboot v2.1.0.RELEASE;

8、jdk1.8.0_74

 

前言

一直用springboot+mysql开发比较多,第一次使用springboot+oracle开发。由于数据库的差异走了一些弯路,本文会着重比较下2种数据库在springboot上开发的差异。

 

 

代码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.itaem</groupId>
	<artifactId>cms_o</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>cms_o</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.0.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>1.0</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

差异1:pom文件oracle驱动的引入,这也是最大的坑,文章后面会讲到

 

application.yml(配置文件)

server:
  port: 8080
  servlet:
    context-path: /cms_o

spring:

  datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@YourServerIP:1521:xe
    username: system
    password: oracle

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.Oracle10gDialect

差异2:在配置文件上数据库连接信息的填写

驱动为:oracle.jdbc.driver.OracleDriver,若报错,则说明oracle驱动依赖未正确引入

url格式:jdbc:oracle:thin:@YourServerIP:端口号:sid

username:system

password:oracle

由于在docker搭建oracle,username、password、sid分别默认为system、oracle、xe

jdbc:代表以jdbc的方式连接;
oracle:表示连接的是oracle数据库;
thin:表示连接时采用thin模式(oracle中有两种模式);
@表示地址;
localhost:1521:orcl中localhost代表本地数据库,1521代表本地数据库端口号,orcl代表本地数据库的sid。
关于thin的解释:
thin是一种瘦客户端的连接方式,即采用这种连接方式不需要安装oracle客户端,只要求classpath中包含jdbc驱动的jar包就行。thin就是纯粹用Java写的ORACLE数据库访问接口。
oci是一种胖客户端的连接方式,即采用这种连接方式需要安装oracle客户端。oci是Oracle Call Interface的首字母缩写,是ORACLE公司提供了访问接口,就是使用Java来调用本机的Oracle客户端,然后再访问数据库,优点是速度
快,但是需要安装和配置数据库。

Person.java(实体类)

package ...Entity;

import javax.persistence.*;

@Entity
@Table(name="person")
public class Person {

    @Id
    @GeneratedValue
    @Column(nullable = false, unique = true)
    private Integer id;

    @Column(length = 32)
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

 

PersonRepository.java(jpa仓库)

package ...repository;

import ...Person;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

public interface PersonRepository extends CrudRepository<Person, Integer>, JpaSpecificationExecutor<Person> {

    Person findByIdAndName(Integer id, String name);

    List<Person> findByName(String name);
}

 

PersonRepositoryTest.java(测试类)

package com.itaem.cms_o.dao;

import ...entity.Person;
import ...repository.PersonRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest
public class PersonRepositoryTest {

    @Autowired
    private PersonRepository personDao;

    @Test
    public void test() {
        Person person = new Person();
        person.setId(1);
        person.setName("zhangsan");
        personDao.save(person);
        System.out.println(person);

//        boolean bool = personDao.existsById(1);
//        System.out.println(bool);
//        System.out.println("hello");
    }

    @Test
    public void test2() {
        Person person = personDao.findByName("zhangsan").get(0);
        System.out.println(person);
    }

    @Test
    public void test3() {
        Person person = personDao.findByIdAndName(21, "zhangsan");
        System.out.println(person);
    }
}

 

运行代码如上所示,若启动类、测试类各方法正常运行

用navicat查看数据库是否有变动(表的位置在system的表里)

到此,springboot+oracle搭建完成

 

总结

可见,springboot还是很强大的,对oracle也能很好地支持。有了jpa,就省去了很多手写sql的麻烦。本文只写到dao层,后面service和controller层就跟mysql没什么大差别了。

 

————————————————————————分割线—————————————————————————————

 

接下来谈谈搭建这个项目遇到的坑:

 

oracle驱动

虽然能在maven仓库里搜索到,但貌似不能用,原因是oracle是要收费的,不能通过远程的方式来引入,只能通过配置本地库来加载到工程里。下面讲解如何配置本地库加载到工程:

1)下载oracle的驱动jar包:

oracle官网地址:http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

事先声明的是,oracle驱动的版本要与jdk的版本相匹配(本文ojdbc-6.jar与jdk1.8,亲测可行),若版本差异过大,则抛版本不匹配的异常

链接:https://pan.baidu.com/s/1IejeuRbwBlQATphIgQulJw 
提取码:0t9u 

这里可以使用博主提供的jar包

2)将oracle驱动包打包到本地仓库

得到jar包后,打开cmd,输入以下maven命令

mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=1.0 -Dpackaging=jar -Dfile=你的jar包路径

groupId、artifactId、version就是maven的gav坐标,因为是打包到本地仓库,理论上是可以随便定的,但名字也不要起得一点关联都没有,不然以后就搞不懂这个依赖是干嘛用的了

packaging:打包方式,这里为jar

-Dfile=后面接的是你驱动包的实际路径

3)在pom.xml添加maven依赖

注意groupId、artifactId、version即gav坐标要与命令输入的相一致,然后reimport一下pom文件即可

ps:确认idea上配置的maven仓库跟你打包的maven仓库相一致,不然还是会报错

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐