【数据库学习】数据库平台:Access,sql server,sqlite, neo4j

数据库学习 专栏收录该内容
9 篇文章 1 订阅

数据库管理系统(DBMS):是系统软件,是数据库系统的核心。
常见数据库管理系统有:Access、mysql、sql server

1,Access

2,sql server

①应用

打开SQL Server 配置管理器:运行SQLServerManager10.msc命令。
SQL Server默认端口:1433

②备份与恢复

i>所有文件 备份与恢复

备份:数据库右击 -> 任务 -> 备份 -> 添加 -> 选择文件地址(文件类型选择所有文件) -> 依次确定
还原:新建数据库 右击 -> 任务 -> 还原 -> 数据库 -> 选项 -> 覆盖现有数据库 -> 常规 -> 源设备 -> 添加(文件类型选择全部文件,然后选择之前备份的文件) -> 还原

ii>sql文件 备份与恢复

备份:数据库右击 -> 任务 -> 生成脚本 -> 选择特定数据库对象 -> 选择表,然后下一步 -> 高级(在最后的要编写脚本的数据的类型,选择架构和数据) -> 选择文件名,依次下一步至完成。
还原:新建数据库,文件 -> 打开 -> 文件 -> 打开对应sql文件,执行即可。

3,android之sqlite

①概念

sqlite是一款轻量级数据库,是遵守ACID(指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))的关系型数据库管理系统。在嵌入式设备中,可能只需要几百K的内存就够了。
SQLite默认是打开事务的。

②安全性

android手机root之后,就可以在/data/data/包名/database/目录中查看sqlite数据库。所以,对于敏感信息,应该考虑加密。

SQLite不支持加密,所以我们针对数据库文件加密。现有两种解决方案:

i>对数据库中的数据进行加密

①优点:
加密速度快。
程序无须变动,只针对数据进行加密。
②缺点:
来回加密,造成处理数据缓慢。
仅对数据加密,依然可以看到数据表的sql语句,可能猜测到表的作用。
③实现:
一是:对明文数据进行加密返回密文数据
二是:对密文数据进行解密返回明文数据

ii>对数据库文件进行加密

①优点
对整个文件进行了加密,用户通过编辑器看不到任何有用的数据。
进行数据库打开时,使用程序即可解密文件。
②缺点
需要修改sqlite源码,这个工作难度比较大。
③实现(太难,本人并没有进行实验)
a.修改sqlite源代码,追加对数据库文件进行加密的功能。
b.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。
c.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。
d.进行程序的部署,测试。

③SQLiteDatabase

Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的api。

④SQLitOpenHelper

我们往往不会直接操作SQLiteDatabase这个类,而是自己创建一个继承自SQLitOpenHelper的子类来实现数据库操作。
这样做的目的一是为了以后如果数据库升级不至于要改动太多代码,已实现封装;二则是为了我们使用更方便。
通过getWriteableDatabase和getReadableDatebase()方法生成一个数据库,并对数据库进行管理。

i>在AndroidManifest.xml中添加权限

    <!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    
    <!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

ii>添加继承SQLiteOpenHelper的MyHeper类,用于创建使用数据库。

需要实现两个抽象方法:OnCreate和OnUpgrade。

当Android应用运行时,SQLiteOpenHelper会先检查是否已经存在数据库,如果不存在,就创建数据库,然后打开数据库,最后调用OnCreate方法,所以我们需要再OnCreate中创建表(视图等);如果数据库已存在,而版本号比上次创建的数据库版本号高,就调用OnUpgrade,用于升级。

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class MyHelper extends SQLiteOpenHelper {

	private String Tag = "MyHelper";	
	private static String DB_NAME = "luoDB.db";  //数据库名称	
	public static String TABLE_NAME_TASK = "Task"; //联班任务_fra_task表名
	
	/**super(参数1,参数2,参数3,参数4),其中参数4是代表数据库的版本,
	 * 是一个大于等于1的整数,如果要修改(添加字段)表中的字段,则设置
	 * 一个比当前的 参数4大的整数 ,把更新的语句写在onUpgrade(),下一次
	 * 调用
	 */
	public MyHelper(Context context) {
		super(context, DB_NAME, null, 1);
	}
	//用于第一次创建数据库
	@Override
	public void onCreate(SQLiteDatabase db) {
		//Create table
		try{
			String sql = "CREATE TABLE "+TABLE_NAME_TASK + "("
					  	  + "TaskCode TEXT PRIMARY KEY,"
						  + "TaskState TEXT,"
						  + "TaskName TEXT"
						  + ");";
			db.execSQL(sql); 		//创建表
		}catch(Exception e){
			LogUtil.i(Tag, "onCreate" + e.getMessage());
		}
	}
	//用于数据库升级
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	}
}

