0%

DDL

库级别

查看所有数据库: show databases;
创建数据库: create database if not exists 数据库名;
删除数据库: drop database if exists 数据库名;
查看当前使用的数据库: select database();
选择数据库:use 数据库名;

表级别

查询当前数据库下(use 选定数据库)
查看所有表:show tables;
查看某一特定表结构信息:desc table1 table1 为表名,desc 即description含义。
创建表:

1
2
3
4
5
6
create table 表名(字段名1 数据类型1,字段名2 数据类型2); 

eg: create table tb_use(
id int,username varchar(20),password varchar(32)
);

char(0~255 bytes),当username 如果小于20字符,仍然占20个字符,当大于20个字符时,则报错。
因为常见固定长度,所以存储性能高,但浪费空间。

varchar(0~65535 bytes),当username 如果小于20字符,只占实际字符.大于也同样报错。性能差点,但节约空间。

删除表:drop table if exists 表名;

操作表中数据

改表名:alter table 表名 rename to 新表名;
新增列:alter table 表名 add 列名 数据类型(字段名约束);
新增多列:ALTER table 表名 add CLOUMN 数据类型(字段名约束) AFTER 想放的字段名后面如果需要;

1
2
3
4
5
-- int(11)只影响int的显示位数(跟数据库客户端有关),不影响它所占空间大小和所能存储的数值范围。且11代表的不是2进制下几位,而是10进制下几位
ALTER TABLE tb_use
ADD COLUMN `version` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '乐观锁',
ADD COLUMN `deleted` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '软删除' AFTER `version`;

修改数据类型:alter table 表名 modify 列名 新数据类型;
修改列名和数据类型:alter table 表名 change 列名 新列名 新数据类型;
删除列:alter table 表名 drop 列名;

// TODO Navicat or DBeaver

DML

给指定列添加数据: insert into 表名(列名1,列名2,...) values(值1,值2...);
给全部列添加数据: insert into 表名 values(列名1,列名2,...);
批量添加数据:

1
2
insert into 表名(列名1,列名2,...) values(值1,值2...),(值1,值2...),(值1,值2...)...;
insert into 表名 values(值1,值2...),(值1,值2...),(值1,值2...)...;

删除: delete from 表名 [where 条件];

修改表数据: update 表名 set 列名1=值1,列名2=值2,...[where 条件];

约束

非空约束:NOT NULL
唯一约束:UNIQUE
主键约束(自带非空且唯一):PRIMARY KEY
默认约束:DEFAULT(不能传值,才为默认值,即使传null也会为null)
外键约束:FOREIGN KEY
检查约束:CHECK(Mysql不支持)
//当列算是数字类型并且唯一约束 可以添加auto_increment,即使传null也会自动自增

1
2
3
4
5
-- 删除主键
ALTER TABLE 表名 DROP PRIMARY KEY;
-- 将某一列设为主键。也可同时用于增加或删除 auto_increment约束
ALTER TABLE 表名 MODIFY 列名 列数据类型 PRIMARY KEY;

外键约束

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- 创建表时添加外键约束
create table 表名(列名 数据类型
...
CONSTRAINT 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
);

-- 建表万能后添加外键约束

ALTER TABLE 表名 ADD 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表(主表列名);

-- 删除外键

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

外键永远放于多的那边关联另一方

一对一:用于拆分表,经常用的放一张,不经常的放另外一张。其实就是简化版的一对多(多对一),
只需要将外键列多加个UNIQUE约束
多对多:借助第3张中间表,中间2列(或多列)外键指向2张或多张主表主键,中间表还可以添加一些额外字段.

多表查询

内连(交集)

1
2
3
4
-- 隐式内连
SELECT 字段列表 FROM 表1,表2[,表3] ... WHERE 条件 [and 另外条件];
-- 显式内连
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件 [[INNER] JOIN 表3 ON 另外条件];

外连

1
2
3
4
5
6
-- 左外连(交集+左表)
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;

-- 右外连(交集+右表)
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
一般情况下我们都用左连,因为左连=右连+表1 表2位置换下

子查询

单行单列:
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询)
多行查询:
SELECT 字段列表 FROM 表 WHERE 字段名 in (子查询)
多行多列:
SELECT 字段列表 FROM (子查询) WHERE 条件

事务

1
2
3
4
5
6
7
8
-- 开启事务
BEGIN;/START TRANSACTION;
...SQL...
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

事务四大特定

  • 原子性(Atomicity):不可分析最小操作单位,要么同时成功,要么同时失败
  • 一致性(Consistency):事务完成时,必须时所有的数据保持一致状态
  • 隔离性(Isolation):多个事务之间,操作可见性
  • 持久性(Durability):事务一旦成功或回滚,它对数据库中的数据的改变就是永久的

