为了更加简单的使用qt读写数据库,学习了其他编程框架的设计模式和使用习惯,编写了一个对QSqlQuery操作高度封装的c++模板库,使用链式联级调用直接获取查询结果并转化到类对象实例。
模板库地址:QtDao(https://github.com/daonvshu/QtDao)
使用示例
基本查询操作:
Test1::Fields sf1;
Test1 d1 = dao::_select<Test1>()
.filter(sf1.name == "client", _or(sf1.number == 12, sf1.name == "bob"))
.build().one();
等价于sql语句:
select *from test1 where name='client' and (number=12 or name='bob')
复杂的join自递归操作:
class TmpTest2 : public dao::self<SqliteTest2> {};
SqliteTest1::Fields sf1;
SqliteTest2::Fields sf2;
SqliteTest3::Fields sf3;
TmpTest2::Fields sfs2;
auto recursive = dao::_recursive()
.tmp<TmpTest2>()
.initialSelect(
dao::_select<SqliteTest2>().filter(sf2.number == 50).build()
)
.recursiveSelect(
dao::_join<SqliteTest2, TmpTest2>()
.columnAll<SqliteTest2>()
.from<SqliteTest2>()
.innerJoin<TmpTest2>().on(sfs2.number2 == sf2.number)
.build()
);
//join from recursive
auto join2 = dao::_join<SqliteTest1, TmpTest2, SqliteTest3>()
.column(sfs2.name, sf1.name, sf3.name, sf1.number, sfs2.number)
.from<SqliteTest1>()
.innerJoin(recursive).on(sfs2.id == sf3.tbi2)
.innerJoin<SqliteTest3>().on(sf3.tbi1 == sf1.id, sf3.name.like("client%"))
.build().list();
等价于sql语句:
WITH ts_sqlitetest2_2 AS (
SELECT *
FROM ts_sqlitetest2
WHERE number = 50
UNION
SELECT a.id, a.name, a.number, a.number2, a.varianttype
FROM ts_sqlitetest2 a
INNER JOIN ts_sqlitetest2_2 b ON b.number2 = a.number
)
SELECT b.name, a.name, c.name, a.number, b.number
FROM ts_sqlitetest1 a
INNER JOIN ts_sqlitetest2_2 b ON b.id = c.tbi2
INNER JOIN ts_sqlitetest3 c
ON c.tbi1 = a.id
AND c.name LIKE 'client%'
支持的数据库
- sqlite
- mysql
- sqlserver
支持的功能
- 数据库初始化
- 检查连接
- 自动创建数据库/数据表
- 检查版本并升级
- 日志
- 打印执行的sql语句
- 打印执行的sql值列表
- 连接池
- 多线程查询
- 连接名复用
- 查询