1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/QdbcShen-QtOrm

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ReadMe.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 13:25 c082def

Qdbc: Руководство по использованию

Этот фреймворк для работы с операционными базами данных относится к классу mybatis. Если вы уже работали с таким фреймворком, то вам будет проще разобраться в Qdbc.

Все операции SQL выполняются с помощью макрофункций, что делает работу с ними удобной и простой.

На данный момент это тестовая версия, которая может быть нестабильной. Чтобы узнать версию, можно использовать макрос Qversion в файле Qdbc.h. Если в версии есть буква «c», то это тестовая версия. Если «s» — стабильная версия.

Фреймворк называется Qdbc. Если есть другие фреймворки с таким же названием, рекомендуется изменить название.

Содержание

    1. Быстрый старт
    1. Заполнитель и формат макросов
    1. Определение ORM-класса
    1. Класс инструментов Object_utils
    1. Файл конфигурации qjbctemplate.ini
    1. Завершение

1. Быстрый старт

  1. Скопируйте папку Qdbc в новый каталог проекта.
  2. Создайте проект с использованием Qt, который включает модуль SQL.
  3. Добавьте файл заголовка Qdbc.h в проект, чтобы быстро начать работу.
  4. Импортируйте таблицу laneip (таблица обнаружения сети), убедитесь, что база данных использует формат UTF-8. Вот пример таблицы:
CREATE TABLE Laneip (
id  int(11) NOT NULL AUTO_INCREMENT ,
ip  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
port  varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
url  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
entryno  varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
etype  int(255) NULL DEFAULT NULL ,
Status  int(255) NULL DEFAULT 1 ,
description  varchar(600) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
updatetime  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (id)
) ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=7
ROW_FORMAT=COMPACT;
Поле Описание
id Автоинкрементное поле
ip IP-адрес сайта
port Порт сайта
url URL сайта
entryno Идентификатор местоположения («0»: Пекин, «1»: Шанхай, «2»: Шэньчжэнь, «3»: Цзянсу)
etype Тип сайта (0: «корпоративный сайт», 1: «отраслевой сайт», 2: «B2B электронный бизнес»)
description Состояние сети («сетевое исключение, тайм-аут соединения», «нормальная сеть»)
updatetime Время обновления (если не указано, используется текущее время)
  1. Вставьте данные, чтобы можно было искать соответствующий IP.
#include <QtCore/QCoreApplication>
#include "dbc.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString ip;
    Qselect("SELECT ip from laneip WHERE id = 2") > ip;
    return a.exec();
}

2. Заполнитель и формат макросов

В настоящее время есть два типа заполнителей: #{} и ${}. #{} и ${} должны полностью соответствовать свойствам ORM-классов. Несоответствие может привести к ошибкам. #{} представляет собой препроцессорный заполнитель, а ${} — простое объединение SQL.

  1. Правила поиска заполнителя: сначала ищите #{}, затем ${}. Для ${} обратите внимание на необходимость использования одинарных кавычек для строковых типов.
void updatetest()
{
    QString sql = "UPDATE laneip SET updatetime='${updatetime}' WHERE id=${id}";
    int count;
    Qupdate(sql) < QDateTime::currentDateTime() < 2 > count ;
    qDebug() << "update1:" << count;
}   
  1. Поиск ошибок Если поиск не удался, int-тип будет равен -1, тип указателя будет NULL, QString будет NULL. Необходимо проверить, есть ли конфликт при поиске результата. Для Qselect можно вернуть указатель или значение -1 в зависимости от необходимости поиска или ошибки выполнения. Для Qupdate, Qinsert и Qdelete возвращается только int-значение. При успешном выполнении возвращается количество затронутых строк, при ошибке — -1.
  2. Формат макроса Все форматы макросов находятся в Qdbc. Используются семантические метки для удобства использования. Это формат запроса: Qselect обозначает запрос макроса: для запроса Qselect("select * from xxx") < arg1 < arg2 > result можно иметь несколько входных параметров, но только один выходной. < обозначает ввод, аналогично параметрам функции, > обозначает вывод, аналогично возвращаемому значению функции. < нельзя указать как список, но возвращаемое значение может быть списком, обычно используемым для запросов нескольких операторов. Другие операторы: Qdelete обозначает удаление макроса, Qinsert обозначает вставку макроса, и Qdelete обозначает удаление макроса. Эти три макроса могут иметь только один выход или не иметь выхода. Выход должен быть int-типом.
  3. Макрос Qtransactional По умолчанию он помещается в первую строку функции и учитывает все операции SQL. Если какая-либо операция SQL вызывает ошибку, она откатывается, иначе она фиксируется. Пример:
void transactionaltest()
{
    Qtransactional();
    Laneip lane;
    lane.ip = "192.168.1.103";
    lane.id = 2;
    QString sql = "UPDATE laneip SET ip=#{ip} WHERE id=#{id}";
    int count;
    Qupdate("UPDATE laneip SET1 ip=#{ip} WHERE id=#{id}") < &lane > count;
    lane.ip = "192.168.1.104";
    lane.id = 2;
    Qupdate(sql) < &lane > count;
    qDebug() << "update:" << count;
}
  1. Макрос Qif Макрос Qif используется для логических суждений и аналогичен if-else. Qif(condition,va): condition — логическое условие, поддерживающее &&, ||,! va — действие, выполняемое при истинности условия. Но va должен выводить строку. Qelif(condition,va): condition — логическое условие, поддерживающее &&, ||,! va — действие, выполняемое при истинности условия. Но va должен выводить строку, и перед ним должен выполняться Qif. Qelse(va): va — действие, которое выполняется, когда все условия не выполняются. Но va должен выводить строку и должен выполняться после Qif или Qelif. Qswitch — макрос для выбора, аналогичный switch-case. Этот макрос необходимо использовать вместе с Qcase.

Qswitch(const1) const1 — константа, которая может быть строкой или целым числом.

Qcase(const1, value1) const1 — константа, поддерживающая строку или целое число. value1 — значение const1, которое соответствует совпадению.

Qdefault(value1)
const1 — константа, поддерживающая строку или целое число. value1 — значение const1, которому не найдено соответствие.

Qforeach (begin, separator, end, collection)
Qforeach — это макрос цикла, аналогичный for. Его нужно использовать отдельно.

begin — параметр строки, который является начальной точкой collection.

separator — строковый параметр, который разделяет collection.

end — строчный параметр, который является конечной точкой collection.

collection — тип QString, QList, QStringList. QList можно заменить на IntList.

Qclear
Qclear — освобождение динамически выделенной памяти указателя переменной. Можно освободить вручную, иначе память будет освобождена автоматически.

QconfigPath (path, name)
Этот макрос должен быть настроен перед выполнением SQL-запроса, в противном случае настройка будет недействительной.

path — можно указать относительный путь или абсолютный путь. Для пути используйте обратную косую черту для кодирования пути. Например, C:/11/22. Если вы укажете пустую строку, то она будет равна пути исполняемого файла.

name — имя указанного файла конфигурации. Если name — пустая строка, используется имя по умолчанию: qjbctemplate.ini. В противном случае используется указанное имя файла конфигурации.

QBye()
Этот макрос используется для уничтожения и создания потоков в многопоточной среде. Необходимо поместить QBye () в конце потока.

QDBC_Id
Этот макрос определяет, какой поток печатает данные в многопоточных средах. Каждый раз, когда создаётся новый поток, QDBC_Id увеличивается на 1. Например: qDebug() << QDBC_Id << Object_utils::toString(lane);

Этот метод проверяет функцию Qif.

void iftest()
{
    Laneip* lane = NULL;
    QString ip = "192.168.1.104";
    QString sql = "SELECT * FROM laneip WHERE id = ";
    Qif(ip == "192.168.1.104", "2")
    Qelse("0");
    Qselect(sql) > lane;
    if (lane == NULL) {
        qDebug() << "error";
        return;
    }
    qDebug() << Object_utils::toString(lane);
}

Этот метод тестирует функцию Qswitch. Возвращает:

void switchtest()
{
    Laneip* lane = NULL;
    QString ip = "192.168.1.104";
    QString sql = "SELECT * FROM laneip WHERE id = ";
    Qswitch(ip)
    Qcase("192.168.1.100", "1")
    Qcase("192.168.1.104", "2");
    Qselect(sql) > lane;
    if (lane == NULL) {
        qDebug() << "error";
        return;
    }
    qDebug() << Object_utils::toString(lane);
}

Этот метод тестирует функцию Qforeach. Возвращает список.

void foreachtest()
{
    qDebug() << "QHello::selectAl start";
    QList<Laneip*> lanelist;
    IntList ls;
    ls << 2 << 3;
    QString sql = "SELECT * FROM laneip where id in" Qforeach("(", ",", ")", ls);
    Qselect(sql) > lanelist;
    qDebug() << QDBC_Id << Object_utils::toString(lanelist);
}

