# 内容摘要

  • 常用的开发结构
  • 星星点点的小技巧

# 1. 常用开发结构

最简单的 Springboot 集成 Spring Data JPA 教程: https://blog.csdn.net/huanongying123/article/details/104279231

  • 新建 springboot 项目,命名为 demo,springboot 版本为 2.2.9.RELEASE

    1
    2
    3
    4
    5
    6
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.9.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
    </parent>
  • 在 pom 文件中,导入依赖的 jar 包

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <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>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
    </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>
    </dependency>
    </dependencies>
  • resources 目录下新建一个配置文件 application.yml ,也可以直接在原有的配置文件 application.properties 中添加相关配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server:
    port: 8080

    spring:
    datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root # 替换为你本地mysql的用户名和密码
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    jpa:
    show-sql: true # 执行数据库操作时,在控制台打印sql语句
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect # 数据库方言配置
    hibernate:
    ddl-auto: update # 第一次加载自动建立表,服务重启会进行表的更新

    设置服务器端口号为 8080,这样我们可以通过 http://127.0.0.1:8080 访问我们的程序

    设置数据库 mysql,这里我们需要在本地的 mysql 中创建一个 test 数据库,命令行中操作如下

    1
    2
    3
    4
    [root@host]# mysql -u root -p   
    Enter password:****** # 登录后进入终端

    mysql> create DATABASE test;

    设置 jpa 相关参数,jpa 全称 Java Persistence API,定义了一系列标准,让实体类和数据库中的表建立一个对应关系,使我们在 java 中操作实体类就能达到操作数据库中表的效果。 jpa 介绍博客 https://zhuanlan.zhihu.com/p/110024146

  • 代码分层

    spring boot 框架一般分为 dao、model、controller、service 四层。具体代码结构如下图所示:

    image-20201126201354029

    图中我将 controller 用 rest 代替,仅是个人习惯

    • dao 层

      负责访问数据库,无需写复杂的 sql 语言,可以根据命名规则定义相应的查询方法。示例如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      package com.example.demo.dao;

      import com.example.demo.model.TestBean;
      import org.springframework.data.jpa.repository.JpaRepository;
      import java.util.Optional;

      public interface TestDao extends JpaRepository<TestBean, String> {
      Optional<TestBean> findById(String id);
      TestBean findByName(String Name);
      }

      TestDao 继承了 JpaRepositoryJpaRepository 可以查找所有实体,执行缓存和数据库同步。 JpaRepository 接口有 2 个泛型参数,第一个为实际存储的类型,第二个参数为主键。

      上例中存储的类型为 TestBean ,而 TestBean 的主键类型为 String。

      根据命名规则我们定义了 findById 方法来查询指定 id 的 TestBean

      Optional 用来处理可能出现的空指针问题,具体用法见 https://www.jianshu.com/p/c1480145a961

    • model 层

      也称 Entity(实体)层或 pojo(plain old java object)层,一般数据库中一张表对应一个实体类,类属性同表字段一一对应。简单示例如下

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      package com.example.demo.model;

      import lombok.Data;
      import javax.persistence.*;

      @Data
      @Entity
      @Table(name = "test_table")
      public class TestBean {
      @Id
      private String id;
      private String name;
      }

      @Data 可以提高代码的简介度,省去了代码中大量的 get ()、set ()、toString () 等方法。介绍: https://www.jianshu.com/p/c1ee7e4247bf

      @Entity 声明该类为实体类

      @Id 标注用于声明一个实体类的属性映射为数据库的主键列

      @Id 详解 https://xiaoxiami.gitbook.io/spring-boot/guan-xi-xing-shu-ju-ku/spring-data-jpa/id-he-generatedvalue-xiang-jie

      @Table 将实体类与数据表 test_table 绑定,第一次操作实体类会生成相应的数据表

    • rest 层

      负责前后端交互,接收前端 GET/POST 请求,调用 service 层中的处理函数,接收 service 层的返回数据,并将其返回给前端。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      package com.example.demo.rest;

      import com.example.demo.model.TestBean;
      import com.example.demo.service.TestServiceImp;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.*;

      @RestController
      @RequestMapping("demo")
      public class TestService {
      @Autowired
      private TestServiceImp testServiceImp;

      @PostMapping("/add")
      public String add(@RequestBody TestBean testBean){
      return testServiceImp.add(testBean);
      }
      }

      声明了一个接口 “demo/add”,实现了添加 testBean 的功能。成功返回 “success”,失败返回 “fail”。可以通过访问 http://127.0.0.1:8080/demo/add 来调用这个接口

      @RequestBody 会自动将 post 中的数据包装为 TestBean 形式

    • service 层

      业务逻辑层,调用 dao 层接口,完成基本功能设计

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      package com.example.demo.service;

      import com.example.demo.dao.TestDao;
      import com.example.demo.model.TestBean;
      import lombok.extern.slf4j.Slf4j;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;

      @Service
      @Slf4j
      public class TestServiceImp {
      @Autowired
      private TestDao testDao;

      public String add(TestBean testBean){
      try {
      testDao.save(testBean);
      return "success";
      } catch (Exception e) {
      log.error("add testBean error!", e);
      return "fail";
      }
      }
      }

      使用 TestDao 操作实体类 TestBean ,进行保存。

  • 程序使用效果

    运行程序,使用 postman 进行测试,结果如下:

    image-20201126203059798

    打开 DataGrip 查看数据库中的表,结果如下图:

    image-20201126203405965

    至此,一个极简 springboot 项目就完成了 o

