SqlSugar详解-国产ORM框架

news2024/12/29 11:21:56

ORM (Object-Relational Mapping)

概念

ORM 是一种程序技术,用于将关系型数据库中的数据映射到对象上。

主要目的是简化数据库操作,使得开发人员可以像操作对象一样来操作数据库。

原理

数据表与类的映射:数据库中的表对应为类。

记录与对象的映射:表中的记录对应为对象实例。

字段与属性的映射:表中的字段对应为类的属性。

优点

提高开发效率:减少 SQL 语句的编写工作。

易于维护:修改数据库结构时,只需调整映射关系,减少对业务逻辑的影响。

增强代码可读性:以面向对象的方式处理数据,更符合编程习惯。

缺点

性能开销:相比直接使用 SQL,ORM 会带来一定的性能损耗。

灵活性降低:对于复杂的查询需求,ORM 可能无法满足或实现起来较为复杂。

核心:以面先对象的思想完成对数据库的操作

常见的ORM

SqlSugar——国内开发者封装设计的

EFCore——EntityFramework Core ——微软提供

Dapper

Dos Orm

。。。。。。

SqlSugar:集其他ORM框架优点于一身;足够简单,满足更多的使用场景

SqlSugar框架

SqlSugar 是一款 老牌 .NET开源ORM框架,由果糖大数据科技团队维护和更新 ,开箱即用最易上手的ORM

优点

【生态丰富】【高性能】【超简单】 【功能全面】 【多库兼容】【适合产品】

支持

.net framework .net core3.1 .ne5 .net6 .net7 .net8 .net9

特色

拥有全球最活跃的ORM线上论坛,比EF还要活跃,交流群人数已超过万人 ,技术支持快,口碑好。

开源

10年开源信誉值得信赖,从不搞收费,文档也全免费

官网

SqlSugar .Net ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网 (donet5.com)

使用步骤

1、新建项目

新建一个控制台项目做测试和一个类库Models

