Ormlite基本使用

article/2025/10/29 11:52:34
  • 首先需要导入ORMLite的依赖:在build.gradle中加入以下代码:
 implementation 'com.j256.ormlite:ormlite-android:5.1'implementation 'com.j256.ormlite:ormlite-core:5.1'
  • 建立Bean类(以OneTableBean为例)
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;@DatabaseTable(tableName = "onetable")
public class OneTableBean {@DatabaseField(generatedId = true, columnName = "messageId", unique = true)private int messageId;//主键@DatabaseField(columnName = "batchNo")private String batchNo;//批次号码	3@DatabaseField(columnName = "title")private String title;//标题	zzzz@DatabaseField(columnName = "content")private String content;//内容	zzzpublic int getMessageId() {return messageId;}public void setMessageId(int messageId) {this.messageId = messageId;}public String getBatchNo() {return batchNo;}public void setBatchNo(String batchNo) {this.batchNo = batchNo;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}@Overridepublic String toString() {return "OneTableBean{" +"messageId=" + messageId +", batchNo='" + batchNo + '\'' +", title='" + title + '\'' +", content='" + content + '\'' +'}';}
}

数据库中字段注解设置说明:

在这里插入图片描述

  • 构建DatabaseHelper对DAO进行了统一的管理
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.ArrayMap;import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;import java.sql.SQLException;import cn.tsou.ormlite.bean.ArticleBean;
import cn.tsou.ormlite.bean.OneTableBean;
import cn.tsou.ormlite.bean.UserBean;/*** 数据库操作管理工具类* <p>* 我们需要自定义一个类继承自ORMlite给我们提供的OrmLiteSqliteOpenHelper,创建一个构造方法,重写两个方法onCreate()和onUpgrade()* 在onCreate()方法中使用TableUtils类中的createTable()方法初始化数据表* 在onUpgrade()方法中我们可以先删除所有表,然后调用onCreate()方法中的代码重新创建表* <p>* 我们需要对这个类进行单例,保证整个APP中只有一个SQLite Connection对象* <p>* 这个类通过一个Map集合来管理APP中所有的DAO,只有当第一次调用这个DAO类时才会创建这个对象(并存入Map集合中)* 其他时候都是直接根据实体类的路径从Map集合中取出DAO对象直接调用*/
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {// 数据库名称public static final String DATABASE_NAME = "mydb.db";// 本类的单例实例private static DatabaseHelper instance;// 存储APP中所有的DAO对象的Map集合@SuppressLint("NewApi")private ArrayMap<String, Dao> daos = new ArrayMap<>();// 获取本类单例对象的方法public static synchronized DatabaseHelper getInstance(Context context) {if (instance == null) {synchronized (DatabaseHelper.class) {if (instance == null) {instance = new DatabaseHelper(context);}}}return instance;}// 私有的构造方法private DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, 1);}// 根据传入的DAO的路径获取到这个DAO的单例对象(要么从daos这个Map中获取,要么新创建一个并存入daos)public synchronized Dao getDao(Class clazz) throws SQLException {Dao dao = null;String className = clazz.getSimpleName();if (daos.containsKey(className)) {dao = daos.get(className);}if (dao == null) {dao = super.getDao(clazz);daos.put(className, dao);}return dao;}@Override // 创建数据库时调用的方法public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {try {TableUtils.createTable(connectionSource, OneTableBean.class);} catch (SQLException e) {e.printStackTrace();}}@Override // 数据库版本更新时调用的方法public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {try {TableUtils.dropTable(connectionSource, OneTableBean.class, true);onCreate(database, connectionSource);} catch (SQLException e) {e.printStackTrace();}}// 释放资源@Overridepublic void close() {super.close();for (String key : daos.keySet()) {Dao dao = daos.get(key);dao = null;}}
}

注:新表建立必须在onCreate创建

  • 构建Bean对应的dao
import android.content.Context;import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.QueryBuilder;import java.sql.SQLException;
import java.util.List;import cn.tsou.ormlite.bean.OneTableBean;
import cn.tsou.ormlite.manager.DatabaseHelper;/*** 操作OneTableBean数据表的Dao类,封装这操作OneTableBean表的所有操作* 通过DatabaseHelper类中的方法获取ORMLite内置的DAO类进行数据库中数据的操作* <p>* 调用dao的create()方法向表中添加数据* 调用dao的delete()方法删除表中的数据* 调用dao的update()方法修改表中的数据* 调用dao的queryForAll()方法查询表中的所有数据*/
public class OneTableDao {// ORMLite提供的DAO类对象,第一个泛型是要操作的数据表映射成的实体类;第二个泛型是这个实体类中ID的数据类型private Dao<OneTableBean, Integer> dao;public OneTableDao(Context context) {try {this.dao = DatabaseHelper.getInstance(context).getDao(OneTableBean.class);} catch (SQLException e) {e.printStackTrace();}}/*** 创建数据** @param data*/public void create(OneTableBean data) {try {dao.createOrUpdate(data);} catch (SQLException e) {e.printStackTrace();}}/*** 创建数据集合** @param datas*/public void createList(List<OneTableBean> datas) {try {dao.create(datas);} catch (SQLException e) {e.printStackTrace();}}/*** 向user表中添加一条数据* <p>* create:插入一条数据或集合* <p>* createIfNotExists:如果不存在则插入* <p>* createOrUpdate:如果指定id则更新** @param data*/public void insert(OneTableBean data) {try {dao.createIfNotExists(data);} catch (SQLException e) {e.printStackTrace();}}// 通过id删除指定数据public void delete(int id) {try {dao.deleteById(id);} catch (SQLException e) {}}// 删除表中的一条数据public void delete(OneTableBean data) {try {dao.delete(data);} catch (SQLException e) {e.printStackTrace();}}// 删除数据集合public void deleteList(List<OneTableBean> datas) {try {dao.delete(datas);} catch (SQLException e) {e.printStackTrace();}}//清空数据public void deleteAll() {try {dao.delete(dao.queryForAll());} catch (Exception e) {}}// 修改表中的一条数据public void update(OneTableBean data) {try {dao.update(data);} catch (SQLException e) {e.printStackTrace();}}// 查询表中的所有数据public List<OneTableBean> queryAll() {List<OneTableBean> users = null;try {users = dao.queryForAll();} catch (SQLException e) {e.printStackTrace();}return users;}// 根据ID取出用户信息public OneTableBean queryById(int id) {OneTableBean user = null;try {user = dao.queryForId(id);} catch (SQLException e) {e.printStackTrace();}return user;}// 通过条件查询集合(例如:通过messageId和title)public List<OneTableBean> queryByMessageIdAndTitle(int messageId, String title) {try {QueryBuilder<OneTableBean, Integer> builder = dao.queryBuilder();builder.where().eq("messageId", messageId).and().eq("title", title);builder.orderBy("messageId", false);return builder.query();} catch (SQLException e) {e.printStackTrace();}return null;}// 通过条件查询集合(例如:通过content)public List<OneTableBean> queryByContent(String content) {try {QueryBuilder<OneTableBean, Integer> builder = dao.queryBuilder();builder.where().eq("content", content);builder.orderBy("title", false);return builder.query();} catch (SQLException e) {e.printStackTrace();}return null;}
}
  • 测试
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;import java.util.ArrayList;
import java.util.List;import cn.tsou.ormlite.bean.OneTableBean;
import cn.tsou.ormlite.dao.OneTableDao;public class MainActivity extends AppCompatActivity {private int position;private OneTableDao oneTableDao;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);position = 0;oneTableDao = new OneTableDao(this);}/*** 创建数据集合** @param view*/public void createList(View view) {ArrayList<OneTableBean> oneTableBeans = new ArrayList<>();for (int i = 0; i < 10; i++) {OneTableBean oneTableBean = new OneTableBean();oneTableBean.setTitle("创建数据集合" + i);oneTableBean.setBatchNo("yes");oneTableBean.setContent("哎呀");oneTableBeans.add(oneTableBean);}oneTableDao.createList(oneTableBeans);}/*** 创建数据** @param view*/public void create(View view) {OneTableBean oneTableBean = new OneTableBean();oneTableBean.setTitle("huangxiaoguo" + position);oneTableBean.setBatchNo("yes");oneTableBean.setContent("大大");oneTableDao.create(oneTableBean);OneTableBean oneTableBean1 = new OneTableBean();oneTableBean1.setTitle("huangxiaoguo" + position);oneTableBean1.setBatchNo("大大");oneTableDao.create(oneTableBean1);position++;}/*** 添加一条数据** @param view*/public void add(View view) {OneTableBean oneTableBean = new OneTableBean();if (position == 6) {oneTableBean.setTitle("huangxiaoguo" + position);oneTableBean.setBatchNo("154546");oneTableBean.setContent("dadiouahddjaopdja");} else if (position == 8) {oneTableBean.setTitle("huangxiaoguo" + position);} else {oneTableBean.setTitle("huangxiaoguo" + position);oneTableBean.setBatchNo("no");oneTableBean.setContent("大大");}oneTableDao.insert(oneTableBean);position++;}/*** 通过id删除指定数据** @param view*/public void deleteByID(View view) {oneTableDao.delete(1);}/*** 删除user表中的一条数据** @param view*/public void delete(View view) {oneTableDao.delete(oneTableDao.queryById(2));}/*** 删除数据集合** @param view*/public void deleteList(View view) {oneTableDao.deleteList(oneTableDao.queryByContent("大大"));}/*** 清空数据** @param view*/public void deleteAll(View view) {oneTableDao.deleteAll();}/*** 更新** @param view*/public void updata(View view) {OneTableBean oneTableBean = oneTableDao.queryById(5);if (oneTableBean != null) {oneTableBean.setTitle("我被更新了");oneTableDao.update(oneTableBean);}}/*** 查询user表中的所有数据** @param view*/public void queryAll(View view) {Log.d("huangxiaoguo", "-----------------------------------------------");List<OneTableBean> oneTableBeans = oneTableDao.queryAll();for (int i = 0; i < oneTableBeans.size(); i++) {Log.d("huangxiaoguo", oneTableBeans.get(i).toString());}}/*** 根据ID取出用户信息** @param view*/public void queryById(View view) {OneTableBean oneTableBean = oneTableDao.queryById(5);Log.d("huangxiaoguo", "-----------------------------------------------");if (oneTableBean != null)Log.d("huangxiaoguo", oneTableBean.toString());}/*** 通过条件查询集合** @param view*/public void queryOther(View view) {List<OneTableBean> huangxiaoguo6 = oneTableDao.queryByMessageIdAndTitle(6, "huangxiaoguo0");Log.d("huangxiaoguo", "-----------------------------------------------");Log.d("huangxiaoguo", huangxiaoguo6.toString());List<OneTableBean> huangxiaoguo61 = oneTableDao.queryByContent("大大");Log.d("huangxiaoguo", "-----------------------------------------------");Log.d("huangxiaoguo", huangxiaoguo61.toString());}
}
  • 效果展示
    在这里插入图片描述

  • Builder说明

       queryBuilder() 创建一个查询生成器:进行复杂查询deleteBuilder() 创建一个删除生成器,进程复杂条件删除updateBuilder() 创建修条件生成器,进行复杂条件修改条件查找器DeleteBuilder,QueryBuilder,UpdateBuilder  
    

在SQL语句中,经常会用到where语句,where 进行条件筛选。
dao.queryBuilder.()where()方法返回一个where对象,where中提供了很多方法来进行条件筛选,下边逐个讲where中的方法。

方法 :eq(columnName,value) 等于(=)equals

使用示范:mDao.queryBuilder().where().eq("id", 2).query();
对应SQL:SELECT * FROM t_person WHERE id = 2

方法 :lt(columnName,value) 小于(<) less than

使用示范:mDao.queryBuilder().where().lt("id", 2).query();
对应SQL:SELECT * FROM t_person WHERE id < 2

方法 :gt(columnName,value) 大于(>) greater than

使用示范:mDao.queryBuilder().where().gt("id", 2).query();
对应SQL:SELECT * FROM t_person WHERE id > 2

方法 :ge(columnName,value) 大于等于(>=)greater-than or equals-to

使用示范:mDao.queryBuilder().where().ge("id", 2).query();
对应SQL:SELECT * FROM t_person WHERE id >= 2

方法 :le(columnName,value) 小于等于(<=)less than or equals-to

使用示范:mDao.queryBuilder().where().le("id", 2).query();
对应SQL:SELECT * FROM t_person WHERE id <= 2

方法 :ne(columnName,value) 不等于(<>)not-equal-to

使用示范:mDao.queryBuilder().where().ne("id", 2).query();
对应SQL:SELECT * FROM t_person WHERE id <> 2

方法 :in(columnName,object…) 在指定列中匹配object数组所对应的值,返回匹配到的结果行集合,in还有几个重载方法,需要的话可以去看文档或源码

使用示范:mDao.queryBuilder().where().in("id", 1,2).query();
对应SQL:SELECT * FROM t_person WHERE id IN (1,2 )

方法 :notIn(columnName,object…) 在指定列中匹配object数组所对应的值,返回没有匹配到的结果行集合notIn还有几个重载方法,需要的话可以去看文档或源码

使用示范:mDao.queryBuilder().where().notIn("id",1,2).query();
对应SQL:SELECT * FROM t_person WHERE id NOT IN (1 ,2 )

方法 :like(columnName,pattern) 使用%通配符来匹配,指定行数据,返回匹配到的结果

使用示范:mDao.queryBuilder().where().like("LastName", "A%").query(); 匹配A开头的LastName
mDao.queryBuilder().where().like("LastName", “%s").query(); 匹配s结尾的LastName
mDao.queryBuilder().where().like("LastName", “%art%").query(); 匹配中间为art的LastName
对应SQL:SELECT * FROM `t_person` WHERE `LastName` LIKE 'A%'

方法 :between(columnName,low,high) 获取指定范围内的结果

使用示范:mDao.queryBuilder().where().between("id", 1, 2).query();   获取id是1到2之间的结果
对应SQL:SELECT * FROM `t_person` WHERE `id` BETWEEN 1 AND 2

方法and(),or()用来组合上述where子语句。进行与,或操作。

方法 :and() where子句与操作

使用示范:mDao.queryBuilder().where().lt("id", 3).and().gt("id", 1).query();
对应SQL:SELECT * FROM `t_person` WHERE (`id` < 3 AND `id` > 1 )

方法 :or() where子句或操作

使用示范:mDao.queryBuilder().where().eq("id", 1).or().eq("id", 2).query();
对应SQL:SELECT * FROM `t_person` WHERE (`id` = 1 OR `id` = 2 )

ORDER BY

根据指定列名排序,降序,升序
使用示范:mDao.queryBuilder().orderBy("id", false).query(); //参数false表示降序,true表示升序。
对应SQL:SELECT * FROM `t_person` ORDER BY `id` DESC(降序)

DISTINCT

过滤指定列不重复数据行,重复的只返回一次。
使用示范:mDao.queryBuilder().selectColumns("City").distinct().query();
对应SQL:SELECT DISTINCT `City` FROM `t_person`

GROUP BY

按照指定列分组
使用示范:mDao.queryBuilder().groupBy("city").query();
对应SQL:SELECT * FROM t_person GROUP BY city

offset Limit

offset跳过指定的行数
limit限制获取指定行数
使用示范:mDao.queryBuilder().offset(2).limit(2).query();  可以用来分页
对应SQL:SELECT * FROM t_person LIMIT 2 OFFSET 2

Having

等同于sql中的Having,针对分组数据,进行聚合函数(SUM, COUNT, MAX, AVG)运算。
使用示范:mPersonList = mDao.queryBuilder().groupBy("City").having("SUM(id)>4").query()
对应SQL:SELECT * FROM t_person GROUP BY City HAVING SUM(id)>4

countOf

返回查询结果的总数
使用示范:mDao.queryBuilder().countOf()
对应SQL:SELECT COUNT(*) FROM t_person

iterator

返回一个结果集的迭代器。
使用示范:Iterator<Person> iterator = mDao.queryBuilder().iterator();

queryForFirst

返回所有行的第一行。
使用示范:mDao.queryBuilder().queryForFirst();

http://chatgpt.dhexx.cn/article/mVqTa6Fi.shtml

相关文章

Android 数据库框架ormlite 使用

ormlite是什么&#xff1f; 首先可以去它的官网看看www.ormlite.com&#xff0c;它的英文全称是Object Relational Mapping&#xff0c;意思是对象关系映射&#xff1b;如果接触过Java EE开发的&#xff0c;一定知道Java Web开发就有一个类似的数据库映射框架——Hibernate。简…

Android ORMLite数据库简介

&#xfeff;&#xfeff; 一般的项目中&#xff0c;Android自身提供的SQLite数据库&#xff0c;可以满足轻量级的数据存储应用&#xff0c;但是&#xff0c;只要是存储模型稍微复杂的项目&#xff0c;以及数据结构模型复杂的应用&#xff0c;就很难再用SQLite支撑整个项目的数…

python的网络请求库urllib、urllib2、urllib3、request的联系

文章目录 1. 简介2. urllib3. urllib24. urllib35. requests6. 相关文章 1. 简介 urllib、urllib2、urllib3、request均能通过网络访问互联网上的资源文件&#xff0c;它们通过使用统一资源定位符&#xff08;URL&#xff09;并结合re模块完成很多意想不到的操作。 urllib&am…

python3安装urllib2_python3.6想使用urllib2包怎么办

Python3.6.6或者说python3.x找不到urllib2语法问题修改之后&#xff0c;会报一个没有安装urllib2的包的错误。 通过pip install urllib2也会提示找不到包。(推荐学习&#xff1a;Python视频教程) 通过pip3 install urllib2也会提示找不到包。 这是因为builtwith依赖于urllib2包…

pythonurllib2方法_解决python3.6想使用urllib2包的方法

解决python3.6想使用urllib2包的方法 发布时间&#xff1a;2020-08-11 14:24:50 来源&#xff1a;亿速云 阅读&#xff1a;131 作者&#xff1a;小新 小编给大家分享一下解决python3.6想使用urllib2包的方法&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章…

python安装urllib2_Python如何安装urllib2库

urllib2 是 Python2.7 自带的模块(不需要下载,导入即可使用)。 urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。 在Python中有很多库可以用来抓取网页,我们先学习urllib2。urllib2 是 Python2.7 自带的模块(不需要下载,…

python爬虫-urllib2的使用方法详解(python3)

文章目录 python编程快速上手&#xff08;持续更新中…&#xff09;python爬虫从入门到精通urllib2概述python2与python3对比urlopenRequestUser-Agent添加更多的Header信息 urllib2默认只支持HTTP/HTTPS的GET和POST方法URL编码转换&#xff1a;urllib.parse.urlencode模拟百度…

Urllib2库丨Python爬虫基础入门系列(12)

提示&#xff1a;文末有福利&#xff01;最新Python爬虫资料/学习指南>>戳我直达 文章目录 前言Urllib2库学习目的urlopenGET请求方式利用urllib2.Request类,添加Header信息POST请求方式抓取招聘信息思考一下 小结 总结 前言 Urllib2库 urllib2是python2.7自带的模块(不…

Hyper-V虚拟化

第一章 Hyper-V 介绍 1-1 Hyper-V发展历史 2003 年&#xff0c;微软收购了一家虚拟化软件公司。2004 年推出了第一个桌面虚拟化产品Virtual PC 2004&#xff0c;其功能类似于VMware 工作站(work station)。由于该虚拟化产品集成在操作系统之中&#xff0c;所以用户可以在windo…

QNX Hypervisor管理程序

QNX Hypervisor管理程序 借助 QNX 管理程序&#xff0c;可以将具有不同操作系统&#xff0c;不同可靠性和安全要求的多个嵌入式系统&#xff0c;整合到单个片上系统 (SoC) 中。可以轻松地将未修改的代码移动到最新的硬件上&#xff0c;只需在适当配置的hypervisor 管理程序虚拟…

怎么开启windows hypervisor platform,解决hypervisor platform消失无法安装的问题

正常的windows功能面板 我的 很好,没有安装windows hypervisor platform的机会,但是没关系(ps:此处描述有误中文名称应该是虚拟机监控程序平台) 然后cmd 或powershll 管理员身份运行 Dism /online /Get-Features 可以查看到hypervisor platform是禁用状态 ::%cd%代表的是执…

Android Studio安装常见问题详解——Android Emulator Hypervisor Driver for AMD Processors installation failed.

目录 一、问题描述二、解决方案2.1 开启CPU虚拟化2.2 禁用Hyper-V2.3 使用管理员命令行在驱动程序包中执行“silent_install.bat” 一、问题描述 新买的AMD轻薄本&#xff0c;在安装Android Studio时遇到问题&#xff1a; Android Emulator Hypervisor Driver for AMD Process…

Hypervisor之半虚拟化virtio

1 基本概念 virtio共享内存使用的是guest GPA&#xff0c;由guest virtio front-end驱动初始化队列的时候分配&#xff0c;在back-end驱动中&#xff0c;QVM或者QEMU将GPA转换到HVA或者HPA地址再读写数据。 virtio front-end通知back-end方式&#xff1a;访问doorbell寄存器触发…

VMware vSphere Hypervisor (ESXi) 7.0U3g安装

VMware vSphere Hypervisor“ESXi” 7.0U3g 安装 一、准备工作1、查看支持ESXI7.0U3的CPU型号&#xff1b;2、下载将镜像制作成安装盘的软件&#xff1b;3、注册vmware账号&#xff0c;下载ESXI7.0U3镜像&#xff1b; 二、安装VMware vSphere Hypervisor (ESXi) 7.0U3g三、配置…

Vmware vSphere hypervisor 虚拟化软件安装

目录 一、概述 1.1.什么是 vSphere Hypervisor&#xff1f; 二、U盘启动制作 2.1. ultraiso安装完成后打开文件 2.2.选择我们下载好的虚拟化软件ios 2.3.写入映像文件 2.4.写入硬盘映像&#xff0c;驱动器选择插入的U盘 三、 Vmware vSphere hypervisor安装 四、虚拟机…

Hypervisor---虚拟化技术简易说明

Hypervisor&#xff0c;虚拟机监视器&#xff08;英语&#xff1a;virtual machine monitor&#xff0c;缩写为 VMM&#xff09;&#xff0c;是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。 被Hypervisor用来执行一个或多个虚拟机器…

hypervisor - qnx

按照definition of Goldberg (1973), Hypervisor – Wikipedia: qnx hypervisor is type 2 QNX considers its hypervisor to be a type 1 (although it is a type 2)

什么是虚拟机管理程序hypervisor,什么是hypervisor type 1, hypervisor type 2

服务器虚拟化目前是IT界的一个热门话题。它的受欢迎程度和使用率一直在增长&#xff0c;尤其是在企业环境中。使虚拟化成为可能的是所谓的hypervisor 管理程序。服务器虚拟化允许不同的操作系统在一台服务器上运行单独的应用程序&#xff0c;同时仍使用相同的物理资源。这些虚拟…

了解以及区分物理机,虚拟机(hypervisor/VMM) 和 容器(Docker)的适用场景

了解以及区分物理机&#xff0c;虚拟机hypervisor/VMM 和 容器Docker的适用场景 Abbreviations物理机和虚拟机以及容器的区别动机motivation&#xff1a;为什么要有虚拟机物理机:虚拟机容器 虚拟机的种类以及他们的本质区别虚拟化方式虚拟机类型docker技术传统计算机体系结构虚…

虚拟化与hypervisor

文章目录 虚拟化HypervisorHypervisor分类Hypervisor优点Container vs HypervisorHypervisorContainer 虚拟化 虚拟化通过将公司的物理资源视为可以动态分配虚拟资源的池&#xff0c;从而提高了IT资源的利用率。 虚拟化涉及从物理思维到逻辑思维的转变&#xff0c;将IT资源视…