Android 数据库框架ormlite 使用

article/2025/10/29 11:54:43

ormlite是什么?

首先可以去它的官网看看www.ormlite.com,它的英文全称是Object Relational Mapping,意思是对象关系映射;如果接触过Java EE开发的,一定知道Java Web开发就有一个类似的数据库映射框架——Hibernate。简单来说,就是我们定义一个实体类,利用这个框架,它可以帮我们吧这个实体映射到我们的数据库中,在Android中是SQLite,数据中的字段就是我们定义实体的成员变量。

为什么要用ormlite?

先说说优点

  1. 轻量级
  2. 使用简单,易上手
  3. 封装完善
  4. 文档全面

缺点

  1. 基于反射,效率较低
  2. 缺少中文翻译文档

如何使用?

第一种使用方式

导入jar包到项目libs文件夹下

到http://ormlite.com/releases/下载相应版本的jar,下载最新的,目前是最新版本4.49。我们下载稳定的4.48即可。

第二种使用方式

   implementation 'com.j256.ormlite:ormlite-android:5.0'implementation 'com.j256.ormlite:ormlite-core:5.0'

继承OrmLiteSqliteOpenHelper类定义数据库帮助类

package youli.com.example.administrator.myview;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;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 java.util.HashMap;
import java.util.Map;/*** 数据库操作管理工具类* <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集合private Map<String, Dao> daos = new HashMap<>();// 获取本类单例对象的方法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);}public DatabaseHelper(Context context, String databaseName, SQLiteDatabase.CursorFactory factory, int databaseVersion) {super(context, databaseName, factory, databaseVersion);}// 根据传入的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;}@Overridepublic void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {try {TableUtils.createTable(connectionSource, UserBean.class);TableUtils.createTable(connectionSource, ArticleBean.class);} catch (SQLException e) {e.printStackTrace();}}@Overridepublic void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {try {TableUtils.dropTable(connectionSource, UserBean.class, true);  //删除表格TableUtils.dropTable(connectionSource, ArticleBean.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;}}}

定义实体类Bean,代表一张表

创建上面用到的Bean,在ormlite中,它代表数据库中的一张表,我们所定义的所有成员变量均可为表中的字段,只要我们按照它提供的注解方式来指定成员变量属性。

举个栗子:

UserBean:
package youli.com.example.administrator.myview;import com.j256.ormlite.dao.ForeignCollection;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.field.ForeignCollectionField;
import com.j256.ormlite.table.DatabaseTable;import java.sql.Date;/*** UserBean实体类,存储数据库中user表中的数据* <p>* 注解:* DatabaseTable:通过其中的tableName属性指定数据库名称* DatabaseField:代表数据表中的一个字段* ForeignCollectionField:一对多关联,表示一个UserBean关联着多个ArticleBean(必须使用ForeignCollection集合)* <p>* 属性:* id:当前字段是不是id字段(一个实体类中只能设置一个id字段)* columnName:表示当前属性在表中代表哪个字段* generatedId:设置属性值在数据表中的数据是否自增* useGetSet:是否使用Getter/Setter方法来访问这个字段* canBeNull:字段是否可以为空,默认值是true* unique:是否唯一* defaultValue:设置这个字段的默认值*/
@DatabaseTable(tableName = "user") // 指定数据表的名称
public class UserBean {// 定义字段在数据库中的字段名public static final String COLUMNNAME_ID = "id";public static final String COLUMNNAME_NAME = "name";public static final String COLUMNNAME_SEX = "sex";public static final String COLUMNNAME_BIRTHDAY = "birthday";public static final String COLUMNNAME_ADDRESS = "address";@DatabaseField(generatedId = true, columnName = COLUMNNAME_ID, useGetSet = true)private int id;@DatabaseField(columnName = COLUMNNAME_NAME, useGetSet = true, canBeNull = false, unique = true)private String name;@DatabaseField(columnName = COLUMNNAME_SEX, useGetSet = true, defaultValue = "1")private String sex;@DatabaseField(columnName = COLUMNNAME_BIRTHDAY, useGetSet = true)private String birthday;@DatabaseField(columnName = COLUMNNAME_ADDRESS, useGetSet = true)private String address;@ForeignCollectionField(eager = true)//ForeignCollectionField:一对多关联,表示一个UserBean关联着多个ArticleBean(必须使用ForeignCollection集合)private ForeignCollection<ArticleBean> articles;public UserBean() {}public UserBean(String name, String sex, String birthday, String address) {this.name = name;this.sex = sex;this.birthday = birthday;this.address = address;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public ForeignCollection<ArticleBean> getArticles() {return articles;}public void setArticles(ForeignCollection<ArticleBean> articles) {this.articles = articles;}@Overridepublic String toString() {return "UserBean{" +"id=" + id +", name='" + name + '\'' +", sex=" + sex +", birthday=" + birthday +", address='" + address + '\'' +", articles=" + articles +'}';}}
ArticleBean:
package youli.com.example.administrator.myview;import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;/*** ArticleBean实体类,存储article数据表中的数据* 数据库中的article表和user表是关联的,因此我们需要在article表中配置外键* <p>* foreignColumnName:外键约束指向的类中的属性名* foreign:当前字段是否是外键* foreignAutoRefresh:如果这个属性设置为true,在关联查询的时候就不需要再调用refresh()方法了*/
@DatabaseTable(tableName = "article")
public class ArticleBean {// article表中各个字段的名称public static final String COLUMNNAME_ID = "id";public static final String COLUMNNAME_TITLE = "title";public static final String COLUMNNAME_CONTENT = "content";public static final String COLUMNNAME_USER = "user_id";@DatabaseField(generatedId = true, columnName = COLUMNNAME_ID, useGetSet = true)private int id;@DatabaseField(columnName = COLUMNNAME_TITLE, useGetSet = true, canBeNull = false, unique = true)private String title;@DatabaseField(columnName = COLUMNNAME_CONTENT, useGetSet = true)private String content;@DatabaseField(columnName = COLUMNNAME_USER, foreign = true, foreignAutoRefresh = true, foreignAutoCreate = true, foreignColumnName = UserBean.COLUMNNAME_ID)private UserBean user_id;public ArticleBean() {}public ArticleBean(String title, String content, UserBean user) {this.title = title;this.content = content;this.user_id = user;}public int getId() {return id;}public void setId(int id) {this.id = id;}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;}public UserBean getUser() {return user_id;}public void setUser(UserBean user) {this.user_id = user;}@Overridepublic String toString() {return "ArticleBean{" +"id=" + id +", title='" + title + '\'' +", content='" + content + '\'' +", user=" + user_id +'}';}
}

 从两个实体类中的代码来看,ORMLite和JavaWeb框架中的Hibernate相似,都是使用注解的方式来标注数据库中的表、字段、关联关系的,这也是ORMLite的工作原理:ORMLite是基于反射机制工作的,然而这也成为了ORMLite的一个非常致命的缺点,性能不好。因此,如果是对想能要求不高的项目,我们可以考虑使用ORMLite,而如果项目对性能要求较高,我们可以考虑使用GreenDAO。

  至于各个标签、各个属性的用途,将在本贴的最后贴出。

  现在让我们再来看ORMLite中的另一个比较重要的东西——DAO。DAO是用来将操作某张表的方法(增、删、改、查)封装起来的工具类。下面来看代码:

UserDao:
package youli.com.example.administrator.myview;import android.content.Context;import com.j256.ormlite.dao.Dao;import java.sql.SQLException;
import java.util.List;public class UserDao {public static UserDao userDao;private Context context;// ORMLite提供的DAO类对象,第一个泛型是要操作的数据表映射成的实体类;第二个泛型是这个实体类中ID的数据类型private Dao<UserBean, Integer> dao;public static UserDao getInstance(Context context) {if (userDao == null) {userDao = new UserDao(context);}return userDao;}public UserDao(Context context) {this.context = context;try {this.dao = DatabaseHelper.getInstance(context).getDao(UserBean.class);} catch (SQLException e) {e.printStackTrace();}}// 向user表中添加一条数据public void insert(UserBean data) {try {dao.create(data);} catch (SQLException e) {e.printStackTrace();}}// 删除user表中的一条数据public void delete(UserBean data) {try {dao.delete(data);} catch (SQLException e) {e.printStackTrace();}}// 删除指定id醒public void deleteById(int id) {try {dao.deleteById(id);} catch (SQLException e) {e.printStackTrace();}}// 修改user表中的一条数据public void update(UserBean data) {try {dao.update(data);} catch (SQLException e) {e.printStackTrace();}}// 查询user表中的所有数据public List<UserBean> selectAll() {List<UserBean> users = null;try {users = dao.queryForAll();} catch (SQLException e) {e.printStackTrace();}return users;}// 根据ID取出用户信息public UserBean queryById(int id) {UserBean user = null;try {user = dao.queryForId(id);} catch (SQLException e) {e.printStackTrace();}return user;}// 根据关键字查询用户信息public List<UserBean> querys(String key, String Value) {List<UserBean> users = null;try {users = dao.queryForEq(key, Value);} catch (SQLException e) {e.printStackTrace();}return users;}
}

ArticleDao:
package youli.com.example.administrator.myview;import android.content.Context;import com.j256.ormlite.dao.Dao;import java.sql.SQLException;
import java.util.List;/*** 操作article表的DAO类*/
public class ArticleDao {private Context context;private  static ArticleDao articleDao;// ORMLite提供的DAO类对象,第一个泛型是要操作的数据表映射成的实体类;第二个泛型是这个实体类中ID的数据类型private Dao<ArticleBean, Integer> dao;public static ArticleDao getInstance(Context context) {if (articleDao == null) {articleDao = new ArticleDao(context);}return articleDao;}public ArticleDao(Context context) {this.context = context;try {this.dao = DatabaseHelper.getInstance(context).getDao(ArticleBean.class);} catch (SQLException e) {e.printStackTrace();}}// 添加数据public void insert(ArticleBean data) {try {dao.create(data);} catch (SQLException e) {e.printStackTrace();}}// 删除数据public void delete(ArticleBean data) {try {dao.delete(data);} catch (SQLException e) {e.printStackTrace();}}// 修改数据public void update(ArticleBean data) {try {dao.update(data);} catch (SQLException e) {e.printStackTrace();}}// 通过ID查询一条数据public ArticleBean queryById(int id) {ArticleBean article = null;try {article = dao.queryForId(id);} catch (SQLException e) {e.printStackTrace();}return article;}// 通过条件查询文章集合(通过用户ID查找)public List<ArticleBean> queryByUserId(int user_id) {try {return dao.queryBuilder().where().eq(ArticleBean.COLUMNNAME_USER, user_id).query();} catch (SQLException e) {e.printStackTrace();}return null;}}

最后就是测试代码了。我们直接在MainActivity中写代码,然后运行看结果。在MainActivity中,我们首先创建两张表并向表中添加数据,然后从数据表中分别取出数据,展示到TextView中。代码如下:

layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:gravity="center"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/btn1"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:text="添加用户" /><Buttonandroid:id="@+id/btn1_1"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:text="添加文章" /><Buttonandroid:id="@+id/btn2"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:text="查询" /><Buttonandroid:id="@+id/btn3"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:text="删除" /><Buttonandroid:id="@+id/btn4"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:text="修改" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:orientation="horizontal"><EditTextandroid:id="@+id/edit1"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:layout_margin="2dp"android:gravity="center"android:hint="姓名"android:text="李白"android:textSize="16dp" /><EditTextandroid:id="@+id/edit2"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:layout_margin="2dp"android:gravity="center"android:hint="性别"android:text="男"android:textSize="16dp" /><EditTextandroid:id="@+id/edit3"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:layout_margin="2dp"android:gravity="center"android:hint="生日"android:text="1996-02-02"android:textSize="16dp" /><EditTextandroid:id="@+id/edit4"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:layout_margin="2dp"android:gravity="center"android:hint="住址"android:text="北京"android:textSize="16dp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:orientation="horizontal"><EditTextandroid:id="@+id/edit5"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:layout_margin="2dp"android:gravity="center"android:hint="标题"android:text="望相思"android:textSize="16dp" /><EditTextandroid:id="@+id/edit6"android:layout_width="0dp"android:layout_weight="3"android:layout_height="wrap_content"android:layout_margin="2dp"android:gravity="center"android:hint="内容"android:text="床前明月光"android:textSize="16dp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/text1"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="2dp"android:gravity="center"android:textSize="16dp" /></ScrollView></LinearLayout>
</LinearLayout>
MainActivity:
package youli.com.example.administrator.myview;import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.j256.ormlite.dao.ForeignCollection;
import com.j256.ormlite.stmt.DeleteBuilder;import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private EditText mEdit1;private EditText mEdit2;private EditText mEdit3;private EditText mEdit4;private EditText mEdit5;private EditText mEdit6;private Button mBtn1;private Button btn1_1;private Button mBtn2;private Button mBtn3;private Button mBtn4;private TextView text1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {mEdit1 = (EditText) findViewById(R.id.edit1);mEdit2 = (EditText) findViewById(R.id.edit2);mEdit3 = (EditText) findViewById(R.id.edit3);mEdit4 = (EditText) findViewById(R.id.edit4);mEdit5 = (EditText) findViewById(R.id.edit5);mEdit6 = (EditText) findViewById(R.id.edit6);mBtn1 = (Button) findViewById(R.id.btn1);btn1_1 = (Button) findViewById(R.id.btn1_1);mBtn2 = (Button) findViewById(R.id.btn2);mBtn3 = (Button) findViewById(R.id.btn3);mBtn4 = (Button) findViewById(R.id.btn4);text1 = (TextView) findViewById(R.id.text1);btn1_1.setOnClickListener(this);mBtn1.setOnClickListener(this);mBtn2.setOnClickListener(this);mBtn3.setOnClickListener(this);mBtn4.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn1:     //新增用户getInsert();break;case R.id.btn1_1:   //新增文章getInsert_wz();getInsert_wz1();break;case R.id.btn2:     //查询
//                getQuery();getQuery1();break;case R.id.btn3:    //删除getDelete();break;case R.id.btn4:    //修改getUpdate();break;}}private void getInsert() {  //新增用户String name = mEdit1.getText().toString().trim();String sex = mEdit2.getText().toString().trim();String birthday = mEdit3.getText().toString().trim();String address = mEdit4.getText().toString().trim();UserBean userData = new UserBean(name, sex, birthday, address);   // 添加用户数据UserDao.getInstance(MainActivity.this).insert(userData);}private void getInsert_wz() {  //新增文章String title = mEdit5.getText().toString().trim();String content = mEdit6.getText().toString().trim();UserBean userData = UserDao.getInstance(MainActivity.this).queryById(12);ArticleBean articleData = new ArticleBean(title, content, userData);    // 添加文章数据ArticleDao.getInstance(MainActivity.this).insert(articleData);}private void getInsert_wz1() {  //新增文章String title = mEdit5.getText().toString().trim();String content = mEdit6.getText().toString().trim();List<UserBean> list = UserDao.getInstance(MainActivity.this).querys("name", "李三思"); //唯一值  只有一条ArticleBean articleData = new ArticleBean(title, content, list.get(0));    // 添加文章数据ArticleDao.getInstance(MainActivity.this).insert(articleData);}/*** 根据文章查询 关联人的信息*/private void getQuery() {StringBuffer contentBuffer = new StringBuffer();ArticleBean articleBean = new ArticleDao(MainActivity.this).queryById(1); // 从数据库中根据ID取出文章信息contentBuffer.append(articleBean.toString());List<UserBean> list = UserDao.getInstance(MainActivity.this).selectAll();     //根据取出的用户id查询用户信息if (list == null || list.size() < 0) {return;}UserBean userBean = new UserDao(MainActivity.this).queryById(6);        // 从用户信息中取出关联的文章列表信息ForeignCollection<ArticleBean> articles = userBean.getArticles();Iterator<ArticleBean> iterator = articles.iterator();while (iterator.hasNext()) {ArticleBean article = iterator.next();contentBuffer.append(article.toString() + "\n");}text1.setText(contentBuffer.toString());   // 设置TextView的文本}/*** 关键字查询跟人信息 与 关联的文章*/private void getQuery1() {StringBuffer contentBuffer = new StringBuffer();List<UserBean> list = UserDao.getInstance(MainActivity.this).querys("name", "李三思");for (int i = 0; i < list.size(); i++) {ForeignCollection<ArticleBean> articles = list.get(i).getArticles();Iterator<ArticleBean> iterator = articles.iterator();while (iterator.hasNext()) {ArticleBean article = iterator.next();contentBuffer.append(article.toString() + "\n");}}// 设置TextView的文本text1.setText(contentBuffer.toString());}private void getDelete() {//查询用户List<UserBean> list = UserDao.getInstance(MainActivity.this).querys("name", "李三思");//删除用户关联的文章for (int i = 0; i < list.size(); i++) {ForeignCollection<ArticleBean> articles = list.get(i).getArticles();Iterator<ArticleBean> iterator = articles.iterator();while (iterator.hasNext()) {ArticleBean article = iterator.next();ArticleDao.getInstance(this).delete(article);//删除}}//删除用户UserBean userBean = new UserBean();userBean.setId(7);UserDao.getInstance(MainActivity.this).delete(userBean);}private void getUpdate() {UserBean userBean = new UserBean();userBean.setId(5);userBean.setName("李三思");userBean.setSex("女");userBean.setBirthday("1996-03-03");userBean.setAddress("湖北");UserDao.getInstance(MainActivity.this).update(userBean);}@Overrideprotected void onDestroy() {super.onDestroy();//DatabaseHelper.getInstance(this).close();}}

 运行结果如下图所示:

  最后,贴出ORMLite中常用标签和各个属性代表的意义:

 常见标签:

 DatabaseTable:通过其中的tableName属性指定数据库名称
 DatabaseField:代表数据表中的一个字段
 ForeignCollectionField:一对多关联,表示一个UserBean关联着多个ArticleBean(必须使用ForeignCollection集合)
  常见属性:

id:当前字段是不是id字段(一个实体类中只能设置一个id字段)
columnName:表示当前属性在表中代表哪个字段
generatedId:设置属性值在数据表中的数据是否自增
useGetSet:是否使用Getter/Setter方法来访问这个字段
canBeNull:字段是否可以为空,默认值是true
unique:是否唯一
defaultValue:设置这个字段的默认值
foreignColumnName:外键约束指向的类中的属性名
foreign:当前字段是否是外键
foreignAutoRefresh:如果这个属性设置为true,在关联查询的时候就不需要再调用refresh()方法了


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

相关文章

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资源视…

Hypervisor 简介

单词解释 Hypervisor&#xff1a;超级监督者&#xff0c;管理程序 虚拟化技术 概念 一种运行在基础物理服务器和操作系统之间的中间软件层&#xff0c;可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisor协调着这些硬件资源的访问&#xff0c;以及各个虚拟机之间…