QxOrm入门实战
博客例程 – BlogDemo项目
外键统一使用QSharedPointer智能指针
1 创建表格
-
博客:一个博客由一个作者编写,可以有多个评论,并可以放置在多个分类中。
Blog.h
#ifndef BLOG_H #define BLOG_H #include "Author.h" #include "Category.h" #include "Comment.h" class BLOG_DLL_EXPORT Blog { public: Blog() : m_id(0) {} virtual ~Blog() {} public: long m_id; //主键 QString m_title; //标题 QString m_text; //内容 QDateTime m_createdAt; //创建时间 AuthorPtr m_authorPtr; //作者 CommentPtrVect m_commentPtrVect; //评论列表 CategoryPtrColl m_categoryPtrColl; //标签列表 }; typedef QSharedPointer<Blog> BlogPtr; /************************************************************ * QX_REGISTER_HPP_APP 宏是必须的,用于将 Blog 类注册到 QxOrm 的上下文中 * 参数一:表示要注册的当前类 - Blog * 参数二:基类,如果没有基类,则使用 qx::trait::no_base_class_defined * 参数三:用于序列化的类版本 * ***********************************************************/ QX_REGISTER_HPP_BLOG(Blog, qx::trait::no_base_class_defined, 0) #endif // BLOG_H
Blog.cpp
#include "Blog.h" #include <QxOrm_Impl.h> #include "precompiled.h" /************************************************************ * QX_REGISTER_CPP_BLOG 宏是必须的,用于将 Blog 类注册到 QxOrm 的上下文中 * ***********************************************************/ QX_REGISTER_CPP_BLOG(Blog) namespace qx { /************************************************************** * qx::register_class() 是一个设置函数 * 用于将 User 类对应的属性 注册到 QxOrm 的上下文中 * ***********************************************************/ template <> void register_class(QxClass<Blog>& t) { //设置数据库表名 t.setName("t_blog"); //设置表的主键 t.id(&Blog::m_id, "id"); //添加字段 t.data(&Blog::m_title, "title"); t.data(&Blog::m_text, "text"); t.data(&Blog::m_createdAt, "created_at"); //创建一个n-1的关联关系,并添加字段 author_id ,此字段作表Author的外键 t.relationManyToOne(&Blog::m_authorPtr, "author_id"); //创建一个1-n的关联关系,关系名为 list_comment,(表Comment 的字段 blog_id 作为此表的外键) t.relationOneToMany(&Blog::m_commentPtrVect, "list_comment", "blog_id"); //创建一个n-n的关联关系,关系名为 list_blog,取用时是blog_id->category_id的映射 //创建一个新表 category_blog(如果不存在),并添加字段category_id和blog_id t.relationManyToMany(&Blog::m_categoryPtrColl, "list_category", "category_blog", "blog_id", "category_id"); } } // namespace qx
-
作者:一个作者可以编写多个博客。
Author.h
#ifndef AUTHOR_H #define AUTHOR_H class Blog; typedef QSharedPointer<Blog> BlogPtr; typedef QVector<BlogPtr> BlogPtrVect; class BLOG_DLL_EXPORT Author { public: enum Sex { Male, Female, Unknown }; public: Author() : m_id(0), m_sex(Unknown) {} ~Author() {} int age() const; public: long m_id; //主键 Sex m_sex; //性别 QString m_name; //姓名 QDate m_birthdate; //出生日期 BlogPtrVect m_blogPtrVect; //博客列表 }; typedef QSharedPointer<Author> AuthorPtr; QX_REGISTER_HPP_BLOG(Author, qx::trait::no_base_class_defined, 0) #endif // AUTHOR_H
Author.cpp
#include "Author.h" #include <QxOrm_Impl.h> #include "Blog.h" #include "precompiled.h" QX_REGISTER_CPP_BLOG(Author) namespace qx { template <> void register_class(QxClass<Author> &t) { t.setName("d_author"); t.id(&Author::m_id, "id"); t.data(&Author::m_sex, "sex"); t.data(&Author::m_name, "name"); t.data(&Author::m_birthdate, "birthdate"); //创建一个1-n的关联关系,关系名为 list_blog,(表Blog 的字段 author_id 作为此表的外键) t.relationOneToMany(&Author::m_blogPtrVect, "list_blog", "author_id"); //注册一个没有参数的方法 t.fct_0<int>(&Author::age, "age"); } } // namespace qx int Author::age() const { if (!m_birthdate.isValid()) { return -1; } return (QDate::currentDate().year() - m_birthdate.year()); }
-
评论:一个评论属于一个博客。
Comment.h
#ifndef COMMENT_H #define COMMENT_H class Blog; class BLOG_DLL_EXPORT Comment { public: typedef QSharedPointer<Blog> BlogPtr; public: Comment() : m_id(0) {} virtual ~Comment() {} public: long m_id; QString m_text; BlogPtr m_blogPtr; QDateTime m_createdAt; }; typedef QSharedPointer<Comment> CommentPtr; typedef QVector<CommentPtr> CommentPtrVect; QX_REGISTER_HPP_BLOG(Comment, qx::trait::no_base_class_defined, 0) #endif // COMMENT_H
Comment.cpp
#include "Comment.h" #include <QxOrm_Impl.h> #include "Blog.h&#