Dubbo(分布式框架·上)

news2024/10/6 13:00:11

Dubbo·上

  • 一、导入
    • 1、基础知识
      • 1.1、什么是分布式系统
      • 1.2、发展演变
      • 1.2.1 单一应用架构
      • 1.2.2分布式应用架构
      • 1.2.3 流动计算架构
    • 1.3 RPC
      • 1.3.1 什么是RPC
      • 1.3.2 RPC核心模块
  • 二、Dubbo概念
  • 三、设计架构
  • 四、环境搭建
    • 4.1 Zookeeper注册中心
    • 4.2 测试Zookeeper
    • 4.1 监控中心
  • 五、测试
    • 5.1 需求
    • 5.2分析
    • 5.3编码
      • 5.3.1创建公共接口
      • 5.3.2创建服务提供者
      • 5.3.3创建服务消费者
      • 5.3.4 将服务提供者注册到注册中心(暴露服务)
      • 5.3.5 查看服务是否注册并暴露
      • 5.3.5 配置消费者

一、导入

1、基础知识

1.1、什么是分布式系统

定义:

分布式系统是若干个计算机的集合,这些计算甲对于用户来说就像单个相关系统

分布式系统是建立在网络之上的软件系统。

1.2、发展演变

演变图
在这里插入图片描述

1.2.1 单一应用架构

在这里插入图片描述

当网站流量很小时,只需要一个应用,将所有功能部署在一起,以减少部署节点和成本,此时,用于简化增删改查工作量的数据访问框架(ORM)是关键

垂直应用架构
在这里插入图片描述

1.2.2分布式应用架构

在这里插入图片描述

各功能之间一定的分离、页面与逻辑一定的分离

分布式难点:

在于如何远程过程调用和、如何拆分业务,提高业务复用程度

1.2.3 流动计算架构

在这里插入图片描述

1.3 RPC

1.3.1 什么是RPC

RPC(Remote Procedure Call):

本质是两个服务器之间架起一个网络通信连接,通过这个连接来调用功能

在这里插入图片描述

是一种进程间通信方式,他是一种思想技术,非规范的。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不是程序员显式编码这个远程调用的细节,即程序员无论是调用本地的还是远程的函数,本质上编写的调用基本相同。

例子:
在这里插入图片描述

1.3.2 RPC核心模块

1、通讯
2、序列化

RPC框架有很多:
dubbo、gRBC、HSF

二、Dubbo概念

在这里插入图片描述

1、面向接口代理的高性能RPC调用:

如服务器A调服务器B上面的代码,只需要将B上面的接口所在的方法拿来调用。dubbo会自动找B服务器上面的对应代码,并屏蔽调用细节

2、智能负载均衡
根据服务器的"闲忙"来均衡分配任务,让每台服务器负载均衡

3、服务注册与发现

当业务非常多的时候,业务被分布在各个服务器。这是我们会产生几个问题

1、如何知道各个业务在哪台服务器?

2、如果有一台服务器坏了怎么办?

这时我们引入了注册中心
在这里插入图片描述

将前端页面代码和逻辑代码放到注册中心,形成一个清单。
这个清单会给出对应的页面或者逻辑代码在哪台服务器上,并会监听服务器的状态

三、设计架构

在这里插入图片描述

Registry(注册中心): 会将web和业务代码的信息注册到注册中心
Provider(服务提供者): 如业务代码
**Consumer(服务消费者)😗*如web页面
Container(Dubbo框架容器):
**Monitor(监控中心)😗*服务者和消费者的信息会发送到监控中心

运行流程
当dubbo容器启动时,服务提供者会将提供的信息注册到注册中心,注册中心就会知晓有哪些服务,哪些服务上线了。当服务消费者启动的时候,会从注册中心订阅需要的服务,如果某一个服务提供者出现了变更。注册中心会将该信息告知给消费者
。如果多个服务器都提供了相同的业务功能,消费者可以根据负载均衡算法选择合适的服务器进行调用,每次调用的信息会定时统计发送到监控中心。

四、环境搭建

4.1 Zookeeper注册中心

