当前位置: 首页 > news >正文

门户网站建设网络推广网站的宣传方法有哪些

门户网站建设网络推广,网站的宣传方法有哪些,美工网站做兼职,wordpress媒体优化目录 概述 基本工作原理 映射C对象到数据库表 从数据库中加载对象 持久化C对象到数据库 ODB常用接口 表创建预处理 #pragma db Object table 数据表属性 id auto column#xff08;“xxx”#xff09; type(xxx) unique index null default对象到数据库表 从数据库中加载对象 持久化C对象到数据库 ODB常用接口 表创建预处理 #pragma db Object table 数据表属性 id  auto column“xxx” type(xxx) unique index null defaultxxx 总结 查询预处理 view  query result database类 连接管理接口 事务管理接口 对象存取接口 对象查询接口 类型映射与元数据接口 数据库备份与恢复 基本使用 概述 ODB 库的目标是提供一个功能强大且类型安全的 ORM 解决方案使得 C 开发者能够轻松地处理数据库操作同时保留 C 中对象的优势。它通过 C 类和数据库表之间的自动映射来简化数据库的持久化操作。 对象到数据库的映射将 C 对象映射到数据库中的表数据库到对象的映射将数据库中的记录自动映射为 C 对象支持一对一、一对多、多对多等关系 优点 简化代码使用 ODB可以省去手动编写 SQL 查询的繁琐步骤减少 SQL 注入和数据类型转换的错误类型安全所有操作都使用 C 对象而不是原始 SQL 字符串保证了类型的安全性支持复杂数据关系可以轻松处理对象间的复杂关系如一对多、多对多等跨平台支持支持多种数据库和操作系统适合跨平台开发 缺点 依赖生成工具需要使用 ODB 提供的工具来生成代码增加了构建过程的复杂性性能虽然 ODB 在设计上注重性能但 ORM 本身的抽象可能会导致一些性能损失特别是在处理大量数据时 主要特性 类型安全ODB 提供类型安全的映射操作避免了直接使用 SQL 语句时可能发生的类型转换错误。开发者不需要关心 SQL 的细节OIB 会自动处理类型映射自动生成 SQL 代码ODB 会根据 C 类和类成员的定义自动生成 SQL 查询语句开发者不需要显式地编写 SQL 代码减少了手动编写 SQL 的繁琐性和出错的可能性ODB 支持多个关系型数据库复杂数据关系ODB 支持对象之间复杂的关系映射如一对多、多对多等关系并且能够自动管理外键、级联操作等支持继承和多态ODB 还支持 C 类继承和多态。你可以使用 ODB 映射继承层次结构中的类到数据库表并且支持多态对象的持久化查询功能ODB 还支持类似于 SQL 的查询功能开发者可以使用 ODB 提供的查询接口来执行复杂的查询操作性能ODB 在生成 SQL 查询时会尽量优化性能支持批量插入、延迟加载、缓存机制等特性从而在性能上做到了较好的平衡 基本工作原理 ODB核心步骤就两步 映射定义对象和数据库表之间的映射关系持久化将对象保存到数据库或者从数据库中加载对象 映射C对象到数据库表 ODB 提供了一个 database 类通常是 odb::database来操作数据库。开发者可以用它来保存、加载和查询 C 对象 db.persist(p) 会将 Person 对象的 name_ 和 age_ 持久化到数据库中的 Person 表 #include odb/database.hxx #include odb/transaction.hxx #include odb/sqlite/database.hxx // 支持 SQLiteint main() {odb::sqlite::database db(example.db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE);Person p(John, 30);// 开始事务{odb::transaction t(db.begin());db.persist(p); // 将对象持久化到数据库t.commit();}return 0; } 从数据库中加载对象 b.loadPerson(1) 会根据数据库表中的 ID 为 1 的记录自动生成一个 Person 对象 {odb::transaction t(db.begin());std::shared_ptrPerson p db.loadPerson(1); // 加载 ID 为 1 的 Person 对象t.commit();std::cout Name: p-name() , Age: p-age() std::endl; } 持久化C对象到数据库 ODB 提供了一个 database 类通常是 odb::database来操作数据库。开发者可以用它来保存、加载和查询 C 对象 #include odb/database.hxx #include odb/transaction.hxx #include odb/sqlite/database.hxx // 支持 SQLiteint main() {odb::sqlite::database db(example.db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE);Person p(John, 30);// 开始事务{odb::transaction t(db.begin());db.persist(p); // 将对象持久化到数据库t.commit();}return 0; } ODB常用接口 表创建预处理 #pragma db 功能这是 ODB 的核心预处理指令用来指定 C 类或类成员与数据库字段的映射用于定义类的整体映射规则比如将类映射为一个数据库表用于定义某个类成员的具体数据库属性比如列名、类型、索引、默认值等 Object 功能标记一个类是数据库中的一个持久化对象实体类用法#pragma db object 放在类声明的前面作用表示 Employee 类会映射到数据库中的一个表果类没有被标记为 object则 ODB 不会将其映射为数据库表 #pragma db object class Employee { public:int id;std::string name; }; table 功能指定类映射到数据库中的表名用法默认情况下ODB 将类的名字小写作为表名如果需要自定义表名那么可以使用table指令 #pragma db object table(employees_table) class Employee {int id;std::string name; }; 数据表属性 id  功能指定某字段为数据库表的主键用法主键必须唯一且必须是整形#pragma db id放在类成员前面表示该字段是主键 class Employee {#pragma db idint id;std::string name; }; auto 功能表示主键字段是自动递增的用法#pragma db id auto用于主键字段告知ODB让数据库自动生成该字段 class Employee {#pragma db id autoint id;std::string name; }; column“xxx” 功能将类成员变量映射到数据库表的某个特定列名用法默认情况下ODB 使用类成员的名字作为数据库列名如果需要指定一个不同的列名可以使用colum class Employee {#pragma db column(emp_id)int id;#pragma db column(full_name)std::string name; }; type(xxx) 功能指定字段在数据库表中的具体类型用法如果需要覆盖默认映射的字段类型可以用 type 指定 class Employee {#pragma db type(varchar(255))std::string name; }; unique 功能标记字段为唯一键保证表中该字段的值不会重复用法在需要唯一约束的字段上添加 #pragma db unique class Employee {#pragma db uniquestd::string email; }; index 功能为字段创建索引以加速查询用法在需要加速查询的字段上使用 #pragma db index class Employee {#pragma db indexstd::string name; }; not_null 功能指定字段不能为 NULL用法在不允许为空的字段上添加 #pragma db not_null class Employee {#pragma db not_nullstd::string name; }; null 功能允许字段为 NULL用法使用 odb::nullableT 表示字段可以存储 NULL 值 class Employee {odb::nullablestd::string middle_name; }; defaultxxx 功能为字段指定默认值用法在需要设置默认值的字段上使用 #pragma db default(xxx) class Employee {#pragma db default(Unknown)std::string department; }; 总结 // 将该类声明为 ODB 持久化对象并映射到数据库表 employee_table #pragma db object table(employee_table) class Employee { public:// 将字段 id 映射为数据库表的主键并且自动递增#pragma db id autoint id;// 将字段 name 映射到数据库表的列名 full_name并且设置为不允许为空#pragma db column(full_name) not_nullstd::string name;// 将字段 email 映射到数据库表的列名 email_address并且设置为唯一值#pragma db column(email_address) uniquestd::string email;// 将字段 role 映射为数据库表的 varchar(20) 类型并设置默认值为 Staff#pragma db type(varchar(20)) default(Staff)std::string role;// 定义字段 phone允许为空使用 odb::nullableT 表示odb::nullablestd::string phone;// 将字段 department 创建一个普通索引用于加速查询#pragma db indexstd::string department; }; 查询预处理 view  View 是只读的结果类用于查询数据并将查询结果映射到特定的结构体或类中。View 类本质上是查询的只读视图不能修改底层数据 事例1 通过View查询学生信息然后通过学生ID和班级表ID进行关联从而查询到对应班级名称object(Student)指定视图操作的主要表是 Studentobject(Classes)将 Student::_classes_id 与 Classes::_id 进行关联关联的表命名为 classes #pragma db view object(Student)\object(Classes classes : Student::_classes_id classes::_id)\query((?)) struct classes_student {// 将 Student::_id 映射到视图中的 id 字段#pragma db column(Student::_id)unsigned long id; // 学生的唯一ID#pragma db column(Student::_sn)unsigned long sn; // 学号#pragma db column(Student::_name)std::string name; // 学生姓名#pragma db column(Student::_age)odb::nullableunsigned short age; // 学生年龄 (可为空)#pragma db column(classes::_name)std::string classes_name; // 班级名称 }; 通过该视图可以执行SQL查询 SELECT Student._id, Student._sn, Student._name, Student._age, Classes._name FROM Student JOIN Classes ON Student._classes_id Classes._id WHERE dynamic_condition; query ODB 提供的查询接口用于执行动态查询并将结果映射到 C 对象中。查询语句可以通过占位符参数绑定动态条件 基本用法 typedef odb::queryT query; // 查询所有年龄大于20的学生 typedef odb::queryStudent query; query q query::age 20;// 等效下面的SQL语句 SELECT * FROM Student WHERE age 20; 查询所有学生信息和班级名称 void queryClassesStudent(database db) {transaction t(db.begin());// 动态条件odb::resultclasses_student result(db.queryclasses_student(WHERE Student._age 18));// 遍历结果for (const auto record : result) {std::cout Student ID: record.id , Name: record.name , Age: (record.age ? *record.age : 0) , Class: record.classes_name std::endl;}t.commit(); } result 用于存储和处理查询的结果集。它的模板参数是查询的目标类型T可以是数据库表对象或视图结构体 typedef odb::resultT result; 支持类似于vector中的相关操作迭代器、范围for等 database类 与MySQL中基本操作类似类似于对其操作进行二次封装 连接管理接口 open() 用于打开数据库连接。如果数据库尚未连接则建立连接。该方法可能接受连接配置如数据库路径、用户名、密码等作为参数 database.open(database_file); close() 关闭数据库连接。释放所有资源 database.close(); is_open()检查数据库是否已经打开 if (database.is_open()) {// 执行数据库操作 } 事务管理接口 begin() database.begin(); commit() 提交事务确保事务中的所有操作被永久保存到数据库中 database.commit(); rollback() 回滚事务撤销事务中的所有操作 database.rollback(); is_transaction_active() 检查是否存在活动的事务 if (database.is_transaction_active()) {// 处理事务 } 对象存取接口 store() 将一个对象持久化到数据库中。如果对象已经存在它会更新对象如果对象是新对象它会插入一条新的记录 database.store(myObject); erase() 从数据库中删除一个对象 database.erase(myObject); load() 从数据库中加载一个对象。通常需要一个对象的标识符如ID来查找该对象 MyObject* obj database.loadMyObject(object_id); find() 根据条件查询数据库中的对象。这个接口通常支持各种查询条件 std::vectorMyObject objects database.findMyObject(age 30); 对象查询接口 query() 执行一个查询返回符合条件的对象列表 auto results database.queryMyObject(SELECT * FROM MyObject WHERE age 30); count() 返回符合某个条件的对象数量 int count database.countMyObject(age 30); distinct() 查询数据库中某个字段的不同值 auto distinctNames database.distinctMyObject(name); 类型映射与元数据接口 get_type_info() 获取与某个对象类型类相关的元数据包括字段、类型等 TypeInfo info database.get_type_infoMyObject(); get_object_count() 获取某个对象类型在数据库中的数量 int objectCount database.get_object_countMyObject(); 数据库备份与恢复 backup() 执行数据库的备份操作将数据库内容复制到一个备份文件 database.backup(backup_file); restore() 从备份文件恢复数据库 database.restore(backup_file); 基本使用 操作流程总结 构建连接池多对象构建数据库操作database对象获取事务对象然后开启事务数据库操作提交事务 创建student.hxx #pragma once #include string #include cstddef // std::size_t #include boost/date_time/posix_time/posix_time.hpp #include odb/nullable.hxx #include odb/core.hxx#pragma db object class Student{public:Student() {}Student(unsigned long sn, const std::string name, unsigned short age, unsigned long cid):_sn(sn), _name(name), _age(age), _classes_id(cid){}void sn(unsigned long num) { _sn num; }unsigned long sn() { return _sn; }void name(const std::string name) { _name name; }std::string name() { return _name; }void age(unsigned short num) { _age num; }odb::nullableunsigned short age() { return _age; }void classes_id(unsigned long cid) { _classes_id cid; }unsigned long classes_id() { return _classes_id; }private:friend class odb::access;#pragma db id autounsigned long _id;#pragma db uniqueunsigned long _sn;std::string _name;odb::nullableunsigned short _age;#pragma db indexunsigned long _classes_id; };#pragma db object class Classes {public:Classes() {}Classes(const std::string name) : _name(name){}void name(const std::string name) { _name name; }std::string name() { return _name; }private:friend class odb::access;#pragma db id autounsigned long _id;std::string _name; };//查询所有的学生信息并显示班级名称 #pragma db view object(Student)\object(Classes classes : Student::_classes_id classes::_id)\query((?)) struct classes_student {#pragma db column(Student::_id)unsigned long id;#pragma db column(Student::_sn)unsigned long sn;#pragma db column(Student::_name)std::string name;#pragma db column(Student::_age)odb::nullableunsigned shortage;#pragma db column(classes::_name)std::string classes_name; };// 只查询学生姓名 , (?) 外部调用时传入的过滤条件 #pragma db view query(select name from Student (?)) struct all_name {std::string name; }; odb -d mysql --std c11 --generate-query --generate-schema --profile boost/date-time student.hxx// 执行SQL文件 mysql -u username -p TestDB student.sql插入操作 void insert_classes(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());Classes c1(一年级一班);Classes c2(一年级二班);db.persist(c1);db.persist(c2);//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 插入数据出错 e.what() std::endl;} } void insert_student(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());Student s1(1, 张三, 18, 1);Student s2(2, 李四, 19, 1);Student s3(3, 王五, 18, 1);Student s4(4, 赵六, 15, 2);Student s5(5, 刘七, 18, 2);Student s6(6, 孙八, 23, 2);db.persist(s1);db.persist(s2);db.persist(s3);db.persist(s4);db.persist(s5);db.persist(s6);//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 插入学生数据出错 e.what() std::endl;} } 查询数据 通过学生表查找某个学生的信息 Student select_student(odb::mysql::database db) {Student res;try {//获取事务对象开启事务odb::transaction trans(db.begin());typedef odb::queryStudent query;typedef odb::resultStudent result;result r(db.queryStudent(query::name 张三));if (r.size() ! 1) {std::cout 数据量不对\n;return Student();}res *r.begin();//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 更新学生数据出错 e.what() std::endl;}return res; } 更新学生记录 通过update()方法更新学生记录stu是一个已经存在的学生对象更新数据会覆盖原记录 void update_student(odb::mysql::database db, Student stu) {try{odb::transaction trans(db.begin());db.update(stu);trans.commit();}catch(std::exception e){std::cout更新学生数据出错:e.what()std::endl;} } 删除某个ID的学生 // 删除classe_id2的学生 void remove_student(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());typedef odb::queryStudent query;db.erase_queryStudent(query::classes_id 2);//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 更新学生数据出错 e.what() std::endl;} } 查找符合条件学生的所有信息 void classes_student(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());typedef odb::querystruct classes_student query;typedef odb::resultstruct classes_student result;result r(db.querystruct classes_student(query::classes::id 1));for (auto it r.begin(); it ! r.end(); it) {std::cout it-id std::endl;std::cout it-sn std::endl;std::cout it-name std::endl;std::cout *it-age std::endl;std::cout it-classes_name std::endl;}//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 更新学生数据出错 e.what() std::endl;} } 查找student表中id 1的学生姓名 // 查询 Student 表中 id 1 的学生姓名 void all_student(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());typedef odb::queryStudent query;typedef odb::resultstruct all_name result;result r(db.querystruct all_name(query::id 1));for (auto it r.begin(); it ! r.end(); it) {std::cout it-name std::endl;}//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 查询所有学生姓名数据出错 e.what() std::endl;} } 代码综合测试 #include odb/database.hxx #include odb/mysql/database.hxx #include student.hxx #include student-odb.hxx #include gflags/gflags.hDEFINE_string(host, 127.0.0.1, 这是Mysql服务器地址); DEFINE_int32(port, 0, 这是Mysql服务器端口); DEFINE_string(db, TestDB, 数据库默认库名称); DEFINE_string(user, root, 这是Mysql用户名); DEFINE_string(pswd, 123456, 这是Mysql密码); DEFINE_string(cset, utf8, 这是Mysql客户端字符集); DEFINE_int32(max_pool, 3, 这是Mysql连接池最大连接数量);void insert_classes(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());Classes c1(一年级一班);Classes c2(一年级二班);db.persist(c1);db.persist(c2);//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 插入数据出错 e.what() std::endl;} }void insert_student(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());Student s1(1, 张三, 18, 1);Student s2(2, 李四, 19, 1);Student s3(3, 王五, 18, 1);Student s4(4, 赵六, 15, 2);Student s5(5, 刘七, 18, 2);Student s6(6, 孙八, 23, 2);db.persist(s1);db.persist(s2);db.persist(s3);db.persist(s4);db.persist(s5);db.persist(s6);//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 插入学生数据出错 e.what() std::endl;} }Student select_student(odb::mysql::database db) {Student res;try {//获取事务对象开启事务odb::transaction trans(db.begin());typedef odb::queryStudent query;typedef odb::resultStudent result;result r(db.queryStudent(query::name 张三));if (r.size() ! 1) {std::cout 数据量不对\n;return Student();}res *r.begin();//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 更新学生数据出错 e.what() std::endl;}return res; }void update_student(odb::mysql::database db, Student stu) {try{odb::transaction trans(db.begin());db.update(stu);trans.commit();}catch(std::exception e){std::cout更新学生数据出错:e.what()std::endl;} }// 删除classe_id2的学生 void remove_student(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());typedef odb::queryStudent query;db.erase_queryStudent(query::classes_id 2);//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 更新学生数据出错 e.what() std::endl;} }//查询某个班级所有的学生 void classes_student(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());typedef odb::querystruct classes_student query;typedef odb::resultstruct classes_student result;result r(db.querystruct classes_student(query::classes::id 1));for (auto it r.begin(); it ! r.end(); it) {std::cout it-id std::endl;std::cout it-sn std::endl;std::cout it-name std::endl;std::cout *it-age std::endl;std::cout it-classes_name std::endl;}//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 更新学生数据出错 e.what() std::endl;} }// 查询 Student 表中 id 1 的学生姓名 void all_student(odb::mysql::database db) {try {//获取事务对象开启事务odb::transaction trans(db.begin());typedef odb::queryStudent query;typedef odb::resultstruct all_name result;result r(db.querystruct all_name(query::id 1));for (auto it r.begin(); it ! r.end(); it) {std::cout it-name std::endl;}//5. 提交事务trans.commit();}catch (std::exception e) {std::cout 查询所有学生姓名数据出错 e.what() std::endl;} }int main(int argc , char *argv[]) {google::ParseCommandLineFlags(argc, argv, true);//1. 构造连接池工厂配置对象std::unique_ptrodb::mysql::connection_pool_factory cpf(new odb::mysql::connection_pool_factory(FLAGS_max_pool, 0));//2. 构建数据库操作对象odb::mysql::database db(FLAGS_user, FLAGS_pswd, FLAGS_db,FLAGS_host, FLAGS_port, , FLAGS_cset,0, std::move(cpf));// 插入数据insert_classes(db);insert_student(db);// 查询数据auto stu select_student(db);std::coutstu.sn()std::endl;std::coutstu.name()std::endl;if (stu.age()) std::cout *stu.age() std::endl;std::cout stu.classes_id() std::endl;//更新数据stu.age(15);update_student(db, stu);remove_student(db);classes_student(db);all_student(db);return 0; }
http://www.w-s-a.com/news/548617/

相关文章:

  • 网站备案掉了什么原因步骤怎么读
  • 徐州市建设监理协会网站做一个公司官网需要多少钱
  • 网站开发学什么数据库做公司网站注意事项
  • 游戏开发网站建设国际战事最新消息
  • 达州+网站建设网站里自己怎么做推广
  • 看网站建设公司的网站案例熊掌号接入wordpress
  • 黄石下陆区建设局网站wordpress如何拖移小工具
  • 宁波网站建设信息网站开发看书
  • 网站建设优化价格北京优化seo排名
  • 微信网站建设公司费用高端网站建设 炫酷
  • 北京网站假设销售找客户最好的app
  • 做外贸需要关注的网站有什么好处宜州设计公司
  • 公司最近想做个网站怎么办陕西科强建设工程有限公司官方网站
  • 生态城门户网站 建设动态it外包收费
  • 网站项目评价老渔哥网站建设公司
  • 哈尔滨寸金网站建设价格178软文网
  • 一个网站建设的成本网站开发过程及要点
  • 监控视频做直播网站中国建筑人才网下载
  • 网站建设公司华网天下买送活动集团网站设计案例
  • 哪些网站比较容易做哪个网站做中高端衣服
  • 做php网站教程wordpress去水印
  • 深圳微网站建设公司哪家好潍坊专业做网站的公司
  • 网站的弹窗广告怎么做软件开发包括
  • 网站开发人员保密做最优秀的自己演讲视频网站
  • 一般做网站要多少钱怎样选择高性价比的建站公司
  • 免费私人网站建设软件高端网站设计平台高端网站设计企业
  • 响应式网站建设的应用场景怎么申请电商平台
  • 怎么做垂直自营网站游戏咨询网站建设目标是什么
  • 建设网站需要给钱吗建立网站三大基础
  • 金融公司网站 htmlwordpress 防火墙