c++中数据表如何转成业务实体--map和结构体的相互转换
应用场景:如何把数据库表中的一行转换成一个业务实体结构体,c#和java中都有实体框架,表到实体的转换很方便,c++中缺少这些框架,但是有一些折中的办法去做。其实问题的本质是:map如何转成结构体。
问题:map的字段和结构体字段一一对应时,如何把map中字段对应的值付给结构体中相同名称字段?
有点麻烦的地方:如何让结构体去在map中查找相应的字段值,一种办法是通过手写的办法,把每个字段名称写成常量字符串,然后去map中查找,找到后,再给该字段赋值,这个办法是可以的,但是重复性的硬编码了很多字段名称,代码也比较丑陋。
一个比较好的办法是通过一个宏和一个模板函数去赋值比较好。
这是我们的结构体
#define VarName(x) #x //字段转成名称的宏
struct TestInfo
{
int ID;
int KPIID;
int Code;
int V1;
int V2;
int V3; void Init()
{
memset(this, , sizeof(TestInfo));
} void Make(SweetDB::Row& row)
{
Init();
GetValue(row, VarName(ID), ID);
GetValue(row, VarName(KPIID), KPIID);
GetValue(row, VarName(Code), Code);
GetValue(row, VarName(V1), V1);
GetValue(row, VarName(V2), V2);
GetValue(row, VarName(V3), V3);
} void MakeToRow(SweetDB::Row& row)
{
row[VarName(ID)] = ID;
row[VarName(KPIID)] = KPIID;
} template<typename T>
static bool GetValue(SweetDB::Row& row, const char* name, T& t)
{
auto it = row.find(name);
if (it == row.end())
return false; t = get<T>(it->second); return true;
}
};
测试代码:
typedef boost::variant<double, int, string>Value;
typedef unordered_map<const char*, Value> Row;
TestInfoResult TestDoublePointer()
{
SweetDB::Row row = { {"ID", }, { "KPIID", }, { "Code", } };
TestInfo t;
t.Make(row); //把map中对应的字段值赋给t SweetDB::Row row1;
t.MakeToRow(row1); //把t的字段值赋给map
}
最后我们看到map to struct成功了,struct to map也成功了。
优点是不用硬编码字段名称,缺点是,每个字段的赋值还是要编码,这个工作量还是没省,如果是c#语言直接就通过反射搞定,不需要这么绕弯子了,c++语言就没办法,只能自己发明轮子了。也许大家还有更好的办法,可以一起探讨一下。
也许c++ ORM框架大体可以按这个思路去做吧。
c++中数据表如何转成业务实体--map和结构体的相互转换的更多相关文章
- Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射?
NET[C#]Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射? 问题描述 比如有如下的数据表结构:Person: person_id int first_name va ...
- 使用DB查询分析器实现异构数据源中数据表的相互访问
1 引言 硕士程序员马根峰(CSDN专访马根峰:海量数据处理与分析大师的中国本土程序员)推出的个人作品----万能数据库查询分析器,中文版本DB 查询分析器.英文版本<DB Query A ...
- myeclipse通过数据表生成jpa或hibernate实体---https://blog.csdn.net/partner4java/article/details/8560289
myeclipse通过数据表生成jpa或hibernate实体-----https://blog.csdn.net/partner4java/article/details/8560289
- phpstudy命令行中数据表插入中文显示不了的问题
在PHPstudy环境下,做MySQL操作,往数据表里面插入数据的时候,如果是中文的数据就会显示不了或者是问号?. 这个问题搞了我一晚上了,终于知道问题所在. 下载的PHPstudy的MySQL数据库 ...
- MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建
前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...
- 查看MYSQL中数据表占用的空间
由于数据太大了.所以MYSQL需要瘦身,那前提就是需要知道每个表占用的空间大小. 首先打开指定的数据库: use information_schema; 如果想看指定数据库中的数据表,可以用如下语句: ...
- Java中数据表的建立
class Emp{ private int empno;//职工编号 private String ename;//姓名 private String job;//职位 private double ...
- MySQL中数据表的基本操纵
本文基于对国家863中部软件孵化器编著的<MySQL从入门到精通>一书的操作实践. 一.创建数据表 数据表属于数据库,在创建数据表之前,应该使用语句 USE 数据库名 指定操作是在那个 ...
- Oracle清空数据库中数据表数据的方法
一.简介最近在项目发版测试的时候,导出dmp的时候不小心把开发库中的一些脏数据导出来了,测试那边导入进去之后一堆不规范的数据,为了不影响测试结果,于是总结了一个快速清空数据库数据表所有数据的方法. 二 ...
随机推荐
- Android中为图标加上数字
Android中为图标加上数字--用于未读短信数提醒,待更新应用数提醒等 http://flysnow.iteye.com/blog/906770
- SpringMVC框架学习
2012-03-21 衡量一个MVC框架模式,主要通过三种web模式,本人认为springMVC是一个很好的MVC 模式,对模式的支持如下: (1)派遣器模式 Spring有一个统一集中的派遣器org ...
- 使用httpClient调用接口获取响应数据
转自:https://blog.csdn.net/shuaishuaidewo/article/details/81136088 import lombok.extern.slf4j.Slf4j; i ...
- Tex
关于Tex,有许多概念.许多软件.这些软件是做什么的,要解决哪些问题,今日好好总结一下. 就像任何领域一旦引入代数系统,一切都会变得井然有序一样.就像用五行八卦描述事物,事物的规律就变得清晰一样,类比 ...
- js中的getBoundingClientRect()函数
在Chrome上,此函数返回结果包含x,y,它们的取值对应于left,top.但是x,y这种表示方式非常不直观(需要先理解x轴和y轴的方向),而left,top则清晰无歧义地表达了元素的位置.正是因此 ...
- I/O Completion Ports学习
表示还是自己看MSDN最直接,别人的介绍都是嚼剩下,有木有? IO完成端口为在多处理器系统处理多个异步IO请求提供一个高效的线程模型.当一个进程新建一个完成端口,操作系统新建一个目的为服务这些请求的队 ...
- 保证java的jar包在后台运行
nohup java -jar XX.jar >temp.text &
- 部署hadoop的开发环境
第一步:安装jdk 由于hadoop是java开发的,所以需要JDK来运行代码.这里安装的是jdk1.6. jdk的安装见http://www.cnblogs.com/tommyli/archive/ ...
- hadoop执行wordcount例子
1:下载hadoop.http://mirror.esocc.com/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz 2:解压. tar - ...
- GIF Brewery for Mac(录制 Gif 动图工具)安装
1.软件简介 GIF Brewery 一款用于录制 Gif 动图等的工具. 2.资源列表 链接 提取密码 系统要求 软件语言 GIF Brewery for Mac v3.9.5 ltmf ma ...