最基礎的項目,不涉及到springcloud註冊中心和高級配置,後面的項目在這個基礎上添磚加瓦。
1.創建提供者程 工程 provider-01-8081
1.1 新建 Spring Initializr 工程,命名爲 provider-01-8081,pom依賴如下:
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--修改MySQL驅動版本-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
1.2 定義實體類
@Data
@Entity // 使用Hibernate映射機制自動生成DB中的表
public class Depart {
@Id // 指定映射到DB表中的主鍵
@GeneratedValue(strategy = GenerationType.IDENTITY) // id自動遞增
private Integer id;
private String name;
}
1.3 定義 Repository 接口
/**
* 這是一個接口
* 第一個泛型表示當前Repository所操作的對象類型
* 第二個泛型表示當前Repository所操作的對象的id類型
*/
public interface DepartRepository extends JpaRepository<Depart, Integer> {
}
1.3 定義 service 接口 和 實現類
public interface DepartService {
boolean saveDepart(Depart depart);
boolean removeDepartById(int id);
boolean modifyDepart(Depart depart);
Depart getDepartById(int id);
List<Depart> listAllDeparts();
}
@Service
public class DepartServiceImpl implements DepartService {
@Autowired
private DepartRepository repository;
// 插入
@Override
public boolean saveDepart(Depart depart) {
// JPA中的save()方法可以完成插入與修改
// 若參數的id爲null,則執行的是插入操作
// 若參數的id不爲null,且在DB中存在該id,則執行的是修改
// 若參數的id不爲null,但該id在DB中不存在,則執行的是插入。
// 需要注意,插入的記錄的id並不是指定的這個id,而是DB自動生成的
Depart obj = repository.save(depart);
if(obj != null) {
return true;
}
return false;
}
// 根據id刪除
@Override
public boolean removeDepartById(int id) {
if(repository.existsById(id)) {
// deleteById()中指定的id若在DB中不存在,則拋出異常
repository.deleteById(id);
return true;
}
return false;
}
// 修改
@Override
public boolean modifyDepart(Depart depart) {
Depart obj = repository.save(depart);
if(obj != null) {
return true;
}
return false;
}
// 根據id查詢
@Override
public Depart getDepartById(int id) {
if(repository.existsById(id)) {
// getOne()中指定的id若不存在,則拋出異常
return repository.getOne(id);
}
Depart depart = new Depart();
depart.setName("no this depart");
return depart;
}
// 查詢所有
@Override
public List<Depart> listAllDeparts() {
return repository.findAll();
}
}
1.4 定義 控制器
@RequestMapping("/provider/depart")
@RestController
public class DepartController {
@Autowired
private DepartService service;
@PostMapping("/save")
public boolean saveHandle(@RequestBody Depart depart) {
return service.saveDepart(depart);
}
@DeleteMapping("/del/{id}")
public boolean deleteHandle(@PathVariable("id") int id) {
return service.removeDepartById(id);
}
@PutMapping("/update")
public boolean updateHandle(@RequestBody Depart depart) {
return service.modifyDepart(depart);
}
@GetMapping("/get/{id}")
public Depart getHandle(@PathVariable("id") int id) {
return service.getDepartById(id);
}
@GetMapping("/list")
public List<Depart> listHandle() {
return service.listAllDeparts();
}
}
1.5 修改配置文件
server:
port: 8081
# 設置Spring-Data-JPA
spring:
jpa:
# 指定在Spring容器啓動時是否自動建表
generate-ddl: true
# 指定在控制檯是否顯示SQL語句
show-sql: true
# 指定應用啓動時是否重新建表
hibernate:
ddl-auto: none
# 配置數據源
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?allowMultiQueries=true&characterEncoding=utf-8&useSSL=true
username: root
password: root
# 配置日誌
logging:
pattern:
console: level-%level %msg%n
level:
root: info
org.hibernate: info
# 指定spring.jpa.show-sql爲true時,是否顯示動態參數值
org.hibernate.type.descriptor.sql.BasicBinder: trace
# 指定spring.jpa.show-sql爲true時,是否顯示查詢語句的查詢結果
org.hibernate.type.descriptor.sql.BasicExtractor: trace
com.abc.provider: debug
2.創建消費者程 工程 consumer-01-8082
2.1 創建一個 Spring Initializr 工程並命名爲 consumer-01-8082,pom依賴如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
2.2 定義實體類
@Data
public class Depart {
private Integer id;
private String name;
}
2.3 定義restTemplate用於訪問提供者接口
@Configuration
public class DepartCodeConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2.4 定義處理器
@RestController
@RequestMapping("/consumer/depart")
public class DepartController {
@Autowired
private RestTemplate restTemplate;
private static final String SERVICE_PROVIDER = "http://localhost:8081";
@PostMapping("/save")
public boolean saveHandle(@RequestBody Depart depart) {
String url = SERVICE_PROVIDER + "/provider/depart/save";
// 1. 提交的請求URI
// 2. 要操作的對象
// 3. 提供者返回來的數據類型
return restTemplate.postForObject(url, depart, Boolean.class);
}
@DeleteMapping("/del/{id}")
public void deleteHandle(@PathVariable("id") int id) {
String url = SERVICE_PROVIDER + "/provider/depart/del/" + id;
restTemplate.delete(url);
}
@PutMapping("/update")
public void updateHandle(@RequestBody Depart depart) {
String url = SERVICE_PROVIDER + "/provider/depart/update";
restTemplate.put(url, depart, Boolean.class);
}
@GetMapping("/get/{id}")
public Depart getHandle(@PathVariable("id") int id) {
String url = SERVICE_PROVIDER + "/provider/depart/get/" + id;
return restTemplate.getForObject(url, Depart.class);
}
@GetMapping("/list")
public List<Depart> listHandle() {
String url = SERVICE_PROVIDER + "/provider/depart/list/";
return restTemplate.getForObject(url, List.class);
}
}
3.測試
分別啓動提供者項目和消費者項目,訪問消費者接口
表已經自動創建成功,數據通過接口插入成功。