网站模板 招聘,电子商务系统的构成,网页设计个人总结,wordpress图片主题免费目录
1 数据库基本知识
1.1 MYSQL常见命令
1.2 SQL注入
1.3 ORM框架 1 数据库基本知识
MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成#xff1a…目录
1 数据库基本知识
1.1 MYSQL常见命令
1.2 SQL注入
1.3 ORM框架 1 数据库基本知识
MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成
数据库: 数据库是一些关联表的集合。数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。行一行元组或记录是一组相关的数据例如一条用户订阅的数据。冗余存储两倍数据冗余降低了性能但提高了数据的安全性。主键主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。外键外键用于关联两个表。复合键复合键组合键将多个列作为一个索引键一般用于复合索引。索引使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件目的是保证数据的一致性。
1.1 MYSQL常见命令
1.连接mysqlmysql -u root -p*****
2.创建数据库create DTATBASE myDB
/*
CREATE DATABASE mydatabase -- 创建名为 mydatabase 的数据库CHARACTER SET utf8mb4 -- 设置字符集为 utf8mb4比utf8高级支持表情字符COLLATE utf8mb4_general_ci; -- 设置校对规则为 utf8mb4_general_ci大小写不敏感
*/
/*
如果数据库已经存在执行 CREATE DATABASE 将导致错误。
为了避免这种情况你可以在 CREATE DATABASE 语句中添加 IF NOT EXISTS 子句
CREATE DATABASE IF NOT EXISTS mydatabase;
*/
3.删除数据库DROP DATABASE RUNOOB;
4.选择数据库后续操作只针对这个数据库USE database_name;/mysql -u your_username -p -D your_database
5.创建数据表
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL,birthdate DATE,is_active BOOLEAN DEFAULT TRUE
);
/*
id: 用户 id整数类型自增长作为主键。
username: 用户名变长字符串不允许为空。
email: 用户邮箱变长字符串不允许为空。
birthdate: 用户的生日日期类型。
is_active: 用户是否已经激活布尔类型默认值为 true。
*/
6.删除数据表DROP TABLE [IF EXISTS] table_name; //外键约束如果该表与其他表有外键约束可能需要先删除外键约束或者确保依赖关系被处理好。
7.插入数据
INSERT INTO users (username, email, birthdate, is_active)
VALUES(test1, test1runoob.com, 1985-07-10, true),(test2, test2runoob.com, 1988-11-25, false),(test3, test3runoob.com, 1993-05-03, true);
8.查询数据
SELECT column1, column2, ...
FROM table_name
[WHERE condition]
[ORDER BY column_name [ASC | DESC]]
[LIMIT number];
9.更新数据
UPDATE table_name
SET column1 value1, column2 value2, ...
WHERE condition;
/*
table_name 是你要更新数据的表的名称。
column1, column2, ... 是你要更新的列的名称。
value1, value2, ... 是新的值用于替换旧的值。
WHERE condition 是一个可选的子句用于指定更新的行。如果省略 WHERE 子句将更新表中的所有行。
*/
20.删除数据
DELETE FROM table_name
WHERE condition;
/*
table_name 是你要删除数据的表的名称。
WHERE condition 是一个可选的子句用于指定删除的行。如果省略 WHERE 子句将删除表中的所有行。
*/
21.LIKE子句用于在 WHERE 子句中进行模糊匹配的关键字。它通常与通配符%一起使用用于搜索符合某种模式的字符串
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;
22.UNION操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合并去除重复的行。
SELECT column1, column2, ...
FROM table1
WHERE condition1
UNION
SELECT column1, column2, ...
FROM table2
WHERE condition2
[ORDER BY column1, column2, ...];
23.ORDER BY(排序) 语句按照一个或多个列的值进行升序ASC或降序DESC排序。
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;
1.2 SQL注入
所谓 SQL 注入就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串最终达到欺骗服务器执行恶意的 SQL 命令。
MySQL 注入是指攻击者通过恶意构造的输入成功地执行恶意的 SQL 查询这通常发生在用户输入未经适当验证或转义的情况下攻击者试图在输入中插入 SQL 代码以执行意外的查询或破坏数据库。 例如用户输入
SELECT * FROM users WHERE username input_username AND password input_password;
//如果没有正确的输入验证和防范措施攻击者可以输入类似于以下内容的用户名OR 11; --
// 在这种情况下SQL 查询会变成
SELECT * FROM users WHERE username OR 11; -- AND password input_password;
//这会使查询返回所有用户因为 11 总是为真注释符号 -- 用于注释掉原始查询的其余部分以确保语法正确。
防止SQL注入的方法
使用参数化查询或预编译语句 使用参数化查询Prepared Statements可以有效防止 SQL 注入因为它们在执行查询之前将输入数据与查询语句分离。输入验证和转义 对用户输入进行适当的验证并使用合适的转义函数如mysqli_real_escape_string来处理输入以防止恶意注入。最小权限原则 给予数据库用户最小的权限确保它们只能执行必要的操作以降低潜在的损害。使用ORM框架 使用对象关系映射ORM框架如Hibernate、Sequelize可以帮助抽象 SQL 查询从而降低 SQL 注入的风险。禁用错误消息显示 在生产环境中禁用显示详细的错误消息以防止攻击者获取有关数据库结构的敏感信息。
1.3 ORM框架
对象关系映射Object Relational Mapping简称ORM模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁只要提供了持久化类与表的映射关系ORM框架在运行时就能参照映射文件的信息把对象持久化到数据库中。
也就是将数据库的一张表映射为一个类表的字段就是这个类的成员变量。 为什么使用ORM
其一可以有效防止SQL注入其二可以实现业务层和数据层的解耦在实现数据库CRUD操作过程中存在大量重复的SQL语句调用类对象的方法可以有效减少重复性代码。
优点
1提高开发效率降低开发成本 2使开发更加对象化 3可移植 4可以很方便地引入数据缓存之类的附加功能
缺点
1自动化进行关系数据库的映射需要消耗系统性能一般来说都可以忽略。 2在处理多表联查、where条件复杂之类的查询时ORM的语法会变得复杂。
示例
db.cpp定义数据库连接、更新、查询操作
user.hpp定义表字段
usermodel.cpp实现表具体操作。 #includedb.h
#includemuduo/base/Logging.h
//数据库配置信息
static string server 127.0.0.1;
static string user root;
static string password 123456;
static string dbname chat;//初始化数据库连接为连接开辟资源
MySQL::MySQL()
{_conn mysql_init(nullptr);
}//释放数据库连接资源
MySQL::~MySQL()
{if(_conn!nullptr){mysql_close(_conn);}
}//连接数据库
bool MySQL::connect()
{MYSQL *p mysql_real_connect(_conn, server.c_str(), user.c_str(), password.c_str(),dbname.c_str(), 3306, nullptr, 0);if (p ! nullptr){// C和C代码默认的编码字符是ASCII如果不设置从Mysql上拉取的数据不支持汉字mysql_query(_conn, set names gbk);LOG_INFO connect mysql success!;}else{LOG_INFO connect mysql fail!;}return p;
}//更新操作
bool MySQL::update(string sql)
{if (mysql_query(_conn, sql.c_str())){LOG_INFO __FILE__ : __LINE__ : sql 更新失败;return false;}return true;
}//查询操作
MYSQL_RES* MySQL::query(string sql)
{if (mysql_query(_conn, sql.c_str())){LOG_INFO __FILE__ : __LINE__ : sql 查询失败;return nullptr;}return mysql_use_result(_conn);
}//获取连接
MYSQL *MySQL::getConnection()
{return _conn;
}
#ifndef USER_H
#define USER_H#includestring
using namespace std;
/*
mysql SHOW COLUMNS FROM user;
------------------------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
------------------------------------------------------------------------
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(50) | NO | UNI | NULL | |
| password | varchar(50) | NO | | NULL | |
| state | enum(online,offline) | YES | | offline | |
------------------------------------------------------------------------
*/
//定义数据库对象将数据库信息整合为一个对象提交给业务层
//匹配User表的ORM类
class User{
public:User(int id -1, string name , string pwd , string state offline){this-id id;this-name name;this-password pwd;this-state state;}void setId(int id){this-id id;}void setName(string name){this-name name;}void setPwd(string pwd){this-password pwd;}void setState(string state){this-state state;}int getId(){return this-id;}string getName(){return this-name;}string getPwd(){return this-password;}string getState(){return this-state;}
private:int id;string name;string password;string state;
};
#endif
#includeusermodel.hpp
#includedb.h
#includeiostream
#includemuduo/base/Logging.h
using namespace std;
//User表的增加方法
bool UserModel::insert(User user)
{//1. 组成sql语句char sql[1024] {0};sprintf(sql, insert into user(username,password,state) values(%s, %s, %s),user.getName().c_str(), user.getPwd().c_str(), user.getState().c_str());LOG_INFOsql;//2.连接数据库MySQL mysql;if (mysql.connect()){if(mysql.update(sql)){//获取插入成功的用户数据生成的主键iduser.setId(mysql_insert_id(mysql.getConnection()));return true;}}return false;
}