2、Nuget引入SqlSugarCore程序集(不要引错了!

引入图片中的程序集

引入后结果

3、连接数据库ConnectionConfig🚩进行配置

代码

// See https://aka.ms/new-console-template for more information

using SqlSugar;

Console.WriteLine("Hello, World!");
try
{

    //1、Nuget 引入程序集
    //2、通过SqlSugarClient 对象可以完成各种操作。注意选中SqlSugarClient点击F12可以查看源代码
    ConnectionConfig connectionConfig = new ConnectionConfig()
    {
        //DbType = DbType.SqlServer,
        //ConnectionString = "Data Source=.;Initial Catalog=RotatingWarehouseSystem;User ID=sa;Password=sa123456",

        ConnectionString = "Server=localhost;Database=net-vue;User ID=root;Password=root123;",
        DbType = DbType.MySql,
        InitKeyType = InitKeyType.Attribute
    };
   
}
catch (Exception  e)
{
    Console.WriteLine( e.Message);
    throw;
}

4、基于数据库生成实体对象--DbFirst🚩

代码

 //1、Nuget 引入程序集
 //2、通过SqlSugarClient 对象可以完成各种操作。注意选中SqlSugarClient点击F12可以查看源代码
 ConnectionConfig connectionConfig = new ConnectionConfig()
 {
     ConnectionString = "Server=localhost;Database=net-vue;User ID=root;Password=root123;",
     DbType = DbType.MySql,
     InitKeyType = InitKeyType.Attribute,
    IsAutoCloseConnection = true//自动释放
 };
 using (SqlSugarClient db=new SqlSugarClient(connectionConfig))
 {
     //1、基于数据库生成实体对象--DbFirst
     //models的路径:F:\PracticeSqlSugar\PracticeSqlSugar\Models
     {
       //生成数据库全部的表
         db.DbFirst
            .IsCreateAttribute()//创建sqlsugar自带特性
           .CreateClassFile(@"F:\PracticeSqlSugar\PracticeSqlSugar\Models");

     }
     //{
     //    //条件筛选,生成实体(生成什么名字开头的)
     //    db.DbFirst.Where(c=>c.StartsWith("sys_user")).CreateClassFile(@"F:\PracticeSqlSugar\PracticeSqlSugar\Models");
     //}
 }

生成结果

sys_user.cs文件内容

using System;
using System.Linq;
using System.Text;

namespace Models
{
    ///<summary>
    ///用户信息表
    ///</summary>
    public partial class sys_user
    {
        public sys_user(){


        }
        /// <summary>
        /// Desc:用户ID
        /// Default:
        /// Nullable:False
        /// </summary>           
        public long userId {get;set;}

        /// <summary>
        /// Desc:部门ID
        /// Default:
        /// Nullable:True
        /// </summary>           
        public long? deptId {get;set;}

        /// <summary>
        /// Desc:用户账号
        /// Default:
        /// Nullable:False
        /// </summary>           
        public string userName {get;set;}

        /// <summary>
        /// Desc:用户昵称
        /// Default:
        /// Nullable:False
        /// </summary>           
        public string nickName {get;set;}

        /// <summary>
        /// Desc:用户类型(00系统用户)
        /// Default:0
        /// Nullable:True
        /// </summary>           
        public string userType {get;set;}

        /// <summary>
        /// Desc:用户邮箱
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string email {get;set;}

        /// <summary>
        /// Desc:手机号码
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string phonenumber {get;set;}

        /// <summary>
        /// Desc:用户性别(0男 1女 2未知)
        /// Default:0
        /// Nullable:True
        /// </summary>           
        public int? sex {get;set;}

        /// <summary>
        /// Desc:头像地址
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string avatar {get;set;}

        /// <summary>
        /// Desc:密码
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string password {get;set;}

        /// <summary>
        /// Desc:帐号状态(0正常 1停用)
        /// Default:0
        /// Nullable:True
        /// </summary>           
        public int? status {get;set;}

        /// <summary>
        /// Desc:删除标志(0代表存在 2代表删除)
        /// Default:0
        /// Nullable:True
        /// </summary>           
        public int? delFlag {get;set;}

        /// <summary>
        /// Desc:最后登录IP
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string loginIP {get;set;}

        /// <summary>
        /// Desc:最后登录时间
        /// Default:
        /// Nullable:True
        /// </summary>           
        public DateTime? loginDate {get;set;}

        /// <summary>
        /// Desc:创建者
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string create_by {get;set;}

        /// <summary>
        /// Desc:创建时间
        /// Default:
        /// Nullable:True
        /// </summary>           
        public DateTime? create_time {get;set;}

        /// <summary>
        /// Desc:更新者
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string update_by {get;set;}

        /// <summary>
        /// Desc:更新时间
        /// Default:
        /// Nullable:True
        /// </summary>           
        public DateTime? update_time {get;set;}

        /// <summary>
        /// Desc:备注
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string remark {get;set;}

        /// <summary>
        /// Desc:所在省
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string province {get;set;}

        /// <summary>
        /// Desc:所在市
        /// Default:
        /// Nullable:True
        /// </summary>           
        public string city {get;set;}

    }
}

实体配置-配置SugarColumn属性

在 SqlSugar 中,SugarColumn 属性用于配置列的元数据信息,这对于 ORM 映射非常重要。下面是一些常见的 SugarColumn 属性及其用途:

4.1🌟 ColumnName-指定数据库表中对应的列名。
4.2🌟 IsNullable-指定列是否可以为 NULL。
4.3🌟 IsIdentity-指定列是否为自增列。
4.4🌟 IsPrimaryKey-指定列是否为主键。
4.5🌟 DbType-指定列的数据类型。
4.6🌟 Length-指定列的最大长度。
4.7🌟 CSharpType-指定 C# 中的类型
4.8🌟 IsIgnore-指定是否忽略此属性
4.9🌟 Insertable-指定插入时是否包含此列。
4.10🌟 Updatable-指定更新时是否包含此列。
4.11🌟 DefaultValue-指定默认值
示例
public class User
{
    [SugarColumn(IsIdentity = true, IsPrimaryKey = true, ColumnName = "user_id")]
    public int UserId { get; set; }

    [SugarColumn(Length = 50)]
    public string Name { get; set; }

    [SugarColumn(Length = 100)]
    public string Email { get; set; }

    [SugarColumn(DbType = "datetime")]
    public DateTime CreatedAt { get; set; }

    [SugarColumn(DbType = "datetime")]
    public DateTime UpdatedAt { get; set; }
}

5、完成对数据库的常用操作(增删改查)

①新增表数据-Insertable🚩

支持单条插入和批量插入

单条插入:
代码
// See https://aka.ms/new-console-template for more information

using Models;
using SqlSugar;

Console.WriteLine("Hello, World!");
try
{

    //1、Nuget 引入程序集
    //2、通过SqlSugarClient 对象可以完成各种操作。注意选中SqlSugarClient点击F12可以查看源代码
    ConnectionConfig connectionConfig = new ConnectionConfig()
    {
        ConnectionString = "Server=localhost;Database=net-vue;User ID=root;Password=root123;",
        DbType = DbType.MySql,
        InitKeyType = InitKeyType.Attribute
    };
    using (SqlSugarClient db=new SqlSugarClient(connectionConfig))
    {

        //操作表
        //3、新增表数据
        var addmodel = new sys_user()
        {
            userId = 4,
            deptId = 0,
            userName = "111",
            nickName = "测试SqlSugar",
            userType = "0",
            sex = 2,
            password = "1111",
            status = 0,

        };
        //常用三种,按需使用
        //正常的
        db.Insertable<sys_user>(addmodel).ExecuteCommand();
        //异步
        await db.Insertable(addmodel).ExecuteCommandAsync();
        //插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)
        db.Insertable(insertObj).ExecuteReturnIdentity();

    }

}
catch (Exception  e)
{
    Console.WriteLine( e.Message);
    throw;
}
结果

批量插入语法--copy的官网

还有从一个表导入另一个表(不同实体插入和同实体不同表插入,详见官网)


//(1)、非参数化插入(防注入) 
//优点:综合性能比较平均,列少1万条也不慢,属于万金油写法,不加事务情况下部分库有失败回滚机质
//缺点:数据量超过5万以上占用内存会比较大些,内存小可以用下面2种方式处理
db.Insertable(List<实体>).ExecuteCommand()  
db.Insertable(List<实体>).PageSize(1000).ExecuteCommand() //新功能:分页插入 5.1.4.103+
//(2)、参数化内部分页插入(底层是分页插入)
//优点:适合插入条数固定,并且条数较少,请求频繁高的功能(最大利用执行计划缓存)
//缺点:个别库500以上就开始慢了,要加事务才能回滚  
db.Insertable(List<实体>).UseParameter().ExecuteCommand()//5.0.3.8及以上 
//(3)、大数据写入(特色功能:大数据处理上比所有框架都要快30%)
//优点:1000条以上性能无敌手
//缺点:不支持数据库默认值, API功能简单, 小数据量并发执行不如普通插入,插入数据越大越适合用这个
//新功能 5.0.44
db.Fastest<实体>().PageSize(100000).BulkCopy(List<实体>);//MySql连接字符串要加AllowLoadLocalInfile=true

②修改表数据-Updateable🚩

细节参考官网:单表更新、更新数据 - SqlSugar 5x - .NET果糖网 (donet5.com)

代码
  sys_user user = db.Queryable<sys_user>().OrderBy(c => c.userId, OrderByType.Desc).First();
  user.sex = 1;
  db.Updateable<sys_user>(user).ExecuteCommand();
结果

③删除表数据-Deleteable🚩

细节参考官网:普通删除 、单表删除、表达式删除 用法 - SqlSugar 5x - .NET果糖网 (donet5.com)

代码
  sys_user user = db.Queryable<sys_user>().OrderBy(c => c.userId, OrderByType.Desc).First();
  //删除
  db.Deleteable<sys_user>(user).ExecuteCommand();
结果

④查询表数据-常用的Queryable🚩

🌟查所有
 List<sys_user> users = db.Queryable<sys_user>().ToList();//查所有
//select * from sys_user
🌟查总数——Count()
 int count =db.Queryable<sys_user>().Count();//查总数
    //select count(1) from sys_user 
🌟条件查询——where(条件)
   List<sys_user> user = db.Queryable<sys_user>().Where(it => it.sex == 1).ToList();//条件查询
      //select * from sys_user where sex = 1
🌟多条件查询——where(条件1&&条件2)
  List<sys_user> user = db.Queryable<sys_user>().Where(it => it.userId == 1&&it.sex==1).ToList();//多条件查询
    //select * from sys_user where userId = 1 and sex = 1
🌟模糊查询——Where(条件+Contains)
    db.Queryable<sys_user>().Where(it => it.avatar.Contains("a")).ToList();//模糊查询
//select  * from  sys_user where avatar like %a%
🌟查满足条件的首条——First(条件)
 sys_user user = db.Queryable<sys_user>().First(it => it.sex == 1);//查询满足条件第一条
      //select top 1 * from sys_user where sex = 1
🌟查满足条件的最后一条——逆序+First(条件)
db.Queryable<sys_user>()
.OrderBy(it=>it.Id,OrderByType.Desc )// 倒序
.First(it => it.sex == 1) //没有返回Null
//select top 1 * from sys_user order by id desc where sex = 1
🌟查前几条——Take(number)
 List<sys_user> users = db.Queryable<sys_user>().Take(10)ToList();//查前十条
//select top 10 * from sys_user
🌟是否存在——Any(条件)
bool isExists=  db.Queryable<sys_user>().Any(it => it.sex ==1);
🌟排序——OrderBy(排序列,类型)

详见:排序 OrderBy - SqlSugar 5x - .NET果糖网 (donet5.com)

var list =db.Queryable<Student>()
.LeftJoin<School>((st, sc) =>st.SchoolId==sc.Id)//两表关联
.OrderBy((st,sc)=>st.SchoolId)//写Select前面用法,正常都这么用;按照学校id排序
.Select((st,sc)=>new Dto(){ id=it.id ,Name=it.Name})
.ToList();
🌟最大值max;最小值min;求和Sum;平均值Avg
db.Queryable<Order>().Max(it=>it.Id);//四个函数用法一样
🌟分页查询——ToPageList(多参数)---可以用 ToOffsetPage 取代 ToPageList

详见分页查询,同步分页和异步分页 - SqlSugar 5x - .NET果糖网 (donet5.com)

 //多表分页
 var list = db.Queryable<Student>().LeftJoin<School>((st,sc)=>st.SchoolId==sc.Id)
 .Select((st,sc)=>new{Id=st.Id,Name=st.Name,SchoolName=sc.Name})
 .ToPageList(pageIndex, pageSize, ref totalCount,ref totalPage);
🌟多表联查——左连接.LeftJoin或者new JoinQueryInfos

详见联表查询、关联查询、JoinTable、连表查询、Left Join - SqlSugar 5x - .NET果糖网 (donet5.com)


db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos(
    JoinType.Left, o.Id == i.OrderId, //左连接 左链接 左联 
    JoinType.Left, o.CustomId == c.Id 
))
.Select((o,i,c)=>new ViewModel{ name=o.Name ..})
.ToList()
//那么生成的Sql就是
// FROM [Order] o 
// Left JOIN [OrderItem] i ON ( [o].[Id] = [i].[OrderId] )  
// Left JOIN [Custom] c ON ( [o].[CustomId] = [c].[Id] )
//联表查询
var query5 = db.Queryable<Order>()
    .LeftJoin<Custom>((o,cus) => o.CustomId == cus.Id)//多个条件用&&
    .LeftJoin<OrderDetail> ((o,cus,oritem) => o.Id == oritem.OrderId)
    .Where(o => o.Id == 1)  
    .Select((o,cus,oritem) => new ViewOrder {Id=o.Id,CustomName = cus.Name })
    .ToList(); 

