一、新建一个SpringBoot项目

下面的项目SDK跟Java版本要正确选择,Java版本一般都选择8

初始添加的依赖默认为上图三个,SpringBoot版本默认为2.6.3

这里我写的项目名为DruidTestApplication,创建成功后会出现以上默认主程序,可以看到,与一般的java源码不同,类上方有@SpringBootApplication字样,代表这是一个SpringBoot项目

二、了解与创建文件夹层次

1.代码层结构

  • 根目录:com.springboot
  • 工程启动类(ApplicationServer.java)置于com.springboot.build包下
  • 实体类(entity)置于com.springboot.domain
  • 数据访问层(Dao)置于com.springboot.repository
  • 数据服务层(Service)置于com,springboot.service
  • 前端控制器(Controller)置于com.springboot.controller
  • 工具类(utils)置于com.springboot.utils
  • 常量接口类(constant)置于com.springboot.constant
  • 配置信息类(config)置于com.springboot.config
  • 数据传输类(vo)置于com.springboot.vo

2.资源层结构

  • 根目录:src/main/resources
  • 配置文件(.properties/.json等)置于config文件夹下
  • 国际化(i18n))置于i18n文件夹下
  • spring.xml置于META-INF/spring文件夹下
  • 页面以及js/css/image等置于static文件夹下的各自文件下

若仅仅做我们如题的项目,我们只需要创建实体类、数据服务层、前端控制器即可,资源层方面只需配置 .properties文件即可

自行创建对应目录

三、配置及启动MySql数据库

以下为MySql 8.0.11 版本下载地址,以及单独的sql测试脚本下载地址(PS:为了方便起见,压缩包内已打包测试脚本)


1.配置系统环境变量

添加系统变量名为“MYSQL_HOME”,值为刚才解压的mysql文件夹路径

(注:这里我用的版本是8.0.27,你的应该是8.0.11)

双击Path,新建 %MYSQL_HOME%bin

2.观察sql脚本内容

打开文件夹内或者自己下载的test.sql文件(可以用记事本打开)

如上图的Database显示,我们需要创建一个名为spring_boot_test的数据库

如上图,我们在spring_boot_test数据库下运行此脚本,会建立一张MySQL数据表table_test,字段包含id, name, level, create_time, delete_flag, extension六项,varchar代表此字段数据类型对应Java中的String类型

3.启动数据库

用管理员权限运行cmd

将现行文件夹设置为mysql的bin目录

cd D:\mysql-8.0.11-winx64\bin

初始化数据库

mysqld --initialize --console

执行完成后,会输出 root 用户的初始默认密码,如:

...
2018-04-20T02:35:05.464644Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: APWCY5ws&hjQ
...

APWCY5ws&hjQ 就是初始密码,后续登录需要用到,你也可以在登陆后修改密码。如果暂时不修改密码,建议将密码复制粘贴备忘。

输入以下安装命令:

net start mysql

4.登录Mysql数据库

mysql -u root -p(密码)

出现上图则代表登陆成功

5.创建spring_boot_test数据库

我们先查看现有的数据库列表

show databases;

可见目前没有spring_boot_test数据库

创建数据库

CREATE DATABASE spring_boot_test;  //CREATE DATABASE 数据库名;//

提示OK则创建成果,我们用show命令再次查看数据库列表,发现数据库创建成功

6.执行sql脚本

选择现行数据库

use spring_boot_test;

执行sql脚本

source D:\mysql-8.0.11-winx64\test.sql //source SQL脚本路径//

显示OK则执行成功

查看所有表及表结构

show tables;            //查看数据库内所有表单//
describe table_test;    //查看指定表单的字段数据//

查看表中所有数据

select * from table_test;

可见默认的表单中留有两个测试数据

四、配置阿里巴巴Druid数据库连接池

1.什么是数据连接池?

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

2.在pom.xml导入相关依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.11</version>
    </dependency>

注:文章最下面有所使用的的整个项目的pom.xml数据,可以选择一次性导入

3.配置数据连接池

spring.datasource.username=root
spring.datasource.password=88888888
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/spring_boot_test?serverTimezone=GMT%2B8&useSSL=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.druid.initial-size=8    //初始化数据源大小//
spring.datasource.druid.min-idle=8        //最小数据源大小//
spring.datasource.druid.max-active=30     //最大数据源大小//
spring.datasource.druid.max-wait=30000    //超时时间//

在application.properties中输入上图数据,username默认为root,password填写你的数据库密码,其中url一项那段链接“?”前面部分为你的数据库名称

4.测试连接

在主程序入口处点击小箭头运行,得到如上图控制台内Tomcat运行成功的提示,则证明数据库连接成功

五、编写代码

1.实体层

实体类中存放的一般都是对应数据库表内的相应字段名称,还记得我们在记事本中看的sql脚本文件吗?其中有几项字段的数据类型是int,而另一些是String,我们对应着数据库内的字段名称,编写我们的实体类文件,让这些变量对应数据库表内的字段。

如果我们要写一个完整的实体类,在我们设置变量之后,我们还需要构造Get、Set方法,无参构造,有参构造,toString等。我们引用lombok依赖库,用@Data注释来标记整个类,则可以省略构造过程

在实体类的编写过程中,常常需要应用大量的get、set方法,需要写大量的重复代码,即有的工具有自动生成功能,当时也会使实体类中产生大量冗余代码,使得代码变,springboot为我们提供了相应注解可以解决这类问题----@Data
接下来简明扼要的介绍一下@Data注解的功能与使用方法
## 注解功能
1、@Data可以为类提供读写功能,从而不用写get、set方法。
2、他还会为类提供 equals()、hashCode()、toString() 方法。

原文链接:https://blog.csdn.net/pzq915981048/article/details/99086924

所需的依赖:

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

User.java代码:

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String name;
    private Integer level;
    private String create_time;
    private Integer delete_flag;
    private String extension;
}

2. 服务层

创建接口以及接口的实现

接口:

import java.util.List;
import java.util.Map;

public interface UsersService {
    List<Map<String,Object>> getUser(Integer id);
    List<Map<String,Object>> getUserList();
    String postUser(User user);
    String putUser(Integer id, User user);
    String deleteUser(Integer id);
}
  • 接口注解:
    • getUser是返回指定用户数据,所以需要以int类型的id变量作为查询主键,故需要一个int形参
    • getUserList是返回数据库表内所有用户数据
    • postUser为向数据库添加一行数据,则需要基本的六项数据,故需要一个User对象形参
    • putUser是修改某用户数据,故需要主键id作为唯一参考,User对象形参接收修改后数据
    • deleteUser根据主键id删除对应数据
  • 附加注解:
    • 因为getUser与getUserList输出结果有行有列,所以为二维数组,故类型设置为List<Map<String,Object>>,若深究List<Map<String,Object>>的意义,请自行百度,我也不是很清楚

接口实现:

@Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容器中@Override表示为对接口的重写

注:我们在创建UserServiceimpl.java后,在类名上需要写上 implements UserService来表示此类是对接口的重写,之后自动生成对各个类的重写代码

因为我们需要JdbcTemplate来实现我们对数据库的操作,所以需要导入JDBC依赖!!!
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
接口的实现代码:
import com.example.druidtest.entity.User;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
import java.util.Map;

@Service
public class UsersServiceimpl implements UsersService{
    private final JdbcTemplate jdbcTemplate;

    public UsersServiceimpl(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public List<Map<String, Object>> getUser(Integer id) {
        String sql="select * from table_test where id=?";
        return jdbcTemplate.queryForList(sql,id);
    }

    @Override
    public List<Map<String, Object>> getUserList() {
        String sql="select * from table_test";
        return jdbcTemplate.queryForList(sql);
    }

    @Override
    public String postUser(User user) {
        String sql="insert into table_test values (?,?,?,?,?,?)";
        Object[] data ={user.getId(),user.getName(),user.getLevel(),user.getCreate_time(),user.getDelete_flag(),user.getExtension()};
        jdbcTemplate.update(sql,data);
        return "add-ok";
    }

    @Override
    public String putUser(Integer id, User user) {
        String sql="update table_test set name=?, level=? ,create_time=?, delete_flag=?, extension=? where id="+id;
        Object[] data2={user.getName(),user.getLevel(),user.getCreate_time(),user.getDelete_flag(),user.getExtension()};
        jdbcTemplate.update(sql,data2);
        return "update-ok";
    }

    @Override
    public String deleteUser(Integer id) {
        String sql="delete from table_test where id=?";
        jdbcTemplate.update(sql,id);
        return "delete-ok";
    }
}

注:这里的jdbcTemplate.qjdbcTemplate.queryForList(sql,id)是指运行指定的sql语句,获得用户列表(可以说是一个二维数组),用return来返回。这里的id是对上方定义的sql语句中“?”部分内容的补充。jdbcTemplate.update是指运行指定的sql语句,上传数据。user.getName(),user.getId()等是获取前端接收json封包后所读取的对应数据的值。至于SQL语句的意思,大家可以百度查找。

3.前端接口层(前端控制器)

这里有两个注解@RestController与@RequestMapping很重要。

@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面。


@PathVariable
PathVariable是路径变量的意思,这个注解主要作用在请求URL路径上的数据绑定,默认传递数值写在URL上,SpringMVC就可以获取到,如上图第一个GetMapping中,“/{id}”花括号内的“id”会传参给方法中的形参id,再传给服务层执行相应方法。


@RequestBody
RequestBody是请求体的意思,这个注解作用在请求体的数据绑定,并且数据必须在写在请求体中,还要以JSON的数据格式发送才符合条件

相关文章:https://www.cnblogs.com/codeluojay/p/13997558.html

import com.example.druidtest.entity.User;
import com.example.druidtest.service.UsersService;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;


@RequestMapping(value = "/user")
@RestController
public class UsersController {
    final
    UsersService usersService;

    public UsersController(UsersService usersService) {
        this.usersService = usersService;
    }

    @GetMapping("/{id}")
    public List<Map<String, Object>> findById( @PathVariable Integer id){
        return usersService.getUser(id);
    }
    @GetMapping
    public List<Map<String, Object>> findAll(){
        return usersService.getUserList();
    }
    @DeleteMapping("/{id}")
    public String removeUser( @PathVariable Integer id){
        return usersService.deleteUser(id);
    }
    @PostMapping
    public String addUser( @RequestBody User user){
        return usersService.postUser(user);
    }
    @PutMapping("/{id}")
    public String modifyUser(  @PathVariable Integer id, @RequestBody User user){
        return usersService.putUser(id, user);

    }
}

注:这里的@RequestMapping(value = "/user")意味着前端访问以下所有方法的总链接入口为/user,@GetMapping、@DeleteMapping、@PostMapping、@PutMapping则对应着不同的请求方式下进入的方法。请求地址后面的“/{id}”意味着花括号内的id是有意义的,相当于一个形参,在被请求后将实参传给下面方法中对应的变量名,再传递给服务层由服务层中的代码执行相应的操作将操作结果返回给前端,再由前端呈现。至于在自动装配UsersService时为什么用final而不用@Autowired,是因为final修饰的成员变量是不能够被修改的,反射那就没办法了。

六,用PostMan进行测试

1.什么是PostMan

Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果, 从而验证响应中的结果数据是否和预期值相匹配;并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。 它主要是用来模拟各种HTTP请求的(如:get/post/delete/put..等等),Postman与浏览器的区别在于有的浏览器不能输出Json格式,而Postman更直观接口返回的结果。

2.下载PostMan

可以直接点击下载按钮下载,或者去官网下载

官网地址:https://app.getpostman.com/app/download/win64?


3.用PostMan测试接口

运行我们的项目

可以看到我们的本地地址为8080

打开并配置PostMan

输入测试地址,在Headers新增如图Key以及Value

为什么要在Headers新增如图Key以及Value?(如下)