springcloud筆記1——初始項目

最基礎的項目,不涉及到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.測試

分別啓動提供者項目和消費者項目,訪問消費者接口

在這裏插入圖片描述
在這裏插入圖片描述
表已經自動創建成功,數據通過接口插入成功。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章