// SELECT
//   [o].[Id] AS [Id],
//   [cus].[Name] AS [CustomName]
// FROM
//   [Order] o
//   Left JOIN [Custom] cus ON ([o].[CustomId] = [cus].[Id])
//   Left JOIN [OrderDetail] oritem ON ([o].[Id] = [oritem].[OrderId])
// WHERE
//   ([o].[Id] = @Id0)

6、控制台输出SQL语句-Aop.OnLogExecuting🚩

运行过的增删改查对应的SQL语句可打印到控制台

db.Aop.OnLogExecuting = (sql, par) =>

{

Console.WriteLine($"SQL语句:{sql}");

};
// See https://aka.ms/new-console-template for more information

using Models;
using SqlSugar;

Console.WriteLine("Hello, World!");
try
{
    ConnectionConfig connectionConfig = new ConnectionConfig()
    {
        ConnectionString = "Server=localhost;Database=net-vue;User ID=root;Password=root123;",
        DbType = DbType.MySql,
        InitKeyType = InitKeyType.Attribute
    };
    using (SqlSugarClient db=new SqlSugarClient(connectionConfig))
    {
        db.Aop.OnLogExecuting = (sql, par) =>
        {
            Console.WriteLine($"SQL语句:{sql}");
        };
        List<sys_user> users = db.Queryable<sys_user>().ToList();//查所有
        int count =db.Queryable<sys_user>().Count();//查总数
        List<sys_user> user1 = db.Queryable<sys_user>().Where(it => it.sex == 1).ToList();//条件查询
        List<sys_user> user2 = db.Queryable<sys_user>().Where(it => it.userId == 1&&it.sex==1).ToList();//多条件查询
        db.Queryable<sys_user>().Where(it => it.avatar.Contains("a")).ToList();//模糊查询
        bool isExists=  db.Queryable<sys_user>().Any(it => it.sex ==1);//是否存在
    }

}
catch (Exception  e)
{
    Console.WriteLine( e.Message);
    throw;
}

