当前位置: 首页 > news >正文

属性名称T4模版生成SpringMVC构造REST代码:第三篇 用T4模版生成POCO类代码

文章结束给大家来个程序员笑话:[M]

        用T4模版生成POCO类代码,简略,但要求数据库定义必定要有规律,否则就没有现实意义了。这里,我们做如下划定:

       1、数据库的表名,全部小写,各个单词之间以“_”(下划线)分割,且第一个单词为前缀。

        2、表中各个字段,全部小写,各个单词之间以“_”(下划线)分割,表最好可以有create_time,create_by,update_time,update_time,version_no,is_valid。

        生成的POCO划定:

        1、类的名称,去掉前缀及分割符,各个单词的首字母大写,采用Pascial规范。

        2、类中属性的名称,去掉分割符,首字符小写其余大写,采用Camel规范。

        3、类中属性的数据类别,全部采用结构类型,且做以下转换

             A、sbyte、bool、boolean、int、integer、Integer、Int16、short、Int32、Nullable<sbyte>、Nullable<bool>、Nullable<boolean>、Nullable<int>、Nullable<integer>、Nullable<Integer>、Nullable<Int16>、Nullable<short>、Nullable<Int32>,全部转换成Integer

            B、long、Long、Nullable<long>、Nullable<Long>,全部转换成Long

            C、float、Float、decimal、Decimal、Nullable<float>、Nullable<Float>、Nullable<decimal>、Nullable<Decimal>,全部转换成Double

            D、string、String,全部转化成String

            E、date、time、datetime、timestamp、Nullable<date>、Nullable<time>、Nullable<datetime>、Nullable<timestamp>,全部转换成String;其实,多平台开辟时,这些字段根本不应该涌现,直接用时间戳(当前百万秒-1970-1-1 00:00:00)

           F、byte[]二进制数据,不变

          备 注:

                 A、text,在EntityFramework(简称EF)中,已经转化成String,长度max(2GB);

                 B、binary、blob、mediumblob、tinyblob、varbinary,在EF中已经转换成byte[]

          下面,我们开始用T4模版生成POCO类代码之旅

    第一步,在“解决方案JavaGenerate”中添加类库,用于寄存model的模版及相应文件,我们命名这个类库为JavaModels

             点击“解决方案JavaGenerate”,右键,选择“添加 ”--〉“新建项目”,再选择"类库",名称中输入JavaModels。返回后,在“解决方案JavaGenerate”中增长了一个叫JavaModels的项目,且自带了一个class.cs的类,我们点击它,再点右键删除它,不必它。如图3-1,注意红色方框,特别是要选中.NET Framework4

    属性和名称

    图3-1

    第二步,增长t4空模版

             在解决方案管理器中,选择JavaModels项目,点击右键,选择“添加 ”--〉“新建项”,在弹出的窗体中做图3-2的选择和输入项。

    属性和名称

    图3-2

    第三步,修改模版,我直接贴一个,然后慢慢解释

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE"#>
<#@
 output extension=".cs"#><#
CodeGenerationTools code = new CodeGenerationTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this, 1);
MetadataTools ef = new MetadataTools(this);
string inputFile = @"..\EDMX\dblxh.edmx";//

    EDMX项目中dblxh.edmx的路径,根据项目修改

    每日一道理
