1、首先在oracle数据库中创建产品product的表,其SQL语句如下。
CREATE TABLE "GPP"."TB_PRODUCT"
( "ID" NUMBER(11,0),
"PRODUCT_NAME" VARCHAR2(40),
"STATUS" NUMBER(2,0),
"PRICE" NUMBER(10,2),
"PRODUCT_DESC" VARCHAR2(255),
"CAPTION" VARCHAR2(255),
"INVENTORY" NUMBER(11,0),
CONSTRAINT "TB_PRODUCT_PK" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "GPP" ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "GPP"
COMMENT ON COLUMN "GPP"."TB_PRODUCT"."PRODUCT_NAME" IS '名称'
COMMENT ON COLUMN "GPP"."TB_PRODUCT"."STATUS" IS '状态'
COMMENT ON COLUMN "GPP"."TB_PRODUCT"."PRICE" IS '单价'
COMMENT ON COLUMN "GPP"."TB_PRODUCT"."PRODUCT_DESC" IS '描述'
COMMENT ON COLUMN "GPP"."TB_PRODUCT"."CAPTION" IS '标题'
COMMENT ON COLUMN "GPP"."TB_PRODUCT"."INVENTORY" IS '库存'
COMMENT ON TABLE "GPP"."TB_PRODUCT" IS '商品表';
并插入一条数据
2、使用idea创建一个空的maven父工程,然后创建一个名为product_service的maven子工程。其父pom文件代码如下.
<?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.flyrain</groupId>
<artifactId>spring_cloud_parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>product_service</module>
<module>order_service</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>http://repo.spring.io/libs-snapshot-local</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>http://repo.spring.io/libs-milestone-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>http://repo.spring.io/libs-release-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>http://repo.spring.io/libs-snapshot-local</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>http://repo.spring.io/libs-milestone-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
product_service的pom文件如下。
<?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">
<parent>
<artifactId>spring_cloud_parent</artifactId>
<groupId>com.flyrain</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>product_service</artifactId>
<dependencies>
<!--oracle依赖-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency>
<!--jpa依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
</project>
3、product_service的配置文件application.yml配置如下。
server:
port: 9002 #端口
spring:
application:
name: service-product #服务名称
datasource: #连接oracle数据库
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:ORCL
username: gpp
password: gpp
jpa: #jpa相关配置
database: oracle
show-sql: true
open-in-view: true
4、创建product_service的springboot的启动文件,代码如下所示。
package com.flyrain.product;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
@SpringBootApplication
@EntityScan("com.flyrain.product.entity")
public class ProductApplication {
public static void main(String[] args) {
SpringApplication.run(ProductApplication.class,args);
}
}
5、创建实体类Product,代码如下。
package com.flyrain.product.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;
@Data
@Entity
@Table(name = "TB_PRODUCT")
public class Product {
@Id
private Long id;
private String productName;
private Integer status;
private BigDecimal price;
private String productDesc;
private String caption;
private Integer Inventory;
}
6、创建dao接口,名为ProductDao,继承JpaRepository和JpaSpecificationExecuto两个类,我们就不用在去写一些增删改查的方法了,可以直接去调用其已经实现了的方法。
package com.flyrain.product.dao;
import com.flyrain.product.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
public interface ProductDao extends JpaRepository<Product,Long>,JpaSpecificationExecutor<Product> {
}
7、然后编写service层的接口和实现类,代码如下所示。
package com.flyrain.product.service;
import com.flyrain.product.entity.Product;
public interface ProductService {
//根据id查询
Product findById(Long id);
//保存
void saveProduct(Product product);
//更新
void updateProduct(Product product);
//删除
void deleteProductById(Long id);
}
package com.flyrain.product.service.impl;
import com.flyrain.product.dao.ProductDao;
import com.flyrain.product.entity.Product;
import com.flyrain.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao productDao;
@Override
public Product findById(Long id) {
return productDao.findById(id).get();
}
@Override
public void saveProduct(Product product) {
productDao.save(product);
}
@Override
public void updateProduct(Product product) {
productDao.save(product);
}
@Override
public void deleteProductById(Long id) {
productDao.deleteById(id);
}
}
8、编写controller层代码,其代码如下所示。
package com.flyrain.product.controller;
import com.flyrain.product.entity.Product;
import com.flyrain.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/product")
public class ProductController {
@Autowired
private ProductService productService;
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable Long id){
System.out.println("id :"+id);
return productService.findById(id);
}
@RequestMapping(value = "/save",method = RequestMethod.POST)
public String saveProduct(@RequestBody Product product){
productService.saveProduct(product);
return "保存成功";
}
}
9、启动项目,访问浏览器: http://localhost:9002/product/1,其效果显示如下。
至此,产品服务已经编写成功了,其结构如下所示。
10、在父项目下同样创建一个子maven项目order_service,其pom文件和product服务的pom文件一致,配置文件application.yml如下,仅修改了端口号和服务名称。
server:
port: 9003 #service端口号
spring:
application:
name: service_order
datasource:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:ORCL
username: gpp
password: gpp
jpa:
database: oracle
show-sql: true
open-in-view: true
11、编写启动类,OrderApplication,此处先创建RestTemplate对象交给spring管理,后面会调用,代码如下。
package com.flyrain.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EntityScan(value = "com.flyrain.order.entity")
public class OrderApplication {
//配置RestTemplate交给spring管理
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
12、编写controller层代码,调用服务Product,代码如下所示。
package com.flyrain.order.controller;
import com.flyrain.order.entity.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
public Product getProduct(@PathVariable Long id){
//通过restTemplate调用商品微服务
Product product = restTemplate.getForObject("http://127.0.0.1:9002/product/1",Product.class);
System.out.println("product : "+product);
return product;
}
}
其中实体类我们还是需要在order_service子项目下再编写一遍,不过此时就不需要Table注解了,因为不需要连接数据库,代码如下。
package com.flyrain.order.entity;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Product {
private Long id;
private String productName;
private Integer status;
private BigDecimal price;
private String productDesc;
private String caption;
private Integer Inventory;
}
其结构如下所示。
13、 启动order_service项目,然后访问浏览器,http://127.0.0.1:9003/order/buy/1,显示效果如图所示。
由于我们是在本地编写的,所以ip地址使用的是127.0.0.1,如果该product_service在其他机器上,那就使用该机器的ip地址,实现远程调用能力。
此时,可以看到这个小案例存在很多问题,地址我们在此是写死的,存在硬编码问题,还有其他一些问题,就不在一一赘述了,欢迎大家使用SpringCloud......
路漫漫其修远兮,吾将上下而求索,希望此篇文章对大家有所帮助......