1、下载Zookeeper,官网:https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz
在这里插入图片描述
2、下载好后解压,然后找到D:\app\apache-zookeeper-3.8.0-bin\conf目录
将conf目录下的zoo_sample.cfg复制一份改名为zoo.cfg

在这里插入图片描述

3、在D:\app\apache-zookeeper-3.8.0-bin目录下创建一个名为data的目录,用于存放数据
再打开zoo.cfg文件,将dataDir=…/data

在这里插入图片描述

4、启动zookeeper服务
在这里插入图片描述

5、启动客户端连接zookeeper
在这里插入图片描述
连接成功
在这里插入图片描述

4.2 测试Zookeeper

Zookeeper是一个树形的目录服务

在这里插入图片描述

我们可以获取根结点是否有有没有值,没有。
在这里插入图片描述
查看根目录
在这里插入图片描述
我们可以在zookeeper下面创建一个临时文件
在这里插入图片描述

4.1 监控中心

详细安装可参考https://blog.csdn.net/weixin_45480785/article/details/118975741

1、在dubbo项目官网找到GitHub的地址dubbo的GitHub地址

1、然后再找到Dubbo Admin

在这里插入图片描述

2、然后下载压缩包

在这里插入图片描述

3、打开项目下的dubbo-admin-server项目,启动之前我们需要先修改spring boot的核心配置文件

admin.registry.address=zookeeper://127.0.0.1:2181
admin.config-center=zookeeper://127.0.0.1:2181
admin.metadata-report.address=zookeeper://127.0.0.1:2181

在这里插入图片描述

4、用Maven打包项目,并启动项目

前提是你电脑上安装了maven

D:\dubbo\dubbo-admin\dubbo-admin-server>mvn clean package


5、打包完成后在/target文件夹下有一个项目打包成的jar包,然后运行它

java -jar dubbo-admin-server-0.5.0.jar 

在这里插入图片描述

可能会产生端口占用问题,此时请参考这篇文章http://wjhsh.net/timingstarts-p-12604211.html

6、.启动前端vue项目
在这里插入图片描述

D:\dubbo\dubbo-admin\dubbo-admin-ui> npm install

D:\dubbo\dubbo-admin\dubbo-admin-ui> npm run dev

在这里插入图片描述
点击第一个链接:

在这里插入图片描述

在这里插入图片描述

至此,监控中心搭建完毕

在这里插入图片描述

五、测试

5.1 需求

在这里插入图片描述

5.2分析

在这里插入图片描述

5.3编码

5.3.1创建公共接口

在这里插入图片描述

pojo

package com.study.dubbo.pojo;

import java.io.Serializable;

/**
 * @author ZS
 * @Description
 * @date 2022/12/2 13:37
 */
public class UserAddress implements Serializable {
    private Integer id;
    private String userAddress;//用户地址
    private String consignee;//收货人
    private String phoneNum;//电话号码
    private String isDefault;//是否默认地址 Y-是 N-否

    public UserAddress(){}

