最近工作电脑装完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. Disruptor-NET和内存栅栏

    Disruptor-NET算法(是一种无锁算法)需要我们自己实现某一种特定的内存操作的语义以保证算法的正确性.这时我们就需要显式的使用一些指令来控制内存操作指令的顺序以及其可见性定义.这种指令称为内存 ...

  2. ABP理论学习之NHibernate集成

    返回总目录 本篇目录 Nuget包 配置 实体映射 仓储 仓储基类 实现仓储 自定义仓储方法 阅读其他 ABP可以使用任何ORM框架工作,并且已经内置了NHibernate集成.这篇文章会解释如何在A ...

  3. 【安装PHP】如何在openSUSE42.1下编译安装PHP7

    首先推荐一篇文章PHP 7 Release Date Arrived: Will Developers Adopt PHP 7? - PHP Classes blog. 里面说到是否会去使用PHP7, ...

  4. NodeJs 开发微信公众号(一)准备工作

    前言 大概是一个月前,自己用业余时间做了一个微信公众号.微信开发,尤其是对后台不熟悉的人来说显得尤其困难.首先要克服的是后台语言(nodejs)的一些不熟悉困难,其次,也是最大的一点困难是在跟微信交互 ...

  5. Java NIO4:Socket通道

    Socket通道 上文讲述了通道.文件通道,这篇文章来讲述一下Socket通道,Socket通道与文件通道有着不一样的特征,分三点说: 1.NIO的Socket通道类可以运行于非阻塞模式并且是可选择的 ...

  6. Hadoop学习笔记—7.计数器与自定义计数器

    一.Hadoop中的计数器 计数器:计数器是用来记录job的执行进度和状态的.它的作用可以理解为日志.我们通常可以在程序的某个位置插入计数器,用来记录数据或者进度的变化情况,它比日志更便利进行分析. ...

  7. ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步

    一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...

  8. Mint Linux 安装 DotnetCore 遭遇无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系

    evlon@evlon-ThinkPad-T530 ~ $ apt install dotnet-dev-1.0.0-preview2-003121 正在读取软件包列表... 完成 正在分析软件包的依 ...

  9. 30个你必须记住的CSS选择符

    所以你学会了基础的id,类和后代选择符,然后你就一直用它们了吗?如果是这样,你丢失了(css的)巨大的灵活性.在本文中提到的很多选择器属于CSS3规范的一部分,因此,只有在现代浏览器中才可使用. 1. ...

  10. SpringMVC常用的注解

    1. @Controller @Controller用于标识控制层主键,负责注册一个bean到spring上下文,bean的ID默认为首字母小写的类名称,用户也可以自定义. 例如: 方式一:  @Co ...