{"id":18871519,"url":"https://github.com/newlifex/newlife.xcode","last_synced_at":"2025-04-05T04:10:22.112Z","repository":{"id":41411322,"uuid":"471601893","full_name":"NewLifeX/NewLife.XCode","owner":"NewLifeX","description":"数据中间件，支持MySQL、SQLite、SqlServer、Oracle、Postgresql、TDengine、达梦，重点在缓存、性能、分表、自动建表。","archived":false,"fork":false,"pushed_at":"2025-03-13T05:42:35.000Z","size":174673,"stargazers_count":80,"open_issues_count":10,"forks_count":34,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-03-29T03:05:56.305Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://newlifex.com/xcode","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NewLifeX.png","metadata":{"files":{"readme":"Readme.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-19T05:34:51.000Z","updated_at":"2025-03-13T05:42:38.000Z","dependencies_parsed_at":"2024-12-17T00:11:53.509Z","dependency_job_id":"54741bb1-feb6-43b7-8d4f-6a740ee67189","html_url":"https://github.com/NewLifeX/NewLife.XCode","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewLifeX%2FNewLife.XCode","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewLifeX%2FNewLife.XCode/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewLifeX%2FNewLife.XCode/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NewLifeX%2FNewLife.XCode/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NewLifeX","download_url":"https://codeload.github.com/NewLifeX/NewLife.XCode/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247284949,"owners_count":20913704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T05:26:11.548Z","updated_at":"2025-04-05T04:10:17.101Z","avatar_url":"https://github.com/NewLifeX.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NewLife.XCode - 数据中间件\n\n![GitHub top language](https://img.shields.io/github/languages/top/newlifex/newlife.xcode?logo=github)\n![GitHub License](https://img.shields.io/github/license/newlifex/newlife.xcode?logo=github)\n![Nuget Downloads](https://img.shields.io/nuget/dt/newlife.xcode?logo=nuget)\n![Nuget](https://img.shields.io/nuget/v/newlife.xcode?logo=nuget)\n![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/newlife.xcode?label=dev%20nuget\u0026logo=nuget)\n\n数据中间件，聚焦于添删改查、性能和大数据，支持MySQL、SQLite、SqlServer、Oracle、Postgresql、TDengine、达梦、金仓、瀚高。  \n\nXCode文档：[https://newlifex.com/xcode](https://newlifex.com/xcode)  \n\n## 数据中间件\n功能特点：  \n\n#### 化繁为简\n\n建立XML数据模型后，经代码生成得到实体类，即可使用实体类对数据进行添删改查操作。\n\n开发环境默认使用SQLite数据库，发布到生产环境时再配置连接字符串即可。\n\n日常项目中90%的功能开发无需掌握数据库和SQL，降低对开发者的能力要求，特别是Java等其它语言转过来的开发者。\n\n#### 多数据库迁移\n\n支持MySQL、SQLite、SqlServer、Oracle、Postgresql等各种主流数据库，基于XCode开发的应用无需修改编译即可迁移到另一种数据库上。甚至开发数据库和生产数据库是两种不同的数据库，例如常见SQLite开发，生产用MySql。\n\n#### 高性能\n\n极致的多级缓存设计，批量操作优化，单机**插入速度最高89万tps，查询速度最高18亿qps**。[飞仙](http://feixian.newlifex.com)  \n\n单表查询配合内存关联（带数据缓存），降低系统复杂度并提升性能。\n\n#### 大数据\n\n正式项目最大**单表100亿数据**，分页查询的思想贯穿上下。\n\n根据模型表的索引自动生成各种高效的查询方法，让开发者无惧大数据表。\n\n#### 自动分表分库\n\n支持任意数据库按策略自动分表分库，无需修改业务代码，XCode能够自动找到正确的表。\n\n例如星尘跟踪数据按天分表，配置分表策略后，其它添删改查操作跟单表一样：\n\n```c#\nMeta.ShardPolicy = new TimeShardPolicy(nameof(Id), Meta.Factory)\n{\n    ConnPolicy = \"{0}\",\n    TablePolicy = \"{0}_{1:yyyyMMdd}\",\n    Step = TimeSpan.FromDays(1),\n};\n```\n\n#### 反向工程\n\n根据实体类主动建立数据库表结构并初始化数据（支持所有数据库），开发阶段新增字段，在发布到生产后自动新增，开发者无需准备SQL发布脚本。\n\n#### 跨库数据迁移\n\n支持任意数据库进行数据迁移。[跨库数据迁移工具](https://github.com/qaz734913414/DataMigration)  \n\n\n\n## 快速入门\n\n### 新建项目\n\n打开[Visual Studio](https://x.newlifex.com/vs2022.exe)，新建一个控制台项目，从Nuget引入**NewLife.XCode**。\n\n### 新建模型\n\n在项目目录下编写一个简单Xml模型文件db.xml，或者下载[xcodetool.exe](http://x.newlifex.com/xcodetool.exe)保存到项目目录，运行xcodetool.exe即可得到一个样本模型文件。\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cTables Version=\"9.6.6644.19804\" Output=\"MyEntity\" NameSpace=\"Model\" BaseClass=\"Entity\" ConnName=\"DB\"\u003e\n  \u003cTable Name=\"UserInfo\" Description=\"用户信息\"\u003e\n    \u003cColumns\u003e\n      \u003cColumn Name=\"Id\" DataType=\"Int32\" Identity=\"True\" PrimaryKey=\"True\" Description=\"会员id\" /\u003e\n      \u003cColumn Name=\"UserName\" DataType=\"String\" Nullable=\"False\" Description=\"会员名称\" /\u003e\n      \u003cColumn Name=\"Password\" DataType=\"String\" Nullable=\"False\" Description=\"会员密码\" /\u003e\n      \u003cColumn Name=\"Age\" DataType=\"Int32\" Description=\"会员年龄\" /\u003e\n    \u003c/Columns\u003e\n  \u003c/Table\u003e\n\u003c/Tables\u003e\n```\n双击xml文件旁边的[xcodetool.exe](https://x.newlifex.com/xcodetool.exe)，这时你会看到生成一个MyEntity文件目录，目录包含了两个文件：用户信息.Biz.cs、用户信息.cs。 “用户信息.cs” 一般称为数据类，每次代码生成都会覆盖，“用户信息.Biz.cs”称为业务类，首次生成后不再覆盖，适合用户在其中写代码。\n\n如果不用xcodetool.exe，也可以从Nuget安装全局工具：`dotnet tool install xcodetool -g --prerelease`。\n\n然后在项目目录下执行命令：`xcode db.xml`\n\n### 增删改查\n* Program.cs文件最上面引用命名空间\n```c#\nusing XCode;\n```\n不然会使用不了Save、Update、Delete等扩展方法。\n\n* 新增一条数据。注：这里没有指定数据库，所以XCode默认的是sqlite数据库。代码完成后可以直接运行看效果。\n```csharp\nvar user = new UserInfo();\nuser.UserName = \"张三\";\nuser.Password = \"123456\";\nuser.Age = 18;\nuser.Insert();\n//user.Save()等效\n\nConsole.WriteLine(\"插入一条新数据，用户id为：\" + user.Id);\n```\n* 修改一条数据\n```csharp\nvar user = UserInfo.FindById(1);\nuser.UserName = \"张三\";\nuser.Password = \"123456\";\nuser.Age = 19;\nuser.Update();\n//user.Save()等效\n\nuser = UserInfo.FindById(1);\nConsole.WriteLine($\"用户ID={user.Id}已修改岁数，岁数为：{user.Age}\");\n```\n* 删除一条数据\n```csharp\nvar user = UserInfo.FindById(1);\nuser.Delete();\n\nuser = UserInfo.FindById(1);\nConsole.WriteLine(\"用户\" + (user == null ? \"已删除\" : \"还存在\"));\n```\n* 查询数据，查询是一个十分复杂的需求，这里只举一些简单的例子\n```csharp\n// 根据Id查询用户信息\nvar userId = 2;\nvar user = UserInfo.FindById(userId);\nConsole.WriteLine($\"ID为{user.Id}用户姓名为：{user.UserName}\");\n\n// 根据用户名称查询\nvar userList = UserInfo.FindAll(UserInfo._.UserName == \"张三\");\nConsole.WriteLine($\"查询符合姓名为张三的记录有{userList.Count}\");\n\n// 多复合条件查询\nuserList = UserInfo.FindAll(UserInfo._.UserName == \"张三\" \u0026 UserInfo._.Age == 19);\nConsole.WriteLine($\"查询符合姓名为张三年龄为19的记录有{userList.Count}\");\n```\n\n### 高级用法\n更新某些字段。在“用户信息.Biz.cs”中新增方法写以下代码会更简洁，内置_类无需类名前缀。\n\n```csharp\nUserInfo.Update(UserInfo._.UserName == \"李四\" \u0026 UserInfo._.Age == 18, UserInfo._.Id == 1);\n// 相当于Update UserInfo Set UserName='李四' And Age=18 Where Id=1\n// 绕过了缓存，不推荐这种写法。建议先查出来对象，然后修改并Update回去\n```\n\n复杂的查询语句\n\n```csharp\nvar userList = UserInfo.FindAll(UserInfo._.UserName == \"张三\" \u0026 UserInfo._.Age == 19, UserInfo._.UserName.Desc(), string.Join(\",\", UserInfo._.UserName, UserInfo._.Age), 0, 0);\n// 相当于Select UserName,Age From UserInfo Where UserName='张三' And Age=19 Order By  UserName desc\n```\n\n带分页排序的复杂查询  \n一般写在实体类业务文件（.Biz.cs）里面，可以直接使用实体类内置_类而无需加类名前缀。\n\n```csharp\npublic static IList\u003cUserInfo\u003e Search(String name, Int32 age, Pager p)\n{\n    // 多条件复杂查询\n    var exp = new WhereExpression();\n    if(!name.IsNullOrEmpty()) exp \u0026= _.UserName == name;\n    if(age \u003e 0) exp \u0026= _.Age == age;\n\n    return FindAll(exp, p);\n}\n\nvoid Test()\n{\n    // 默认第一页，每页20行。魔方NewLife.Cube自动从页面Request获取以下参数\n    var p = new Pager();\n    p.PageIndex = 3;\n    p.PageSize = 10;\n    p.Sort = UserInfo.__.Age;\n    p.Desc = true;\n\n    // 需要总记录数来分页，FindAll后p.TotalCount有总记录数，用于计算页数PageCount\n    p.RetrieveTotalCount = true;\n\n    // 相当于Select * From UserInfo Where UserName='张三' And Age=19 Order By Age Desc limit 20, 10\n    var list = UserInfo.Search(\"张三\", 19, p);\n}\n```\n复合排序的分页查询语句\n\n```csharp\nvar pageIndex = 2;//第二页\nvar pageSize = 10;//每页十行\n\nvar userList = UserInfo.FindAll(UserInfo._.UserName == \"张三\" \u0026 UserInfo._.Age == 19, \" UserName desc,Age asc\", string.Join(\",\", UserInfo._.UserName, UserInfo._.Age), (pageIndex - 1) * pageSize, pageSize);\n//相当于Select UserName,Age From UserInfo Where UserName='张三' And Age=19 Order By UserName desc,Age asc limit 10, 10\n```\n\n### 索引查询\n\n修改XML模型文件，增加索引。\n\n```xml\n  \u003cTables\u003e\n    \u003cTable Name=\"UserInfo\" Description=\"用户信息\"\u003e\n      \u003cColumns\u003e\n        \u003cColumn Name=\"Id\" DataType=\"Int32\" Identity=\"True\" PrimaryKey=\"True\" Description=\"会员id\" /\u003e\n        \u003cColumn Name=\"UserName\" DataType=\"String\" Nullable=\"False\" Description=\"会员名称\" /\u003e\n        \u003cColumn Name=\"Password\" DataType=\"String\" Nullable=\"False\" Description=\"会员密码\" /\u003e\n        \u003cColumn Name=\"Age\" DataType=\"Int32\" Description=\"会员年龄\" /\u003e\n      \u003c/Columns\u003e\n      \u003cIndexes\u003e\n        \u003cIndex Columns=\"UserName\" Unique=\"True\" /\u003e\n        \u003cIndex Columns=\"UserName,Age\" /\u003e\n      \u003c/Indexes\u003e\n    \u003c/Table\u003e\n  \u003c/Tables\u003e\n```\n\n再次运行xcodetool.exe，即可看到，“用户信息.cs”增加了FindByUserName方法。此处不建议认为修改，下次代码生成会覆盖。\n\n```csharp\n    /// \u003csummary\u003e根据会员名称查找\u003c/summary\u003e\n    /// \u003cparam name=\"userName\"\u003e会员名称\u003c/param\u003e\n    /// \u003creturns\u003e实体对象\u003c/returns\u003e\n    public static UserInfo FindByUserName(String userName)\n    {\n        if (userName.IsNullOrEmpty()) return null;\n\n        // 实体缓存\n        if (Meta.Session.Count \u003c 1000) return Meta.Cache.Find(e =\u003e e.UserName.EqualIgnoreCase(userName));\n\n        return Find(_.UserName == userName);\n    }\n```\n\n“用户信息.Biz.cs”中增加了Search方法。在Biz业务类中，这个代码可以根据需要修改调整，代码生成器不会覆盖。\n\n```csharp\n    /// \u003csummary\u003e高级查询\u003c/summary\u003e\n    /// \u003cparam name=\"userName\"\u003e会员名称\u003c/param\u003e\n    /// \u003cparam name=\"age\"\u003e会员年龄\u003c/param\u003e\n    /// \u003cparam name=\"key\"\u003e关键字\u003c/param\u003e\n    /// \u003cparam name=\"page\"\u003e分页参数信息。可携带统计和数据权限扩展查询等信息\u003c/param\u003e\n    /// \u003creturns\u003e实体列表\u003c/returns\u003e\n    public static IList\u003cUserInfo\u003e Search(String userName, Int32 age, String key, PageParameter page)\n    {\n        var exp = new WhereExpression();\n\n        if (!userName.IsNullOrEmpty()) exp \u0026= _.UserName == userName;\n        if (age \u003e= 0) exp \u0026= _.Age == age;\n        if (!key.IsNullOrEmpty()) exp \u0026= _.UserName.Contains(key) | _.Password.Contains(key);\n\n        return FindAll(exp, page);\n    }\n```\n\n\n\n## 容器化部署\n\nXCode 支持从环境变量中获取数据库连接字符串，用于容器化部署。  \n连接字符串的环境变量命名规范为 `XCode_{ConnName}`，不区分大小写，连接字符串中需要使用provider指定数据库类型。  \n\n\n\n# 新生命项目矩阵\n\n各项目默认支持net8.0/netstandard2.1/netstandard2.0/net4.61/net4.5，旧版（2023.0308）支持net4.0/net2.0  \n\n|                               项目                               | 年份  | 说明                                                                                   |\n| :--------------------------------------------------------------: | :---: | -------------------------------------------------------------------------------------- |\n|                             基础组件                             |       | 支撑其它中间件以及产品项目                                                             |\n|          [NewLife.Core](https://github.com/NewLifeX/X)           | 2002  | 核心库，日志、配置、缓存、网络、序列化、APM性能追踪                                    |\n|    [NewLife.XCode](https://github.com/NewLifeX/NewLife.XCode)    | 2005  | 大数据中间件，单表百亿级，MySql/SQLite/SqlServer/Oracle/TDengine/达梦，自动分表        |\n|      [NewLife.Net](https://github.com/NewLifeX/NewLife.Net)      | 2005  | 网络库，单机千万级吞吐率（2266万tps），单机百万级连接（400万Tcp）                      |\n| [NewLife.Remoting](https://github.com/NewLifeX/NewLife.Remoting) | 2011  | RPC通信框架，内网高吞吐或物联网硬件设备场景                                            |\n|     [NewLife.Cube](https://github.com/NewLifeX/NewLife.Cube)     | 2010  | 魔方快速开发平台，集成了用户权限、SSO登录、OAuth服务端等，单表100亿级项目验证          |\n|    [NewLife.Agent](https://github.com/NewLifeX/NewLife.Agent)    | 2008  | 服务管理组件，把应用安装成为操作系统守护进程，Windows服务、Linux的Systemd              |\n|     [NewLife.Zero](https://github.com/NewLifeX/NewLife.Zero)     | 2020  | Zero零代脚手架，基于NewLife组件生态的项目模板，Web、WebApi、Service                    |\n|                              中间件                              |       | 对接知名中间件平台                                                                     |\n|    [NewLife.Redis](https://github.com/NewLifeX/NewLife.Redis)    | 2017  | Redis客户端，微秒级延迟，百万级吞吐，丰富的消息队列，百亿级数据量项目验证              |\n| [NewLife.RocketMQ](https://github.com/NewLifeX/NewLife.RocketMQ) | 2018  | RocketMQ纯托管客户端，支持Apache RocketMQ和阿里云消息队列，十亿级项目验                |\n|     [NewLife.MQTT](https://github.com/NewLifeX/NewLife.MQTT)     | 2019  | 物联网消息协议，MqttClient/MqttServer，客户端支持阿里云物联网                          |\n|      [NewLife.IoT](https://github.com/NewLifeX/NewLife.IoT)      | 2022  | IoT标准库，定义物联网领域的各种通信协议标准规范                                        |\n|   [NewLife.Modbus](https://github.com/NewLifeX/NewLife.Modbus)   | 2022  | ModbusTcp/ModbusRTU/ModbusASCII，基于IoT标准库实现，支持IoT平台和IoTEdge               |\n|  [NewLife.Siemens](https://github.com/NewLifeX/NewLife.Siemens)  | 2022  | 西门子PLC协议，基于IoT标准库实现，支持IoT平台和IoTEdge                                 |\n|      [NewLife.Map](https://github.com/NewLifeX/NewLife.Map)      | 2022  | 地图组件库，封装百度地图、高德地图和腾讯地图                                           |\n|       [NewLife.IP](https://github.com/NewLifeX/NewLife.IP)       | 2022  | IP地址库，IP地址转物理地址                                                             |\n|                             产品平台                             |       | 产品平台级，编译部署即用，个性化自定义                                                 |\n|           [AntJob](https://github.com/NewLifeX/AntJob)           | 2019  | 蚂蚁调度，分布式大数据计算平台（实时/离线），蚂蚁搬家分片思想，万亿级数据量项目验证    |\n|         [Stardust](https://github.com/NewLifeX/Stardust)         | 2018  | 星尘，分布式服务平台，节点管理、APM监控中心、配置中心、注册中心、发布中心              |\n|      [NewLife.ERP](https://github.com/NewLifeX/NewLife.ERP)      | 2021  | 企业ERP，产品管理、客户管理、销售管理、供应商管理                                      |\n|         [CrazyCoder](https://github.com/NewLifeX/XCoder)         | 2006  | 码神工具，众多开发者工具，网络、串口、加解密、正则表达式、Modbus                       |\n|           [XProxy](https://github.com/NewLifeX/XProxy)           | 2005  | 产品级反向代理，NAT代理、Http代理                                                      |\n|        [HttpMeter](https://github.com/NewLifeX/HttpMeter)        | 2022  | Http压力测试工具                                                                       |\n|         [GitCandy](https://github.com/NewLifeX/GitCandy)         | 2015  | Git源代码管理系统                                                                      |\n|          [SmartOS](https://github.com/NewLifeX/SmartOS)          | 2014  | 嵌入式操作系统，完全独立自主，支持ARM Cortex-M芯片架构                                 |\n|          [SmartA2](https://github.com/NewLifeX/SmartA2)          | 2019  | 嵌入式工业计算机，物联网边缘网关，高性能.NET6主机，应用于工业、农业、交通、医疗        |\n|                           菲凡物联FIoT                           | 2020  | 物联网整体解决方案，建筑、环保、农业，软硬件及大数据分析一体化，单机十万级点位项目验证 |\n|                           NewLife.UWB                            | 2020  | 厘米级（10~20cm）高精度室内定位，软硬件一体化，与其它系统联动，大型展厅项目验证        |\n\n\n\n# 新生命开发团队\n\n![XCode](https://newlifex.com/logo.png)  \n\n新生命团队（NewLife）成立于2002年，是新时代物联网行业解决方案提供者，致力于提供软硬件应用方案咨询、系统架构规划与开发服务。  \n团队主导的开源NewLife系列组件已被广泛应用于各行业，Nuget累计下载量高达260余万次。  \n团队开发的大数据核心组件NewLife.XCode、蚂蚁调度计算平台AntJob、星尘分布式平台Stardust、缓存队列组件NewLife.Redis以及物联网平台NewLife.IoT，均成功应用于电力、高校、互联网、电信、交通、物流、工控、医疗、文博等行业，为客户提供了大量先进、可靠、安全、高质量、易扩展的产品和系统集成服务。  \n\n我们将不断通过服务的持续改进，成为客户长期信赖的合作伙伴，通过不断的创新和发展，成为国内优秀的IT服务供应商。  \n\n`新生命团队始于2002年，部分开源项目具有20年以上漫长历史，源码库保留有2010年以来所有修改记录`  \n网站：https://newlifex.com  \n开源：https://github.com/newlifex  \nQQ群：1600800/1600838  \n微信公众号：  \n![智能大石头](https://newlifex.com/stone.jpg)  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewlifex%2Fnewlife.xcode","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnewlifex%2Fnewlife.xcode","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewlifex%2Fnewlife.xcode/lists"}