查询事务的默认提交方式:
select @@autocommit; -- 1则是默认自动提交
修改默认提交方式:
set @@autocommit = 0;

安装

  1. Mysql下载地址,以apt为例,下载对应版本后

    1
    2
    3
    sudo apt-get install ./mysql-apt-config_0.8.24-1_all.deb
    sudo apt-get update
    apt-get install mysql-server

    在 Debian 系统中,使用 apt 命令安装 MySQL 服务器时,默认情况下 MySQL 的二进制文件、配置文件、数据文件等内容会安装在以下目录:
    /usr/bin 目录包含 MySQL 的客户端程序,如 mysql等.MySQL 的环境变量和其他配置通常都已经在安装时自动配置好了。Windowns需要手动增加安装目录/bin至环境变量

  2. MySQL 在 Windows 和 Debian 系统中的配置文件格式和位置略有不同。以下是它们的具体区别:

在 Windows 中,MySQL 的配置文件名为 my.ini。该文件通常位于 MySQL 安装目录下的 bin 子目录中。Windows 版本的 MySQL 的默认配置文件相对比较简单,只包含了少量的配置参数,如端口号、数据文件位置等。

在 Debian 系统中,MySQL 的配置文件名为 my.cnf。该文件通常位于 /etc/mysql 目录下。与 Windows 版本相比,Debian 版本的 MySQL 的默认配置文件包含了更多的配置参数,如字符集、日志等级等。
此外,在 Debian 中,MySQL 还使用了一个名为 debian.cnf 的辅助配置文件,该文件包含了与 Debian 发行版相关的配置参数。
如果my.cnf中有类似 !includedir /etc/mysql/conf.d/ 的语句,则表明会去读取这个文件夹下的.cnf配置文件来合并生成Mysql的配置,并且如果有相同配置项,以这些对应文件夹下的.cnf为准(覆盖my.cnf配置)

无论是在 Windows 还是 Debian 系统中,都可以使用文本编辑器打开配置文件,并根据需要进行修改。修改后,需要重启 MySQL 服务器才能使更改生效。

需要注意的是,MySQL 配置文件中的参数数量和名称可能会因 MySQL 的版本和安装方式而有所不同。您可以在 MySQL 官方文档中找到适合您版本和环境的配置文件文档,并根据文档中的说明进行配置。例如:

1
2
3
4
5
6
7
8
9
10
11
12
[mysql]
default-character-set=utf8

[mysqld]
port=3306
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
log-output=FILE
log_error=/var/log/mysql/error.log
general_log_file=/var/log/mysql/mysql.log
general_log=1
  1. 初始化
    mysqld --initialize-insecuremysql_secure_installation 是两个 MySQL 服务器安装和初始化的命令,它们的作用和使用场景略有不同。
  • mysqld --initialize-insecure 是用于初始化 MySQL 数据库的命令。它可以在没有现成的 MySQL 数据库的情况下创建一个新的空数据库,并生成一个初始的 root 用户账号和密码,以供用户进行管理和操作。--initialize-insecure 选项表示该命令会创建一个没有密码的 root 用户账号,因此不会提示您输入密码,安全性较低。

  • mysql_secure_installation 是用于在已经安装好 MySQL 服务器的情况下对其进行安全配置的命令。该命令将提示用户进行一系列安全性设置,包括设置 MySQL root 用户的密码、删除测试数据库、禁止远程 root 登录等,从而提高 MySQL 服务器的安全性。