iii>SQLite升级

数据库升级增加表和删除表都不涉及数据迁移,但是修改表涉及到对原有数据进行迁移。升级的方法如下所示:

将现有表命名为临时表。
创建新表。
将临时表的数据导入新表。
删除临时表。

如果是跨版本数据库升级,可以由两种方式,如下所示:

逐级升级,确定相邻版本与现在版本的差别,V1升级到V2,V2升级到V3,依次类推。
跨级升级,确定每个版本与现在数据库的差别,为每个case编写专门升级大代码。

iv>数据的增——insert

MyHelper类中:

public void insert(String table, String nullColumnHack, ContentValues values){
    SQLiteDatabase db = this.getWritableDatabase();
    db.insert(table, nullColumnHack, values);
}

参数说明:
table:表名,直接使用字符串指定;
nullColumnHack:指定null值的列,SQLite里不允许空行,使用这个参数可以指定一个列的值为null,当存入行为空时,这个列的值就被指定为null;
values:使用类似map键值对映射的数据结构ContentValues来指定插入的数据

举例:

 String[] args = {
                    today,
                    content,
                    Boolean.toString(checked)
            };
            String[] column = {
                    "[_Date]",
                    "[Item]",
                    "[Check]"
            };
            //数据库中添加数据
            ContentValues c = new ContentValues();
            for(int i=0;i<args.length;i++){
                c.put(column[i], args[i]);
            }
            dbServices.insert("_today_plan", null, c);

v>数据的删——delete

MyHelper类中:

    public void delete(String table , String whereClause , String[] whereArgs){
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(table, whereClause, whereArgs);
        Log.d("Delete",whereClause);
    }

参数说明:
table:表名;
whereClause:可选,指定删除条件,相当于SQL语句WHERE语句之后的类容,可通过?来指定参数;
whereArgs:当whereClause指定了?参数,这个字符串数组里就是?所代表的参数,个数应与?数一致;

举例:

String args[] ={
    today,
        content,
        Boolean.toString(checked)
};
dbServices.delete("_today_plan", "[_Date]=? and [Item]=? and [Check]=?"
,args);

vi>数据的修改——update

MyHelper类中:

public void update(String table, ContentValues values,
        String whereClause, String[] whereArgs){
        SQLiteDatabase db = this.getWritableDatabase();
        db.update(table, values, whereClause, whereArgs);
    }

参数说明:
table:表名;
values:同上,是需要修改的列和值的映射集合;
whereClause:修改的行所需符合的条件;
whereArgs:指定条件里的参数;

示例:

String args[] ={
    today,
        content,
        Boolean.toString(!m)
};
ContentValues c = new ContentValues();
c.put("[Check]", Boolean.toString(m));
dbServices.update("_today_plan", c,"[_Date]=? and [StartTime]=? and [Item]=? and [Check]=?"
,args);

vii>数据的查询——read

MyHelper类中:
和前面有所不同了,读取数据所用的方法是直接执行查询语句,获取游标,然后通过游标来遍历数据库,方法如下:

public Cursor read(String sql ,String[] args){
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(sql, args);
        Log.d("Database",cursor.getColumnName(0));
        return cursor;
    }

方法说明:
请注意:在这里db获取的是只读的数据库(getReadableDatabase),而在上述三种操作里都是使用的可写数据库(getWritableDatabase);至于游标的用法此处就不再赘述,只需看一下API的名字就能掌握基本用法,但最后一定要记得将游标关闭(close)!

⑤模糊查询

i>使用这种query方法%号前不能加’

			cursor = db.query(MyHelper.TABLE_NAME_TASK, 
					new String[] { "TaskCode","TaskName"}, "TaskName like ?",
					new String[]{"%" + TaskName + "%"}, null, null, null);		