结果:

 详细内容见官网哦~

 本文适用小白常用~

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

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

相关文章

灵办AI助手Chrome插件全面评测:PC Web端的智能办公利器

探索灵办AI助手在Mac OS上的高效表现&#xff0c;支持多款主流浏览器&#xff0c;助你轻松应对办公挑战 文章目录 探索灵办AI助手在Mac OS上的高效表现&#xff0c;支持多款主流浏览器&#xff0c;助你轻松应对办公挑战摘要引言开发环境介绍核心功能评测1. 网页翻译与双语对照 …

【祖孙询问】

问题 代码 #include <bits/stdc.h> using namespace std; const int N 4e410; vector<int> edge[N]; int p[N][20], d[N]; void dfs(int from, int u) {for(auto to : edge[u]){if(to from) continue;d[to] d[u] 1;p[to][0] u;dfs(u, to);}} void init() {fo…

mysql主从同步遇到的问题

1&#xff0c;主库data文件复制到从库&#xff0c;之后主库要同步的实例data一定不要在修改&#xff1b; 1.1&#xff0c;修改之后就要重新覆盖一遍 2&#xff0c;如果状态不对&#xff1a;一定要查看日志&#xff1b;比如slave_io_state是空时&#xff0c;需要查看日志 2.1&a…