悲观的人,先被自己打败,然后才被生活打败;乐观的人,先战胜自己,然后才战胜生活。悲观的人,所受的痛苦有限,前途也有限;乐观的人,所受的磨难无量,前途也无量。在悲观的人眼里,原来可能的事也能变成不可能;在乐观的人眼里,原来不可能的事也能变成可能。悲观只能产生平庸,乐观才能造就卓绝。从卓绝的人那里,我们不难发现乐观的精神;从平庸的人那里,我们很容易找到阴郁的影子。

    MetadataWorkspace metadataWorkspace = null; bool allMetadataLoaded =loader.TryLoadAllMetadata(inputFile, out metadataWorkspace); EdmItemCollection ItemCollection = (EdmItemCollection)metadataWorkspace.GetItemCollection(DataSpace.CSpace); EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this); // 收回文件 foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)) { string filePascialName=getModelsPascialName(entity.Name);//Pascial风格的类名称 string fileCamelName=getModelsCamelName(entity.Name);//Camel风格的类名称 fileManager.StartNewFile(filePascialName+ ".java");//输出的类文件名称,及开始输出文件 #> package com.jiahe.rest.demo2.models; /********************************************************************************* * Copyright (c) ZDSOFT LIMITED 2012 All Rights Reserved * 系统名称: * 程序模块文件名称:<#=filePascialName+ ".java"#> * 摘要: *********************************************************************************/ import java.io.Serializable; /********************************************************************************* * * <pre> * [版本说明] * 1.0 2012/08/30 初版 * </pre> * @version 1.0 2013/5/16 * @author lxh *********************************************************************************/ public class <#=filePascialName#> implements Serializable { private static final long serialVersionUID = 1L; <# //定义实体的私有属性 //循环实体的每一个属性 //getPropertyType,失掉属性的数据类型 //getPropertyCamelName 失掉属性的Camel风格的名称 foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity)) { #> private <#=getPropertyType(code.Escape(edmProperty.TypeUsage))#> <#=getPropertyCamelName(edmProperty.Name)#>; <#}#> <# //定义实体私有属性的get/set //循环实体的每一个属性 //getPropertyType,失掉属性的数据类型 //getPropertyCamelName 失掉属性的Camel风格的名称 //getPropertyPascialName 失掉属性的Pascial风格的名称 foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity)) {#> public void set<#=getPropertyPascialName(edmProperty.Name)#>(<#=getPropertyType(code.Escape(edmProperty.TypeUsage))#> <#=getPropertyCamelName(edmProperty.Name)#>) { this.<#=getPropertyCamelName(edmProperty.Name)#>=<#=getPropertyCamelName(edmProperty.Name)#>; } public <#=getPropertyType(code.Escape(edmProperty.TypeUsage))#> get<#=getPropertyPascialName(edmProperty.Name)#>() { return this.<#=getPropertyCamelName(edmProperty.Name)#>; } <#}#> <# //定义实体的toString //循环实体的每一个属性 //getPropertyType,失掉属性的数据类型 //getPropertyCamelName 失掉属性的Camel风格的名称 //getPropertyPascialName 失掉属性的Pascial风格的名称 string toStr=string.Empty; foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity)) toStr+="+ \", "+getPropertyCamelName(edmProperty.Name)+"=\"+"+getPropertyCamelName(edmProperty.Name); toStr=toStr.Substring(4); #> @Override public String toString() { return "<#=filePascialName#> [<#= toStr #> + "]"; } <# //定义默许结构函数 #> public <#=filePascialName#>() { super(); } <# //定义参数结构函数 toStr=string.Empty; foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity)) toStr+=getPropertyType(code.Escape(edmProperty.TypeUsage))+" "+getPropertyCamelName(edmProperty.Name); #> public <#=filePascialName#>(<#=toStr#>) { super(); <#foreach (EdmProperty edmProperty in entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity)){#> this.<#= getPropertyCamelName(edmProperty.Name)#>=<#=getPropertyCamelName(edmProperty.Name)#>; <#}#> } <# } fileManager.Process(); #> <#+ //失掉类的Pascial风格名称 string getModelsPascialName(string source) { string[] s=source.Split('_'); for(int i=0;i<s.Length;i++) { string s1=s[i].Substring(0,1).ToUpper(); string s2=s[i].Substring(1); s[i]=string.Concat(s1,s2); } string result=string.Empty; for(int i=1;i<s.Length;i++) { result=string.Concat(result,s[i]); } return result; } #> <#+ //失掉类的Camel风格名称 string getModelsCamelName(string source) { string[] s=source.Split('_'); for(int i=0;i<s.Length;i++) { string s1=s[i].Substring(0,1).ToUpper(); string s2=s[i].Substring(1); s[i]=string.Concat(s1,s2); } string result=string.Empty; for(int i=1;i<s.Length;i++) { result=string.Concat(result,s[i]); } string s11=result.Substring(0,1).ToLower(); string s12=result.Substring(1); return string.Concat(s11,s12); } #> <#+ //失掉属性的Pascial风格名称 string getPropertyPascialName(string source) { string[] s=source.Split('_'); for(int i=0;i<s.Length;i++) { string s1=s[i].Substring(0,1).ToUpper(); string s2=s[i].Substring(1); s[i]=string.Concat(s1,s2); } return string.Concat(s); } //失掉属性的Camel风格名称 string getPropertyCamelName(string source) { string[] s=source.Split('_'); for(int i=0;i<s.Length;i++) { string s1=s[i].Substring(0,1).ToUpper(); string s2=s[i].Substring(1); s[i]=string.Concat(s1,s2); } string result=string.Concat(s); string s11=result.Substring(0,1).ToLower(); string s12=result.Substring(1); return string.Concat(s11,s12); } //数据类型转换 string getPropertyType(string source) { string result=string.Empty; if (source=="int") result="Integer"; if (source=="integer") result="Integer"; if (source=="Integer") result="Integer"; if (source=="byte") result="Integer"; if (source=="sbyte") result="Integer"; if (source=="bool") result="Integer"; if (source=="Int16") result="Integer"; if (source=="short") result="Integer"; if (source=="Int32") result="Integer"; if (source=="Nullable<int>") result="Integer"; if (source=="Nullable<integer>") result="Integer"; if (source=="Nullable<Integer>") result="Integer"; if (source=="Nullable<byte>") result="Integer"; if (source=="Nullable<sbyte>") result="Integer"; if (source=="Nullable<bool>") result="Integer"; if (source=="Nullable<boolean>") result="Integer"; if (source=="Nullable<Int16>") result="Integer"; if (source=="Nullable<short>") result="Integer"; if (source=="Nullable<Int32>") result="Integer"; if (source=="Int64") result="Long"; if (source=="long") result="Long"; if (source=="Long") result="Long"; if (source=="Nullable<Int64>") result="Long"; if (source=="Nullable<long>") result="Long"; if (source=="Nullable<Long>") result="Long"; if (source=="float") result="Double"; if (source=="Float") result="Double"; if (source=="decimal") result="Double"; if (source=="Decimal") result="Double"; if (source=="Nullable<float>") result="Double"; if (source=="Nullable<Float>") result="Double"; if (source=="Nullable<decimal>") result="Double"; if (source=="Nullable<Decimal>") result="Double"; if (source=="byte[]") result="byte[]"; if (source=="string") result="String"; if (source=="String") result="String"; if (source=="System.Date") result="String"; if (source=="System.Time") result="String"; if (source=="System.DateTime") result="String"; if (source=="Nullable<System.Date>") result="String"; if (source=="Nullable<System.Time>") result="String"; if (source=="Nullable<System.DateTime>") result="String"; return result; } #>

    把下面模版拷贝到JavaModels.tt中,保存,没有报错就会在“解决方案资源管理器”看到JavaModels.tt下生成了各个model;报错,那么就是EDMX项目添加的时候没有注意框架选择,把EDMX项目删除,按照图3-1的款式建立EDMX,再建立ADO.NET实体数据模型就可以。

       

    模版说明:

 一、标签符号说明

        1、标签现实只有一种,以<#开始,以#>结束。然后停止扩展,在<#开始再添加运算符就实现了不同的扩展。

         2、<#@.....#>,表示引用说明。基本是死的,不必记着,每次拷贝就行,其实望文就能买卖。

         3、<#=tttt#>,表示取ttt的值。ttt,可以是一个变量,也可以是一个方法。

         4、<#+  ....#>,表示定义一个或一些方法。

         注意:标签不支撑嵌套。多读几个模版,你就明白了。

    二、模版结构

          1、模版基本由三个部份构成:引用部份,输入文件部份,大众方法部份。

          2、引用部份,除ADO.NET实体数据模型文件string inputFile = @"..\EDMX\dblxh.edmx";须要修改外,其余基本不必修改。

          3、输出文件部份,由于输出文件的不一致,基本都须要修改。

          4、大众部份,须要多少就写,只要会java,c++的,都可以编写,它基本参照c++的语法。

    三、模版语法

        1、模版语法,是标准的C#语法,包括Linq的Lamada。lambda,java马上也支撑,非常简略。

              例如:

              A、entity.Properties.Where(p => p.TypeUsage.EdmType is PrimitiveType && p.DeclaringType == entity)

                    表示对象entity集合查询出满意Properties.TypeUsage.EdmType is PrimitiveType且Properties.DeclaringType == entity的子集。

                     在EF模版中,这个表达式是查询出实体类的本来属性。

             B、ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name)

                   表示对集合按照name排序.在EF中,表示获得所有的实体类且按名称排序。

         2、标签符号内的内容,不输出到文件,其余的按照次序依次输出。把下面的javamodels.tt文件和输出的XXXX.java文件比较,就明白。

                       

    

    

