最近工作电脑装完win10后,之前使用的codeSmith安装不了,索性自己写一个。

界面比较简单,如下图:

第一行为Oracle数据库的连接字符串。连接成功后,填充表到第4行的下拉列表中。

第二行为实体类命名空间。

第三行为保存生成类、xml文件选择文件夹。

 private void btnConnect_Click(object sender, RoutedEventArgs e)
{
try
{
using (OracleConnection conn = new OracleConnection())
{
conn.ConnectionString = txtConnStr.Text; using (OracleCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select distinct table_name from user_tables order by table_name"; DataTable dt = new DataTable(); OracleDataAdapter adapter = new OracleDataAdapter();
adapter.SelectCommand = cmd; adapter.Fill(dt); cbTables.DisplayMemberPath = "TABLE_NAME";
cbTables.SelectedValuePath = "TABLE_NAME";
cbTables.ItemsSource = dt.DefaultView; } MessageBoxShow("连接成功!"); }
}
catch
{
MessageBoxShow("连接失败!");
}
}

测试连接按钮事件

 private void btnChoseDirectory_Click(object sender, RoutedEventArgs e)
{
FolderBrowserDialog folderDialog = new FolderBrowserDialog();
DialogResult dialogResult = folderDialog.ShowDialog(); if (dialogResult == System.Windows.Forms.DialogResult.OK)
{
labDirectoryPath.Content = folderDialog.SelectedPath.Trim();
}
}