使用百度文心智能体创建AI旅游助手

百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&#xff0c;可以用来创建属于自己的智能体应用&#xff0c;访问官网链接&#xff1…

查看电脑连接过的wifi密码

netsh wlan show profiles netsh wlan show profile name"8821" keyclear

用Python实现9大回归算法详解——01. 线形回归算法

1. 线性回归的基本概念 线性回归是一种最基本的监督学习算法&#xff0c;用于预测因变量&#xff08;目标变量&#xff09;和一个或多个自变量&#xff08;特征变量&#xff09;之间的关系。线性回归假设因变量与自变量之间的关系是线性的&#xff0c;即可以用以下形式的线性方…

写一个githubDemo

1.List组件 <template><div class"container"><!-- 展示用户列表 --><div class"row"><divv-show"info.users.length"v-for"(item, index) in info.users":key"item.id"><div class"…

使用Python对知识文本进行分块

使用大型语言模型时&#xff0c;切勿忽略文本分块的重要性&#xff0c;其对处理结果的好坏有重大影响。接下来介绍常用的一些文本分块方法。1.1 一般的文本分块方法 如果不借助任何包&#xff0c;直接按限制长度切分方案。 text " 我是一个名为 chatGLm3-68 的人工智能助…

wps云字库字体下载到电脑

