maven依赖+http请求响应+统一请求响应结果+分层解耦+ioc&di+mybatis 数据库连接池

本文详细解释了Maven依赖配置,包括直接和间接依赖的概念,依赖排除的使用,以及依赖范围和生命周期。同时介绍了HTTP请求协议、SpringBoot中的控制器、DI和MyBatis框架,以及数据库连接池和Lombok工具的简化开发。
摘要由CSDN通过智能技术生成

maven依赖

 maven依赖配置 是在  pom.xml文件中配置的    依赖 就是 java在项目运行中所需要的jar包

在我们添加依赖时,如果本地仓库没有该依赖,maven会链接远程仓库,自己下载依赖

依赖传递

 而 maven依赖具有传递性的,可以是 直接依赖 和间接依赖 

直接依赖    

假如  有一个项目 A  现在添加了 a b c三个 依赖    ,现在  我们 又创建了一个项目B,在我们没有在pom文件中添加依赖的时候,依赖不会传递,在我们 在pom文件中把A项目添加到依赖中去,B项目就会 有 A项目中的所有依赖  ,这就是直接依赖

间接依赖

在上面的基础上  我们又创建了一个项目C,我们把B添加到我们C项目的pom文件中去, 这就是间接依赖  

如图所示

依赖排除

当我们在C项目中依赖了B项目,此时 有a b c三个jar1包,我们C项目不需要cjar包,此时可以用依赖排除,记住  排除的依赖代码需要写在   此时  依赖的B项目的代码中   也就是<dependency>标签中

<exclusions>
    <exclusion>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </exclusion>
</exclusions>

依赖范围

依赖范围代码写在pendency标签中,version标签下,用scope标签包裹

依赖生命周期

在maven中有许多生命周期,但是无论怎样,当你运行后面顺序的生命周期时,前面的生命周期都是运行

http请求协议

浏览器 向服务器用固定格式的内容进行请求,服务器响应浏览器发来的内容,按照固定格式进行响应

请求行  前面get代表的是get请求 ,请求的网址是/hello,用的是http协议

后面是 服务器向 浏览器进行响应

特点

http协议是基于 tcp协议比较安全,而且还需要进行 三次握手,四次挥手

 三次握手

1  客户端向服务器发出连接请求等待服务器确认

2  服务器返回响应 告诉客户端收到请求

3客户端再次发出确认信息  建立连接

四次挥手

1 客户端发出取消连接请求

2 服务器 返回响应,表示收到请求

3 服务器 向客户端 发出取消请求

4  客户端发送确认信息,取消连接  

两种常用请求

1是get请求  2 是post请求

使用get请求  请求的内容一般在  请求行中,长度有限制  

而post请求的内容是json形式的包含在请求体中  数据比较安全,长度没有限制

http响应

服务器按照http格式相应给 浏览器    

 分为  响应行  响应头  响应体  而响应的内容 在响应体内

一般在服务器响应的状态码中  有以下几种情况

常用响应软件

一般测试自己的响应内容   用postman软件进行测试 ,而轻量得得web服务器 有tomcat 等 

 在自己spring代码中如下

写下如下代码之后  启动自己项目类  

而在postman中 具体如下

正常返回的就是 ok

请求参数

在我们 用post请求中 有几种请求参数需要注意 

简单参数 
@RestController
public class hello {
    @RequestMapping("/nihaoya")
    public  String nihao(String name, int age){
        System.out.println(name);
        return "ok";
    }

在我们用postman发起请求时的时候,请求的就是下面的网址,而我们请求的内容就写在 ?之后,

也就是name=什么什么的

此时我们输出打印name,会得到zhangsan的结果,而如果我们 使用的名字不一样的时候,打印的结果就会变成null,就比如   我们用上面的代码打印name的名字,而我们在发送get请求时候  输入的网址内容为localhost:8080/nihaoya?namess=zhangsan&age=100  我们发现  我们用的namess 跟 我们定义的方法 nihao 中 形参name名字不同,所以会返回 null  ,也就是说 我们用网址发送请求时,键值对的键要和 我们方法的形参名字相同

  复杂参数

就是我们写方法的时候,写的是一个类  比如

@RequestMapping("/nihao")
public  String ni(User user){
    System.out.println(user);
    return "ok";
}

我们  的形参是一个我们自定义的pojo实体user类    

public class User {
    public   String name;
    public  int age;

而我们在get请求中的网址输入为localhost:8080/nihaoya?name=zhangsan&age=100  他会自动匹配我们名字相同的内容,但是需要按照顺序写入

集合参数

我们请求数组参数的时候 需要加一个 requestparam注解

@RequestMapping("/jihe")
public  String  ji( @RequestParam List<String> hobby){
    System.out.println(hobby.toString());
    return "ok";
}

对应的hobby内容依次对应即可  localhost:8080/jihe?hobby=sing&hobby=java&hobby=song

其他参数

json参数  就是  用post请求 发送一个json,实体类用注解 注释  

路径参数  

我们一般是通过一个网址进行 内容的传递  比如 

localhost:8080/nihaoya?name=zhangsan&age=100 

而我们用路径参数可以可以这样写 localhost:8080/nihaoya/wocaole

代码如下

@RequestMapping("/path/{id}")

public String nihaoya(@PathVariable Integer id)

{return "ok"}

这样我们就可以为 该路径的后面写入任意的内容  也就是在   localhost:8080/nihaoya/ 这个后面写任意的数字  

统一请求响应结果  

当我们 每次用不同的数据进行进行响应返回的时候,会显得代码太臃肿,所以我们可以自定义个实体类来进行统一响应的管理

自定义的统一实体类为

public class Result {
    public  String code;// 1 成功 0失败
    public  String msg; //success
    public  Object data;//存放数据

    public Result() {
    }

    public Result(String code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
public  static  Result success(Object data){
        return new Result("1","success",data);
}
public  static  Result err(){
return new Result("0","err",null);
}}

而标准的javabean我们就不再复制出来

这样我们就可以把之前请求参数的代码改为如下

@RestController
public class hello {
    @RequestMapping("/nihaoya")
    public  Result nihao(@RequestParam(name = "name") String names){
        System.out.println(names);
        return Result.success(names);
    }}

我们通过统一的响应结果 解决了代码的测试的冗余

springboot分层解耦

当我们 写入一个项目,对前后端进行测试的时候代码分为三层

1  controller 层    service层  dao层三层    

我们在分层的时候 要尽量遵循  高内聚 低耦合  

 高内聚 就是 一个层级中元素的联系程度越高  内聚性越高  

低耦合  层级之间关联度越小越好

  假设现在  有一个项目   前端页面A    数据内容 B   项目把数据内容B 导入到前端页面A中 进行渲染展示 

 那么  我们就需要进行三层的设计   

现在 dao 业务层  进行 数据内容B 的解析   假设解析好的内容为a 

在service层中  对内容a进行数据内容的处理筛选判断等

在controller层 进行页面的数据响应   

而使用了 解耦之后就不能随便new对象了,那么接下来怎么办

在其中 需要用到ioc   di  也就是 控制反转  依赖注入

完整的代码如下

 

ioc &di 详解

ioc

我们用@component 注解 分类实在是不够明确  下面 我们用下面的注解标注各个层面

@Component的衍生注解:

@Controller (标注在控制层类上)

@Service (标注在业务层类上)

@Repository (标注在数据访问层类上)

但是我们使用了这些注解  他就会生效吗  不会,其中会有组件扫描,我们一般可以看出  我们springboot的启动程序一般是在  我们设置的包下的

就是 springwebapplication类在com包下,他在启动的时候会有组件扫描,@SpringwebApplication 中, 默认扫描的范围是SpringBoot启动类所在包及其子包,然后找到我们注解的内容,但是当我们包一个服务层或者业务层的包 与com包平级,在组件扫描中就不会扫描到,运行就会出错

解决方法如下

1  不要没事把 包弄到其他地方

在启动类的上面加上该注解的包

di

我们使用依赖注入 ioc容器的时候,是使用的autowired注解,但是加入在 ioc容器中 有相同类型的bean对象 ,在程序运行的时候就会出错

 我们依赖注入了一个接口两个相同的子类型,虽然类名不一样,但是 实现的接口一样,当进行依赖注入的时候会重复,程序报错

解决方法

mybatis

mybatis 是一个应用在数据持久层(dao层)的框架,主要是简化jdbc的开发

使用mybatis是怎么个流程  

在使用mybatis操作数据库  就是在mybatis中编写sql代码,然后发给数据库执行,数据库执行之后返回结果,返回的结果mybatis会用实体类封装起来

使用过程  设置好驱动依赖等一系列工作之后

我们根据

数据库中表的 字段 在 main包中 创建一个 跟数据库表对应的实体类,然后实现一个mapper接口 

接口如下

然后在test测试包下  ,进行程序测试

运行之后,控制台就会出现 该数据库表中的 各个数据

数据库连接池

没有使用数据库连接池  客户端执行sql会建立新的连接对象,使用完之后释放资源,这种比较耗费计算机性能

mybatis中则存在数据库连接池

数据库连接池是个容器,负责分配、管理数据库连接(Connection) 程序在启动时,会在数据库连接池(容器)中,创建一定数量的Connection对象 允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句 执行完之后,释放Connection时就会把Connection对象归还给连接池(Connection对象可以 复用) 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏 客户端获取到Connection对象了,但是Connection对象并没有去访问数据库(处于空闲),数据 库连接池发现Connection对象的空闲时间 > 连接池中预设的最大空闲时间,此时数据库连接池 就会自动释放掉这个连接对象

lombok

我们在创建实体类的时候 ,老写重复的getset方法,使用了lombok之后只需要加上注解就行了,但是我有其他的插件了更加简洁,所以我就不用lombok了

  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三氧化真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值