选择文件夹按钮事件

 private void btnSave_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(txtEntityClassNamespace.Text.Trim()))
{
MessageBoxShow("请输入实体命名空间名称!");
txtEntityClassNamespace.Focus();
return;
}
if (labDirectoryPath.Content == null)
{
MessageBoxShow("请选择文件夹保存生成文件!");
btnChoseDirectory.Focus();
return;
}
if (cbTables.SelectedValue == null)
{
MessageBoxShow("请选择表名!");
return;
} DataTable dt = GetTableSchemaByTableName(); GenerateClass(dt); GenerateMappingXml(dt); MessageBoxShow("生成成功!");
} private string OracleTypeToCSType(string oracleType)
{
string csType = string.Empty; switch (oracleType.ToUpper())
{
case "NVARCHAR2":
case "VARCHAR2":
case "CHAR":
csType = "string";
break;
case "LONG":
csType = "long";
break;
case "NUMBER":
csType = "int";
break;
case "DATE":
csType = "datetime";
break;
} return csType;
} private DataTable GetTableSchemaByTableName()
{
string selectSQL = @"select t1.COLUMN_NAME,t1.data_type,t1.data_length,t1.nullable,t2.comments,
replace(initcap(t1.TABLE_NAME),'_','') className
from user_tab_columns t1 left
join user_col_comments t2
on t1.TABLE_NAME = t2.table_name and t1.COLUMN_NAME = t2.column_name
where t1.table_name = :table_name
order by to_number(t1.column_id)"; DataTable dt = new DataTable();
using (OracleConnection conn = new OracleConnection())
{
conn.ConnectionString = txtConnStr.Text; using (OracleCommand cmd = conn.CreateCommand())
{
cmd.CommandText = selectSQL;
cmd.Parameters.Add(new OracleParameter(":table_name", cbTables.SelectedValue)); OracleDataAdapter adapter = new OracleDataAdapter();
adapter.SelectCommand = cmd; adapter.Fill(dt);
}
} return dt;
} private void GenerateClass(DataTable dt)
{
string entityClassNamespace = txtEntityClassNamespace.Text;
if (dt.Rows.Count > )
{
string className = dt.Rows[]["className"].ToString(); using (FileStream csStream = new FileStream(System.IO.Path.Combine(labDirectoryPath.Content.ToString(), className + ".cs"), FileMode.Create, FileAccess.Write))
{
using (StreamWriter writer = new StreamWriter(csStream, Encoding.Default))
{
writer.WriteLine(string.Format("namespace {0}", entityClassNamespace)); writer.WriteLine("{");
writer.WriteLine(string.Format(@" public class {0} : BaseModel
{{", className));
for (int i = ; i < dt.Rows.Count; i++)
{
writer.WriteLine(string.Format(@" /// <summary>
/// {0}
/// </summary>", dt.Rows[i]["comments"].ToString()));
writer.WriteLine(string.Format(" public virtual {0} {1} {{ set; get; }}",
OracleTypeToCSType(dt.Rows[i]["data_type"].ToString()),
dt.Rows[i]["COLUMN_NAME"].ToString()));
writer.WriteLine();
}
writer.WriteLine(" }");
writer.WriteLine("}");
}
} }
} private void GenerateMappingXml(DataTable dt)
{
string entityClassNamespace = txtEntityClassNamespace.Text;
if (dt.Rows.Count > )
{
string className = dt.Rows[]["className"].ToString(); XNamespace xmlns = "urn:nhibernate-mapping-2.2"; var xDoc = new XDocument(new XElement(xmlns + "hibernate-mapping",
new XElement(xmlns + "class",
new XAttribute("name", string.Format("{0}.{1},{0}", entityClassNamespace, className)),
new XAttribute("table", cbTables.SelectedValue),
new XAttribute("lazy", "true"),
new XElement(xmlns + "id",
new XAttribute("column", "ID"),
new XAttribute("name", "ID"),
new XElement(xmlns + "generator",
new XAttribute("class", "sequence"),
new XElement(xmlns + "param",
new XAttribute("name", "sequence"),
new XText(string.Format("SEQ_{0}", cbTables.SelectedValue))
)))))); XElement _class = xDoc.Root.Element(xmlns + "class"); for (int i = ; i < dt.Rows.Count; i++)
{
string columnName = dt.Rows[i]["COLUMN_NAME"].ToString(); XElement property = new XElement(xmlns + "property");
property.SetAttributeValue("name", columnName);
property.SetAttributeValue("column", columnName); _class.Add(property);
} xDoc.Save(System.IO.Path.Combine(labDirectoryPath.Content.ToString(), className + ".hbm.xml"));
}
}

生成按钮事件

总结:

  1. 使用user_tables系统表查询用户所有表
  2. 使用user_tab_columns查询表的所有列
  3. 使用user_col_comments查询表的备注信息
  4. 使用文件流生成实体类,使用Linq to xml生成*.hbm.xml文件

NHibernate生成实体类、xml映射文件的更多相关文章

  1. Eclipse使用hibernate插件反向生成实体类和映射文件

    一般dao层的开发是这样的,先进行数据库的设计,什么E-R图之类的那些,然后选择一款数据库产品,建好表.最后反向生成Java实体和映射文件,这样可以保证一致性和便捷性. 如果用myeclipse,逆向 ...

  2. Java的generator工具类,数据库生成实体类和映射文件

    首先需要几个jar包: freemarker-2.3.23.jar log4j-1.2.16.jar mybatis-3.2.3.jar mybatis-generator-core-1.3.2.ja ...

  3. 使用eclipse插件mybatis generator来自动生成实体类及映射文件

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...

  4. 反向生成hibernate实体类和映射文件

    工欲善其事,必先利其器.我们可以使用IDE来根据数据库中的表反向生成实体类和映射文件,虽然这些东西手写也并不是难度很大,但是如果存在大量的简单工作需要我们做,也会显得很麻烦. 写在前面 我们反向生成的 ...

  5. Eclipse从数据库逆向生成Hibernate实体类和映射文件(Eclipse插件系列之HibernateTools)

    ♣下载安装Eclipse插件(HibernateTools) ♣Eclipse连接数据库(Mysql5.7) ♣新建hibernate.properties和hibernate.cfg.xml文件 ♣ ...

  6. mybatis根据表逆向自动化生成代码(自动生成实体类、mapper文件、mapper.xml文件)

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  7. java web(七): mybatis的动态sql和mybatis generator自动生成pojo类和映射文件

    前言: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据 不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...

  8. MyBatis 逆向工程——根据数据表自动生成model、xml映射文件、mapper接口

    MyBatis Generator(MBG)的使用 MBG可以根据数据表生成对应的model.xml映射文件.mapper接口,只是简单的生成,还需要根据需求修改. 1.下载jar包 https:// ...

  9. SSM_CRUD新手练习(4)修改生成的mapper.xml映射文件

    我们为什么要修改呢,这是因为我们查询的时候,我们有时候需要连表查询,例如我们需要查询出员工表的信息(emp_id,emp_name...)与此同时,我们还想查询出该员工所在的部门(dept_name) ...

随机推荐

  1. C++11 并发指南七(C++11 内存模型一:介绍)

    第六章主要介绍了 C++11 中的原子类型及其相关的API,原子类型的大多数 API 都需要程序员提供一个 std::memory_order(可译为内存序,访存顺序) 的枚举类型值作为参数,比如:a ...

  2. AnguarJS 第二天----数据绑定

    Terms 今天学习AngularJS双向数据绑定的特性,这里面需要提到两个概念: 数据模型:数据模型是指 $scope对象, $scope对象是简单的javascript对象,视图可以访问其中的属性 ...

  3. 在Github上搭建自己的博客(Windows平台)

    折腾了好久,终于在Github上搭建了自己的博客.这里面总结一下过程希望对大家能有所帮助. Github建博优缺点 和 csdn,新浪,网易相比,在Github上可以自己实现功能 和阿里云,VPS相比 ...

  4. [ASP.NET MVC 小牛之路]14 - Unobtrusive Ajax

    Ajax (Asynchronous JavaScript and XML 的缩写),如我们所见,这个概念的重点已经不再是XML部分,而是 Asynchronous 部分,它是在后台从服务器请求数据的 ...

  5. WCF服务的异常消息

    原创地址:http://www.cnblogs.com/jfzhu/p/4055024.html 转载请注明出处 WCF Service发生异常的时候,客户端一般只能看见这样一个错误:“The ser ...

  6. C#4语法

    在C# 4.0中可以通过委托某个成员的实现来实现一个接口,例如下面的代码: public class Foo : IList { private List _Collection implements ...

  7. Sqoop切分数据的思想概况

    Sqoop通过--split-by指定切分的字段,--m设置mapper的数量.通过这两个参数分解生成m个where子句,进行分段查询.因此sqoop的split可以理解为where子句的切分. 第一 ...

  8. EditText的小细节

    EditText获取焦点时,右边图片的改变例如: <item android:state_window_focused="false" android:drawable=&q ...

  9. python的shutil模块

    shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作 1.复制文件 def copy(src, dst): """Co ...

  10. SSRS 报表点击 Preview 显示失败

    今天使用Remote Desktop 链接到Remote Server,在SSDT中创建一个RDL文件,点击PreView预览时,出现以下错误信息 查看details information ==== ...