ii>使用这种query方法%号前必须加’

			Cursor  c_test = mDatabase.query(tab_name, 
					new String[]{tab_field02},
					tab_field02+"  like '%" + str[0] + "%'", null, null, null, null);

iii>使用这种方式必须在%号前加’

			String current_sql_sel = "SELECT  * FROM "+tab_name 
									+" where "+tab_field02
									+" like '%"+str[0]+"%'";
			Cursor c_test = mDatabase.rawQuery(current_sql_sel, null);

⑥多重排序,字符串排序

cursor = db.query(MyHelper.TABLE_NAME_TASK, 
					new String[] { "TaskCode",  "TaskName","TaskState"}, "TaskName like ?",
					new String[]{"%" + TaskName+ "%"}, null, null,
					"(case"
					+ " when TaskState like '" + TaskState.STATE2 + "' then 2"
					+ " when TaskState like '" + TaskState.STATE1 + "' then 1"
					+ " else 3"
					+ " end)"
					+ ",TaskCode asc");

⑦事务(Transaction)

是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。

4,neo4j

1)标签属性图模型

在这里插入图片描述

Nodes – 节点

在其他图模型中称作“点”、“顶点”、“对象”。
语法:

节点必须包含在括号 () 内;

节点可以有属性:(n:Label {prop: 'value'})

Relationships – 关系

在其他图模型中也称作“边”、“弧”、“线”。关系拥有类型,关系在创建时必须指定方向 ,关系在查询时可以不指定方向表示双向关系。
语法:
关系两端各有一个短横线“-”,用方括包含关系类型,关系类型名前面必须有冒号 (😃 。在其中一端用 >或 < 代表关系的方向,也可以没有方向:

 - -<- -,- ->
  -[:DIRECTED]- ->

关系也可以有属性:-[:KNOWS {since: 2010}]

Properties – 属性

可以定义在节点和关系上。
语法:

包含在{}中。

Labels – 标签

代表节点的类别,节点可以没有标签或者有多个标签。
标签对节点进行分类,似关系数据库中的表 标签对节点进行分类,类似关系数据库中的表。
语法:

标签名前必须有冒号;

模式

模式是由关系连接起来的节点构成的表达式。

() -[] -()    #没有方向的关系
() -[] ->()   #有方向的关系
()< -[] -()   #双向的关系
(n:Label {prop:'value'})-[:TYPE]- >(m:Label)

2)Cypher

Neo4j图形数据库的查询语言是Cypher(CQL), CQL看似简单,但由于图的结构可能在实际应用中比较复杂。

  • CQL遵循SQL语法。
  • 命名规范:关键字-全部大写;标签名-首字母大写;关系名-全部大写;属性名、变量名-全部小写

3)CQL-常用命令

CQL命令用法
CREATE创建创建节点,关系和属性
MATCH匹配检索有关节点,关系和属性数据
RETURN返回返回查询结果
WHERE哪里提供条件过滤检索数据
DELETE删除删除节点和关系
REMOVE移除删除节点和关系的属性
ORDER BY以…排序排序检索数据
SET组添加或更新标签
limit 10只显示10条数据
MATCH (m:Movie)  #Movie为标签,m为节点变量
RETURN m, m.title #属性以{variable}.{property_key}的方式访问 .title返回属性
MATCH (p:Person)-[r:ACTED_IN]->(m:Movie)  #r是变量,保存关系;ACTED_IN为关系类型
RETURN p, r, m 
MATCH path = (:Person)-[:ACTED_IN]->(:Movie)  #path是变量,保存路径
RETURN path

4)CQL-常用函数

函数用法
String字符串用于使用String字面量。
Aggregation聚合用于对CQL查询结果执行一些聚合操作。
Relationship关系用于获取关系的细节,如startnode,endnode等。

5)清空所有数据

match (n) detach delete n

6)常用shell命令

#重启
./bin/neo4j start   #restart stop

#修改密码
./bin/neo4j-admin set-initial-password  psw  #psw为密码

#The client is unauthorized due to authentication failure.问题解决
停止neo4j服务,并且删除data/dbms/auth,重新启动
  • 2
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

兔兔西

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值