    public UserAddress(Integer id, String userAddress, String consignee, String phoneNum, String isDefault) {
        this.id = id;
        this.userAddress = userAddress;
        this.consignee = consignee;
        this.phoneNum = phoneNum;
        this.isDefault = isDefault;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getConsignee() {
        return consignee;
    }

    public void setConsignee(String consignee) {
        this.consignee = consignee;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    public String getIsDefault() {
        return isDefault;
    }

    public void setIsDefault(String isDefault) {
        this.isDefault = isDefault;
    }

    @Override
    public String toString() {
        return "UserAddress{" +
                "id=" + id +
                ", userAddress='" + userAddress + '\'' +
                ", consignee='" + consignee + '\'' +
                ", phoneNum='" + phoneNum + '\'' +
                ", isDefault='" + isDefault + '\'' +
                '}';
    }
}


Service

package com.study.dubbo.service;

import com.study.dubbo.pojo.UserAddress;

import java.util.List;

/**
 * @author ZS
 * @Description
 * @date 2022/12/2 13:44
 */
public interface UserService {
    public List<UserAddress> getUserAddressList(String userId);
}

package com.study.dubbo.service;

/**
 * @author ZS
 * @Description
 * @date 2022/12/2 13:59
 */
public interface OrderService {
    /**
     * 初始化订单
     * @param userId
     */
    public void initOrder(String userId);
}

Ipml

package com.study.dubbo.service.Impl;

import com.study.dubbo.pojo.UserAddress;
import com.study.dubbo.service.UserService;


import java.util.Arrays;
import java.util.List;

/**
 * @author ZS
 * @Description
 * @date 2022/12/2 13:45
 */
public class UserServiceImpl implements UserService {
    @Override
    public List<UserAddress> getUserAddressList(String userId) {

        UserAddress address1 = new UserAddress(1,"北京市东城区","李老师","13102347856","Y");
        UserAddress address2 = new UserAddress(2,"达州市通川区","张老师","17102347856","N");

        return Arrays.asList(address1,address2);
    }
}

package com.study.dubbo.service.Impl;

import com.study.dubbo.pojo.UserAddress;
import com.study.dubbo.service.OrderService;
import com.study.dubbo.service.UserService;

import java.util.List;

/**
 * @author ZS
 * @Description
 * @date 2022/12/2 14:01
 */
public class OrderServiceImpl implements OrderService {
    UserService userService;

    @Override
    public void initOrder(String userId) {
        //1、查询用户的收获地址
        List<UserAddress> userAddressList = userService.getUserAddressList(userId);
        System.out.println(userAddressList);
    }
}

5.3.2创建服务提供者

在这里插入图片描述

在服务提供者内导入Dubbo的依赖


    <!--导入dubbo-interface的依赖-->
    <dependencies>
        <dependency>
            <groupId>org.study</groupId>
            <artifactId>interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

5.3.3创建服务消费者

在这里插入图片描述
在消费者内导入Dubbo的依赖


    <!--导入dubbo-interface的依赖-->
    <dependencies>
        <dependency>
            <groupId>org.study</groupId>
            <artifactId>interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

5.3.4 将服务提供者注册到注册中心(暴露服务)

1、在服务提供者里导入dubbo依赖,然后引入zookeeper客户端

    <!--引入dubbo依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.12</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>

    <!--注册中心使用的是zookeeper,引入操作zookeeper的客户端-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
            <version>3.3.0</version>
        </dependency>

2、配置服务提供者

在服务提供者的resources下面新建一个名为provider的spring.xml文件,配置如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<!--1、指定当前服务/应用名字(同样的服务名字相同,别和别的服务相同)-->
       <dubbo:application name="dubbo-provider"></dubbo:application>


        <!--2、指定注册中心的位置-->
       <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>

        <!--3、指定通信规则(通信协议和通信端口)-->
       <dubbo:protocol name="dubbo" port="20080"></dubbo:protocol>

        <!--4、暴露服务 ref:指向服务的真正实现对象-->
    <dubbo:service interface="com.study.dubbo.service.UserService" ref="UserServiceImpl"></dubbo:service>

    <!--服务的实现-->
    <bean id="UserServiceImpl" class="com.study.dubbo.service.Impl.UserServiceImpl"></bean>
</beans>

创建方法,让服务提供者跑起来

package com.study.controller;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

/**
 * @author ZS
 * @Description
 * @date 2022/12/2 15:09
 */
public class MainApplication {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
        ioc.start();

        System.in.read();
    }
}

出现如下样式,则运行成功
在这里插入图片描述

5.3.5 查看服务是否注册并暴露

回到dubbo监控中心查看服务

我们可以看到第二个出现在了我们的监控中心,表明服务提供者已经注册并暴露成功
在这里插入图片描述

5.3.5 配置消费者

1、在服务消费者里导入dubbo依赖,然后引入zookeeper客户端

    <!--引入dubbo依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.12</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.8.0</version>
        </dependency>

    <!--注册中心使用的是zookeeper,引入操作zookeeper的客户端-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
            <version>3.3.0</version>
        </dependency>

在dubbo-consumer创建一个consumer.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <context:component-scan base-package="com.study.service.Impl"></context:component-scan>

    <!--1、指定当前服务/应用名字(同样的服务名字相同,别和别的服务相同)-->
    <dubbo:application name="dubbo-consumer"></dubbo:application>


    <!--2、指定注册中心的位置-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>

    <!--3、声明需要调用远程服务的接口,生成远程服务代理-->
   <dubbo:reference interface="com.study.dubbo.service.UserService" id="UserService"></dubbo:reference>


</beans>

在调用远程的接口

package com.study.service.Impl;

import com.study.dubbo.pojo.UserAddress;
import com.study.dubbo.service.OrderService;

import com.study.dubbo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import java.util.List;

/**
 * @author ZS
 * @Description
 * @date 2022/12/2 14:01
 */

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    UserService userService;

    @Override
    public void initOrder(String userId) {

        System.out.println("用户id:"+userId);
        //1、查询用户的收获地址
        List<UserAddress> userAddressList = userService.getUserAddressList(userId);
        for (UserAddress u : userAddressList) {
            System.out.println(u.getUserAddress());
        }
    }
}

然后创建一个mian方法让消费者程序运行起来,并启动

package com.study.controller;

import com.study.dubbo.service.OrderService;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;

/**
 * @author ZS
 * @Description
 * @date 2022/12/2 15:56
 */
public class MianApplication {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("consumer.xml");
        OrderService bean = ioc.getBean(OrderService.class);
        bean.initOrder("1");
        System.out.println("调用完成...");
        System.in.read();

    }
}

最后启动MianApplication ,则会看到调用的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文阅读-ATLAS: A Sequence-based Learning Approach for Attack Investigation

论文代码&#xff1a; https://github.com/purseclab/ATLAS 代码预处理写的太乱了&#xff0c;很多预处理过程都不是特别合理。不过这篇论文思想还是挺合理的&#xff0c;相比其实溯源图工作在路径上的处理更加合理一些。 背景简介 高级可持续威胁攻击&#xff08;Advanced P…

AXI VDMA回环测试

Block Design 搭建如下图所示的硬件系统&#xff1a; 该硬件系统的数据流向为&#xff1a; DDR–>AXI VDMA–>AXI DATA FIFO–>AXI VDMA–>DDR 即将一幅图像由一段地址空间搬运至另一段地址空间。 其中&#xff0c;AXI VDMA配置如下&#xff1a; 地址位宽32&…

[附源码]Python计算机毕业设计SSM健身房管理系统 (程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

认识3dmax 轴心

轴心&#xff0c;pivot&#xff1b; 资料对轴心的说明如下&#xff0c; 物体轴心 每个物体有且仅有一个轴心&#xff0c; 轴心位置确定了物体的位置&#xff0c; 物体旋转是围绕轴心旋转的; 轴心&#xff0c;我没看到说是一个点或一条线&#xff1b;在三维空间应…

什么样的护眼灯适合孩子用?真正适合孩子的护眼台灯

在现在这个时代&#xff0c;科技的更新迭代&#xff0c;我们生活水平得到提高&#xff0c;在灯具行业也是越来越多样化了&#xff0c;作为家长的&#xff0c;希望能买到适合孩子的护眼灯&#xff0c;那么在那么多种类的台灯中&#xff0c;什么样的适合孩子呢&#xff1f;这次主…

虹科方案|用Western Digital和ATTO技术优化SMR存储解决方案的负载

​ 一、引言 Western Digital 与 ATTO Technology 的长期合作基于对当今复杂企业环境的存储和数据基础设施需求的共同洞察。我们正在共同为用户准备迎接下一波性能挑战。 二、背景 随着动态数据过渡到静态数据&#xff0c;存储成为关键基础架构组件之一。然而&#xff0c;以…

【教学类-21-01】20221205《青花茶杯-A4纸插入式纸盒》(大班主题《我是中国人》)

展示效果&#xff1a; 单张效果 多张效果 隐藏的部分 信息&#xff1a; 1.右侧第1列&#xff1a;幼儿园名字&#xff1b; 2.右侧第3列&#xff0c;幼儿名字 &#xff08;1&#xff09;3个名字印 &#xff08;为了统一4字&#xff09; &#xff08;2&#xff09;2个名字印…

初识多线程编程

文章目录一、线程线程与进程的区别二、多线程编程Thread创建线程的方法一、线程 我们开始引入进程&#xff0c;最主要的目的是去解决"并发编程"的问题&#xff0c;电脑进入了多核心&#xff0c;想要提高程序执行速度&#xff0c;就得将这些核心用起来。 我们在每次…

【vue3】代码格式化和volar卡顿问题解决

一、格式化策略 用eslint做代码检查和格式化是很方便的东西&#xff1b; 这里我们使用vscode完成这些操作&#xff1b; 在代码保存的时候&#xff0c;顺便完成格式化操作 1)装上eslint和prettier插件 2)装完插件之后&#xff0c;我们需要配置一下 打开 文件 > 首选项 >…

「Whale Cast」功能更新,让全网看到您的直播高光时刻

直播为王的时代&#xff0c;品牌如何在直播中增强运营能力&#xff0c;降本增效&#xff1f; 11 月&#xff0c;「帷幄开播 Whale Cast」迎来新的功能更新&#xff0c;一起来看一看&#xff0c;它将为您的直播间运营优化带来哪些强大助力。 我们将分别按智能裁切、直播场控、直…

springboot定义统一的异常返回格式(全局,特定,自定义)等

一 设置全局统一的返回格式 1.1 没有加全局异常处理 1.这里设置一个字符串为空指针异常&#xff0c;然后看看返回给前端的信息。 2.返回结果 3.效果看起来不友好的提示 1.2 添加全局异常处理 1.代码&#xff1a;添加一个全局异常处理类 ControllerAdvice public class Glo…

MySQL存在这么多的数据引擎 , 所有的引擎都在使用吗

一 . 前言 总是看到有说MySQL某个数据引擎哪里哪里有问题的 , 让我一度怀疑我是不是Mysql 用的不对 , 有些问题都没有遇到过&#xff0c;所以我非常好奇 , 数据库的存储引擎 , 大家真的在用吗? MySQL 官方文档:: MySQL 5.7 Reference Manual :: 15 Alternative Storage Engi…

[附源码]计算机毕业设计基于springboot学习互助辅助系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

JavaScript高级程序设计 第4版 --表单脚本

表单脚本 1、基础  acceptCharset&#xff1a;服务器可以接收的字符集&#xff0c;等价于 HTML 的 accept-charset 属性。 action&#xff1a;请求的 URL&#xff0c;等价于 HTML 的 action 属性。 elements&#xff1a;表单中所有控件的 HTMLCollection。 enctype&a…

详解设计模式:状态模式

状态模式&#xff08;State Pattern&#xff09;也被称为状态机模式&#xff08;State Machine Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 在状态模式 类的行为是基于它的状态改变的。在状态模式中&#xff0c;我们创建表示各种状态的对象…

9.图片分类数据集

1. 图像分类数据集 MNIST数据集 [LeCun et al., 1998] 是图像分类中广泛使用的数据集之一&#xff0c;但作为基准数据集过于简单。 我们将使用类似但更复杂的Fashion-MNIST数据集。 %matplotlib inline import torch import torchvision from torch.utils import data from t…

idea配置tomcat热部署不生效问题

idea中配置了tomcat的“update classes and resources”后&#xff0c;点击run之后&#xff0c;每次修改代码都没有及时生效&#xff0c;也就是没有成功进行热部署。 在idea中实现热部署&#xff0c;要先设置自动编译&#xff0c;再选择正确的运行模式&#xff08;Debug运行&am…

SSM和SpringBoot整合

目录 一、整合Mybatis 配置文件 pom.xml application.yml jdbc.properties generatorConfig.xml 启动类 测试 二、整合Mybatis-plus Mybatis-plus 新建项目 pom.xml application.yml 在项目导入mybatis-plus的代码生成的类 完成基本增删改查方法开发 三、Mybatispl…

常用数据库之sql server的使用和搭建

1.1 介绍 关系型数据库&#xff0c;SQLServer是由微软公司开发的一种关系型据库管理系统&#xff0c;它已广泛用于电子商务、银行、保险、电力等行业。SQLServer提供了对XML和Internet标准的支持&#xff0c;具有强大的、灵活的、基于Web的应用程序管理功能。 1.2 优缺点 优点…

毕业设计-基于机器视觉的安全帽佩戴识别系统

目录 前言 课题背景与意义 课题实现技术思路 目标检测 算法检测 算法实现 最后 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越…