下拉字体菜单栏--->查看更多云字体 进入后 云字库里的字体&#xff0c;都只能在wps在线使用。 但是&#xff0c;要想下载到自己的电脑上&#xff0c;安装到电脑系统字体库中&#xff0c;WIN7的字体安装系统路径&#xff1a;C:\Windows\Fonts&#xff0c;以供电脑软件adobe …

Spring IoCDI(上)--初识

1. IoC & DI ⼊⻔ 1.1 Spring 是什么 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场 景, 有着活跃⽽庞⼤的社区, 我们⽤⼀句更具体的话来概括Spring, 那就是: Spring 是包含了众多⼯具⽅法的 IoC 容器 1.1.1 什么是容器…

C#委托(入门)

1、语法 步骤 ①定义一个委托类型, 如Help ②委托类型实例化为委托实例 ③定义函数(与委托类型相匹配的) ④将函数交给委托实例使用 示例一 //方法一 void MyFunc1() {Console.WriteLine("Hello"); }//方法二 void MyFunc2() {Console.WriteLine("World&…

STM32总线和时钟树(速记版)

一、存储器结构 1.1 STM32内存结构 型号说明 以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff0c;其命名规则如下&#xff1a; ST 是公司名&#xff0c;意法半导体。M 代表Cortex-M内核。32 代表32位微控制器。 F103 是芯片系列。 R 代表引脚数…

算法基础知识——11种距离度量

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 前言&#xff1a;距离的作用 数据聚类&#xff1a;距离度量在聚类算法&#xff08;如K-means、层次聚类&#xff09;中用于衡量数据点之间的相似性或差异性&#xff0c;帮助确定聚类的中心和边界…

10款开源管理工具大比拼:哪个最适合您的团队?

国内外主流的 10 款开源项目管理系统对比&#xff1a;PingCode、Worktile、Gitee、开源中国 (OSChina)、禅道 (ZenTao)、OpenProject、Redmine、Leantime、MeisterTask、Freedcamp。 在选择合适的开源项目管理工具时&#xff0c;你是否感到困惑和不安&#xff1f;市场上众多的选…

Python | Leetcode Python题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; class Solution:def countBits(self, n: int) -> List[int]:bits [0]for i in range(1, n 1):bits.append(bits[i & (i - 1)] 1)return bits

SSTI模版注入(初步)

SSTI模版注入&#xff08;初步&#xff09; ssti可能造成任意文件读取和RCE远程控制后台系统 漏洞成因&#xff1a;渲染模版时&#xff0c;没有严格控制对用户的输入&#xff1b; 使用了危险的模版&#xff0c;导致用户可以混合flask程序进行交互。 flask是基于python开发的…

【C++高阶】哈希—— 位图 | 布隆过滤器 | 哈希切分

✨ 人生如梦&#xff0c;朝露夕花&#xff0c;宛若泡影 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…

Ubuntu系统安装CH340驱动

今天在使用USB转UART模块连接设备时发现我的Ubuntu虚拟机无法识别USB设备&#xff0c;这个模块使用的CH340芯片&#xff0c;在Windows主机中可以识别到串口并连接&#xff0c;所以初步判断为虚拟机中缺少ch340驱动。实际上自Linux内核版本2.6.24起&#xff0c;Linux主线内核已内…

云原生-Docker安全-容器逃逸系统内核漏洞(解决docker.com无法访问)

云原生-Docker安全-容器逃逸&系统内核漏洞 细节部分在权限提升章节会详解&#xff0c;常用&#xff1a; CVE-2016-5195 CVE-2019-16884 CVE-2021-3493 CVE-2021-22555 CVE-2022-0492 CVE-2022-0847 CVE-2022-23222 云原生-Docker安全-容器逃逸&docker版本漏洞 CVE…

基于Java的医院急诊系统

TOC springboot327基于Java的医院急诊系统 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛…