当前位置: 首页 > news >正文

Spring Cloud学习笔记--Spring Boot初次搭建

1. Spring Boot简介

初次接触Spring的时候,我感觉这是一个很难接触的框架,因为其庞杂的配置文件,我最不喜欢的就是xml文件,这种文件的可读性很不好。所以很久以来我的Spring学习都是出于停滞状态的。

不过这种状态在我接触了Spring Boot之后,就发生了改变。Spring官方可能也觉得庞杂的配置是一件很不优雅的事情,虽然加入了包扫描,但是也没有触及灵魂。

Spring还有一个问题就是依赖的冲突问题,这个对我这种半道出家的程序员来说更是痛苦至极。

还好,所有的痛苦都被Spring Boot终结了。

Spring Boot有三个特点:

  • 自动配置
  • 起步依赖
  • Actuator对运行状态的监控

每一个特点都那么的美好。

其实开发人员的本职工作是什么?是完成业务代码的编写,实现业务功能,因此如果消耗大量时间在Spring本身的配置和依赖冲突解决上,那么等于是浪费了大量的时间。

Spring Boot的出现,可以说是对生产力的一次解放。

闲话少叙,看一个需求。

我现在想要写一个工具,连接数据库,实现增删改查功能,恐怕很多程序员会回忆起最初学习Java的时候,那堪称ugly的JDBC模板代码了吧。我本身是一个DBA,因为公司安排,写过很多JDBC代码,深刻的感觉到这种代码实在浪费时间,后来接触了JPA框架,感觉非常好。下面就用Spring Boot来实现一个数据库的增删改查功能。

2. Spring Boot实战JPA

数据库我会使用H2,这种嵌入式的数据库最适合在家学习的时候使用,很小,支持最基本的数据库操作,只要不涉及到太深刻的内容,感觉和MySQL差不多。至于如何在本机上启动一个H2 Server,就不在这里描述了。

首先呢,打开IDEA,遵循下面的顺序:
new Project ->Spring Initializr ->填写group、artifact ->钩上web(开启web功能)->点下一步就行了。

组件选择

上图是我选择的需要的组件。

既然是JPA,那么我们首先要定义一个Entity,我的表叫做Demo,那么Entity也就是叫做Demo:

package com.example.springwithjdbc.entity;


import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
@Data
public class Demo {
    @Id
    @GeneratedValue
    private int id;
    
    private String uname;
}

注解解释:

  1. @Entity:表示这个类是个Entity;
  2. @Data:这是lombok提供的功能,这个注解加上之后,就不需要写getter和setter了,也不用写toString方法,都会自动生成;
  3. @Id:表示这个是主键;
  4. @GeneratedValue:表示采用自增

接下来,需要经典的DAO层出现了:

package com.example.springwithjdbc.dao;

import com.example.springwithjdbc.entity.Demo;
import org.springframework.data.jpa.repository.JpaRepository;

public interface DemoDao extends JpaRepository<Demo, Integer> { }

DAO层只是定义了一个interface,没有进行任何实现,其实也不需要进行任何具体的实现,注意继承的JpaRepository,它帮我们做了很多需要我们原先手动编码的工作。

接下来就是经典的Service层了,Service即业务层:

package com.example.springwithjdbc.service;

import com.example.springwithjdbc.entity.Demo;

import java.util.List;

public interface IDemoService {
    Demo add(Demo demo);

    Demo findById(int id);

    List<Demo> findAll();
}

以上代码是service的接口,接下来编写具体的实现:

package com.example.springwithjdbc.service;

import com.example.springwithjdbc.dao.DemoDao;
import com.example.springwithjdbc.entity.Demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DemoService implements IDemoService {
    @Autowired
    private DemoDao demoDao;

    @Override
    public Demo add(Demo demo) {
        return demoDao.save(demo);
    }

    @Override
    public Demo findById(int id) {
        return demoDao.findById(id).get();
    }

    @Override
    public List<Demo> findAll() {
        return demoDao.findAll();
    }
}

注解解释:

  1. @Service:表示这是一个Service;

  2. @Autowired:将DemoDao注入。

接下来,我们需要一个Controller来实现REST接口:

package com.example.springwithjdbc.controller;

import com.example.springwithjdbc.entity.Demo;
import com.example.springwithjdbc.service.IDemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/")
public class DemoRestController {
    @Autowired
    IDemoService demoService;

    @PostMapping("/save")
    public String save(@RequestParam(name = "name")String name) {
        Demo demo = new Demo();
        demo.setUname(name);
        return demoService.add(demo).toString();
    }

    @GetMapping("/find")
    public String findById(@RequestParam(name = "id")int id) {
        return demoService.findById(id).toString();
    }

    @GetMapping("/list")
    public String findAll() {
        List<Demo> demoList = demoService.findAll();
        return demoList.toString();
    }
}

最后,配置application.yml,配置数据源:

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/code/h2/bin/demo
    username: admin
    password: admin
  jpa:
    show-sql: true

启动这个工程即可,接下来就可以用浏览器或者postman进行测试了,这是我用postman进行的测试,首先发送一个POST请求,写入一条数据:

写入一条数据

下面我们查询这条数据:

查询单条记录

多写几条数据以后,调用list接口:

批量查询接口

到这里,我们已经成功的编写了一段基于Spring Boot的JPA代码,实现了简单的新增和查询功能。比我之前写的JDBC代码不知道简单到哪里去了,而且也更加的优雅了,再也没有那么多复杂的让人难以看懂的xml配置了。

Spring甚至贴心到做了一个网站专门生成工程骨架。

3. 小结

我最近在学习微服务,要学习微服务绕不开的就是Spring Cloud,而Spring Cloud离不开Spring Boot。因此首先了解Spring Boot是很有必要的。

这是我的笔记整理出来的第一篇,希望能够帮助到其他和我一样在学习微服务,学习Spring Cloud,学习Spring Boot的人。

转载于:https://www.cnblogs.com/wingsless/p/10699443.html

相关文章:

  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 基于时间轮的定时器
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 前后端分离,tomcat特殊字符不识别问题
  • 纯前端的分页(利用vant的List组件)
  • 汉诺塔问题(Hanoi Tower)递归算法解析(Python实现)
  • 数据库(MySQL)
  • Hive分桶
  • 第三章:内存分配与回收策略
  • visual studio 命令行 build
  • 摘要商城总结
  • StringBuufer与StringBulder线程的区别
  • 微信分享到朋友圈,怎么自定义分享的标题,图片,内容?
  • BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
  • 今日学习20190425
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Angular Elements 及其运作原理
  • css系列之关于字体的事
  • git 常用命令
  • uni-app项目数字滚动
  • WebSocket使用
  • 猴子数据域名防封接口降低小说被封的风险
  • 讲清楚之javascript作用域
  • 开源SQL-on-Hadoop系统一览
  • 使用 Docker 部署 Spring Boot项目
  • 使用 QuickBI 搭建酷炫可视化分析
  • 使用agvtool更改app version/build
  • 微服务框架lagom
  • gunicorn工作原理
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (+4)2.2UML建模图
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (六)激光线扫描-三维重建
  • (篇九)MySQL常用内置函数
  • (十)c52学习之旅-定时器实验
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)IOS中获取各种文件的目录路径的方法
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET上SQLite的连接
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @synthesize和@dynamic分别有什么作用?
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [20180224]expdp query 写法问题.txt
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...