因此,如果您是第一次安装 MySQL 服务器,可以使用 mysqld --initialize-insecure 命令初始化 MySQL 数据库,并使用生成的 root 用户账号进行管理和操作。如果您已经安装好 MySQL 服务器,并且希望提高其安全性,请使用 mysql_secure_installation 命令进行安全性设置。

  1. 注册服务

    • Windows
      可以使用 mysqld --install 命令将 MySQL 注册为服务。执行以下命令即可:mysqld --install该命令将安装 MySQL 服务,并自动将其添加到 Windows 服务列表中。
      如果需要从服务列表中删除 MySQL 服务,可以使用以下命令:mysqld --remove
    • Linux
      该命令将启用 MySQL 服务,并使其在系统启动时自动启动。 sudo systemctl enable mysql
      如果需要在系统启动时禁用 MySQL 服务,可以使用以下命令:sudo systemctl disable mysql
  2. 启动服务(仅需在注册后第一次进行手动启动即可,后面都会因为4中,自动启动)

    • Windows
      启动Mysql服务:net start mysql
      停止Mysql服务:net stop mysql
      查看服务情况: sc query mysql
      `
    • Linux
      启动Mysql服务:sudo systemctl start mysql
      停止Mysql服务:sudo systemctl stop mysql
      重启Mysql服务: sudo systemctl restart mysql
      查看服务情况: sudo systemctl status mysql
      如果 MySQL 服务器无法启动,您可以使用以下命令来检查 my.cnf 文件的语法是否正确:sudo mysqld --help --verbose --no-defaults
  3. 设置admin密码: mysqladmin -u root password 1234. Linux在apt安装时可能已经设置,则可不操作。 windows如果采用mysqld --initialize-insecure命令初始化,此时需要设置下密码

  4. 登录 mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306) eg:mysql -uroot -p1234,退出exit

Hexo 命令简介

Cleans the cache file

1
$ hexo clean 

删除缓存 (db.json和生成的public文件)
More info: Clean

Create a new post

1
$ hexo new "xxx"

然后就会在 {hexo目录}/source/_posts生成xxx.md文件 eg: hexoBlog/source/_posts
More info: Writing

Generate static files

1
$ hexo g

生成对应静态文件
More info: Generating

Run server

1
$ hexo s

启动hexo服务器本地预览,打开 http://localhost:4000 即可查看效果
More info: Server

Deploy to remote sites

1
$ hexo d

发布到远端,以发布到github为例

  1. 需提前在 {hexo目录}/_config.yml文件的deploy节点下配置对应的数据,如 type,repo,banch等
  2. 可配合hexo-deployer-git插件使用 npm install hexo-deployer-git --save
    当然也可不用该快捷命令直接将hexo g 生成的静态文件提交到git仓库也行.

More info: Deployment

图床

贴图库
七牛云
新浪微博,也可另外建个github库专门放图

多平台移动开发新方案KMM

背景

在过去的几年里,跨平台开发技术层出不穷,例如React Native、Flutter和Xamarin等。这些技术都试图解决在多个平台上共享代码的问题,以提高开发效率和降低维护成本。 然而,它们各自都有一定的优缺点:

React Native:基于JavaScript与原生组件映射调用,拥有庞大的社区支持,可实现较高的代码复用率。但JavaScript性能相较于原生开发略低(新架构仍未正式发布),且受原生组件平台特性和API的支持方面局限。

Flutter:使用Dart语言,拥有独特的UI框架,可以快速构建美观的界面。但是,它的生态系统相对较小,一些特定平台的功能可能需要编写原生代码。

Xamarin:基于C#,可以实现较高的代码复用率。然而,它的开发环境和工具相对较重,可能导致开发和调试过程中的困扰。

KMM简介

KMM的诞生离不开它的“母语”——Kotlin。Kotlin是一种基于JVM(Java虚拟机)的现代编程语言,旨在提供更简洁、安全和高效的代码编写体验。自2017年Google将Kotlin宣布为Android官方开发语言以来,Kotlin已在全球范围内迅速获得了广泛的认可和应用。
Kotlin团队也在积极推动多平台化, 2017年11月发布的Kotlin 1.2中,引入了实验性Kotlin Multiplatform Project(KMP),同时支持server(Java),web(JS),desktop,苹果系列(macOS,tvOS,watchOS,iOS)及android.

KMM(Kotlin Multiplatform Mobile)则相当于是KMP的在移动端(iOS及android)上的支持.

原理

KMM通过Kotlin/Native编译器生成平台特定的二进制文件。对于iOS平台,Kotlin/Native将Kotlin代码转换为LLVM中间表示(Intermediate Representation,简称IR),然后编译为与Objective-C和Swift兼容的二进制文件(.o->.framework)。
对于Android来说就是.class字节码文件(jar->dex)。通过这种方式,KMM实现了在保留原生UI和性能优势的同时,在不同平台上共享业务逻辑代码。开发者可以在共享代码和平台特定代码之间灵活切换,根据项目需求进行调整,充分利用KMM的优势。
简单来说,就是编译器魔法,然后走各自平台的打包流程,与原生无异。所以KMM与原生有一摸一样的优缺点,但是共用了逻辑层.

项目创建及结构

1.我们可以通过在AndroidStudio选择安装官方提供的Kotlin Multiplatform Mobile插件即可方便地创建KMM工程。
2.安装完插件后,打开Android Studio,选择Create New Project –> 在项目向导中选择KMM Application,点击Next –> 输入项目名称(如KMMdemo)和包名,然后点击Finish,即完成项目创建。
工程分层及项目结构如下:

从项目结构及目录上可以看出KMM与其它跨平台技术不一样,它更侧重同一的逻辑层,同时在逻辑层上提供对应平台目录,提供用户需要的平台特性自定义拓展。UI层开发者使用各自平台的原生UI体系。
由于Kotlin已经是Android官方推荐语言,所以KMM在Android端支持就不再赘述.

拓展及支持

  • 官方已将iOS SDK库默认导入,所以如需要可以在shared层中的iOSMain使用使用如UIKit,Foundation,等API.KMM项目中UI层Swift代码/Swift UI可以无缝调用share中 kotlin代码,而share层中可以无缝调用oc代码,且均提供IDE插件支持,也就是所可以直接在Kotlin中直接调用iOS SDK的相关接口.
  • 对于SDK以外的常用第三方库,如AFNetworking,则可以在shared下的build.gradle文件下通过cocoapods节点引入,代码如下
    1
    2
    3
    4
    5
    cocoapods {
    ...
    pod("AFNetworking", "4.0.1")
    ...
    }
  • except/actual机制,提供平台自定义拓展。通过以上介绍后,我们可以发现基本上原有的原生开发的所有库,我们都可以直接使用而不用重复造轮子。
    但还有一个问题就是,如果直接将原生API提供给UI层使用时,由于API不一致,UI层还需要判断是android平台还是iOS平台非常繁琐。于是有了强大的except/actual拓展机制,以下以获取系统版本及系统名称为例
  1. shared/commonMain中定义expect
    1
    2
    3
    4
    5
    6
    7
    package com.wonder.kmmdemo

    interface Platform {
    val name: String
    }

    expect fun getPlatform(): Platform
    2.shared/androidMain中定义Android端actual实现
    1
    2
    3
    4
    5
    6
    7
    package com.wonder.kmmdemo

    class AndroidPlatform : Platform {
    override val name: String = "Android ${android.os.Build.VERSION.SDK_INT}"
    }

    actual fun getPlatform(): Platform = AndroidPlatform()
    3.shared/androidMain中定义iOS端actual实现
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    package com.wonder.kmmdemo

    import platform.UIKit.UIDevice //直接无缝调用iOS相关API

    class IOSPlatform: Platform {
    override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
    }

    actual fun getPlatform(): Platform = IOSPlatform()

    我们可以从以上代码看出定义了统一的except定义,具体实际实现分别实现于各自平台,从而屏蔽API不一致引发的代码问题。UI上层调用时只需使用com.wonder.kmmdemo.getPlatform().name即可实现统一跨平台调用.

现状

  • Kotlin Multiplatform is in Beta. It is almost stable, but migration steps may be required in the future. We'll do our best to minimize any changes you have to make.
    虽然KMM现在仍为Beta阶段,但Kotlin团队宣布会于2023年发布稳定版.
  • 在过去的几年里,KMM不仅优化了编译器和工具链,还引入了许多新的库和框架,如Ktor、SQLDelight和Koin等,以满足开发者们日益丰富的需求。同时KMM的社区也在不断壮大。随着Kotlin语言本身的普及,越来越多的开发者开始关注并参与到KMM项目中,社区涌现了一大批优秀的三方库
  • KMM在全球范围内的普及程度逐渐上升。越来越多的企业和开发者选择KMM作为他们的跨平台开发解决方案。国内外众多企业已开始使用KMM技术 除此之外,国内携程及美团等团队也均有在业务中进行尝试,具体情况可移步其对应技术博客.

缺陷及展望

通过以上分析我们可以发现,其实KMM目前相当于只实现了半跨平台(即仅在UI层实行统一共用).但通过特性及拓展支持,我们可以预见它完全有能力实现全跨平台支持(即剩余的UI层支持),个人觉得至少有2种方式,可以采用像RN一样的原生平台映射方式(但会受各自平台特性,UI风格,设备版本差异等影响),也可以采用像Flutter一样,重新定义一套UI架构,提供统一的新的API。
Kotlin团队明显选择了后者,他直接使用了Google jetpack compose作为对上层提供的新UI层API,然后添加iOS平台实现,从而达到跨平台UI效果,于是Compose Multiplatform横空出世,补齐了KMM跨平台最后一块版图。
于是项目结构就可以变为


目前为止Compose Multiplatform于今年4月14日发布alpha版(主要是iOS平台,android及desktop已经为稳定版)

并计划于明年发布稳定版,个人觉得beta版,应该今年内可完成

由于篇幅所限,届时如有机会将另起一篇为小伙伴们介绍Compose Multiplatform.