Использование макроса Qresults

  1. Этот макрос требует соответствия @result_Id, @result, @one, @many.

  2. #define result_Id (column, ...) — определение атрибута id. column определяет имя столбца базы данных. Если атрибут заполнен, он определяется как пользовательский атрибут, в противном случае атрибут имени столбца и атрибут совпадают.

  3. #define result (column, ...) — определение класса атрибутов. column определяет имя столбца базы данных. Если атрибут заполнен, он определяется как пользовательский атрибут, в противном случае атрибут имени столбца и атрибут совпадают.

  4. #define one (classname, ...) — определение связанного класса. classname — имя класса. Может использоваться для формирования многоуровневых вложенных объектов или связанных списков (только для Qlist). ip: 192.168.1.112 port: 100 url: www.google.com entryno: 111 etype: 1 Status: 1 description: нормально updatetime: 2020-04-30T17:24:19 && id: 6

ip: 192.168.1.112 port: 1144 url: www.google.com entryno: 2 etype: 2 Status: 1 description: сеть в норме updatetime: 2020-09-08T17:24:47 && ]"

QList<Laneip*> lane;
QString sql = "SELECT * FROM laneip";
Qselect(sql) > lane;
qDebug() << Object_utils::toString(lane);
  1. Для статической функции void copy(T* src, T* dec), которая является инструментом для копирования определения класса orm, наследуемого от Qobject, копирование запрещено. Поэтому можно использовать функцию copy для реализации:
Laneip *lane = NULL;
QString sql = "SELECT * FROM laneip WHERE id = #{lid}";
Qselect(sql) < 3 > lane;
if (lane == NULL) {
    qDebug() << "error";
    return;
}
Laneip pp;
Object_utils<Laneip>::copy(&pp, lane);
  1. Статическая функция void clear(T& data) — это статический член, который используется для очистки ссылки на объект типа orm.
  2. Статическая функция void clear(T* & data) — это статическая функция-член, используемая для очистки указателя на объект orm.
  3. Статическая функция bool isNULL(T& data) — это функция-член, которая определяет, является ли ссылка на тип orm пустой. Её возвращаемое значение противоположно значению функции-члена isClear.
  4. Статическая функция bool isClear(T& data) — это функция-член, определяющая, очищен ли объект, на который указывает ссылка типа orm. Её возвращаемое значение противоположно возвращаемому значению функции-члена isNULL.
  5. Статическая функция bool compare(T& data) — это функция-член, сравнивающая свойства объекта класса orm и возвращающая true, если они совпадают, и false, если нет.

5, Конфигурация файла: qjbctemplate.ini

Этот файл конфигурации предназначен для версии «20.09». Если вы хотите добавить контент, вы можете сделать это в файле конфигурации. Описание файла конфигурации выглядит следующим образом:

[MYSQL]   #暂时只要支持MYSQL
host=127.0.0.1  #数据库地址
port=3306   #数据库端口
dbname=test1    #数据库名
dbuser=root     #用户名
dbpwd=          #密码
isPool=true     #释放开启线程,有true和false两张可选,如果是false,则[pool]不管用
timeout=2       #连接数据库的延迟
[TEMPLATE]
Loglevel=1      #日志水平,0代表全输出,1代表不输出
automemory=ture #如果为true,则有Qdbc来管理动态分配的内存,如果false则手动管理内存,Qclear宏将无效。
version=x.x.xc      #版本既可以在配置文件看,也可以在Qdbc.h中查看,c为测试版本,s为稳定版

[pool]
initialPoolSize=4   #线程池的个数,暂时只支持默认的线程池,如需扩展,等待后续开发

6, Версия

  • Версия 20.09: Это первая версия qdbc, в которой добавлен класс инструментов Object_utils. Вы можете увидеть номер версии в файле конфигурации или в Qdbc.h.
  • Версия 20.10: Эта версия оптимизирует производительность программы и решает некоторые проблемы с утечкой памяти. Она также улучшает Readme и добавляет функциональность Object_utils::compare. Кроме того, она поддерживает связанные запросы и разделяет файлы заголовков QdbcConfig и предыдущие файлы заголовков Qdbc.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/QdbcShen-QtOrm.git
git@api.gitlife.ru:oschina-mirror/QdbcShen-QtOrm.git
oschina-mirror
QdbcShen-QtOrm
QdbcShen-QtOrm
master