QxOrm入门实战

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&#
  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值