# 2. 星星点点的小技巧

  • List 和 String 互相转换

    1
    2
    3
    // List => String
    List<Integer> intList = Arrays.asList(1,2,3);
    System.out.println(intList.toString());

    结果:

    1
    [1, 2, 3]

    使用 List.toString () 功能即可得到 List 的 String 表示

    1
    2
    3
    4
    //String => List
    String listStr = "[1,2,3]"
    ObjectMapper mapper = new ObjectMapper();
    List<Integer> resList = Arrays.asList(mapper.readValue(listStr, Integer[].class));
  • restful 接口简单获取 POST/GET 请求参数

    1
    2
    3
    4
    5
    // 假设post 请求  {"id": "0"}
    @PostMapping(value="/test")
    public void get(@RequestParam String id){
    System.out.println(id);
    }

    使用 @RequestParam 注解,当没有指定 value 时,将会接受与变量名相同的请求参数

    接收参数的方式: https://juejin.cn/post/6844903866421477384

  • java1.8 Stream 机制

    可以用简单的语句完成一系列操作

    参考博客: https://colobu.com/2016/03/02/Java-Stream/

    使用 Stream 进行数组过滤:

    1
    2
    3
    4
    5
    List<Integer> l = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    List<Integer> t = l.stream() // 生成一个stream对象
    .filter( i -> i % 2 == 0) // 返回满足断言(predicate)的数据。
    .collect(Collectors.toList());
    System.out.println(t); //[2, 4, 6, 8]
  • 依赖全部爆红的解决

    博客: https://blog.csdn.net/u014672466/article/details/80211340

    把依赖全部注释,Maven 刷新一下,解开注释,再重新刷新一遍,解决。

寻李白
——痛饮狂歌空度日 飞扬跋扈为谁雄
余光中
那一双傲慢的靴子至今还落在
高力士羞愤的手里,人却不见了
把满地的难民和伤兵
把胡马和羌笛交践的节奏
留给杜二去细细的苦吟
自从那年贺知章眼花了
认你做谪仙,便更加佯狂
用一只中了魔咒的小酒壶
把自己藏起来,连太太也寻不到你
怨长安城小而壶中天长
在所有的诗里你都预言
会突然水遁,或许就在明天
只扁舟破浪,乱发当风
——而今,果然你失了踪

树敌如林,世人皆欲杀
肝硬化怎杀得死你
酒入豪肠,七分酿成了月光
余下的三分啸成剑气
绣口一吐,就半个盛唐
从开元到天宝,从洛阳到咸阳
冠盖满途车骑的嚣闹
不及千年后你的一首
水晶绝句轻叩我额头
当地一弹挑起的回音

一贬世上已经够落魄
再放夜郎毋乃太难堪
至今成谜是你的籍贯
陇西或山东,青莲乡或碎叶城
不如归去归哪个故乡
凡你醉处,你说过,皆非他乡
失踪,是天才唯一的下场
身后事,究竟你遁向何处
猿啼不住,杜二也苦劝你不住
一回头囚窗下竟已白头
七仙、五友,都救不了你了
匡山给雾锁了,无路可入
仍炉火未纯青,就半粒丹砂
怎追蹑葛洪袖里的流霞

樽中月影,或许那才是你故乡
常得你一生痴痴地仰望
而无论出门向东哭,向西哭
长安却早已陷落
这二十四万里的归程
也不必惊动大鹏了,也无须招鹤
只消把酒杯向半空一扔
便旋成一只霍霍的飞碟
诡绿的闪光愈转愈快
接你回传说里去

1980.4.27
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

chaihj15 微信支付

微信支付

chaihj15 支付宝

支付宝