文章结束给大家分享下程序员的一些笑话语录: IBM和波音777
  波音777是有史以来第一架完全在电脑虚拟现实中设计制造的飞机,所用的设备完全由IBM公司所提供。试飞前,波音公司的总裁非常热情的邀请IBM的技术主管去参加试飞,可那位主管却说道:“啊,非常荣幸,可惜那天是我妻子的生日,So..”..
  波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”

--------------------------------- 原创文章 By
属性和名称
---------------------------------

相关文章:

  • 如何使用PHP计算上一个月的今天
  • HTML5基本元素
  • 没有学位,他通过以下四步进入Google
  • Linux 重要操作
  • 分享职场心得《3》
  • Microsoft Deployment Toolkit 2010 (MDT)下载地址
  • COBIT5给企业带来什么样的价值
  • Citrix Xenserver 6 安装注册激活步骤
  • Cent OS 6.4 虚拟机安装实践(一)基本安装
  • Struts验证框架的使用
  • 下大雨了
  • MVC和MVVM杂谈
  • 与公务员斗争维权的实战攻略
  • Exadata VM CELL 上添加新磁盘--扩充空间
  • 倾情奉献 博客园博客下载工具 完美下载所有博客 保存格式为DOC,PDF,EPUB,XPS...
  • [PHP内核探索]PHP中的哈希表
  • .pyc 想到的一些问题
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • Docker 笔记(2):Dockerfile
  • Java超时控制的实现
  • java正则表式的使用
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • node.js
  • node-glob通配符
  • Octave 入门
  • Shell编程
  • Vue 重置组件到初始状态
  • 程序员该如何有效的找工作?
  • 第2章 网络文档
  • 解析带emoji和链接的聊天系统消息
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 使用docker-compose进行多节点部署
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 昨天1024程序员节,我故意写了个死循环~
  • ​Linux·i2c驱动架构​
  • ​第20课 在Android Native开发中加入新的C++类
  • ​渐进式Web应用PWA的未来
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #NOIP 2014#Day.2 T3 解方程
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (13)Hive调优——动态分区导致的小文件问题
  • (二)hibernate配置管理
  • (二)springcloud实战之config配置中心
  • (二)windows配置JDK环境
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转载)Linux网络编程入门
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net IOC框架入门之一 Unity
  • .Net Winform开发笔记(一)
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装