NHibernate生成实体类、xml映射文件
最近工作电脑装完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"));
}
}
生成按钮事件
总结:
- 使用user_tables系统表查询用户所有表
- 使用user_tab_columns查询表的所有列
- 使用user_col_comments查询表的备注信息
- 使用文件流生成实体类,使用Linq to xml生成*.hbm.xml文件
NHibernate生成实体类、xml映射文件的更多相关文章
- Eclipse使用hibernate插件反向生成实体类和映射文件
一般dao层的开发是这样的,先进行数据库的设计,什么E-R图之类的那些,然后选择一款数据库产品,建好表.最后反向生成Java实体和映射文件,这样可以保证一致性和便捷性. 如果用myeclipse,逆向 ...
- 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 ...
- 使用eclipse插件mybatis generator来自动生成实体类及映射文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...
- 反向生成hibernate实体类和映射文件
工欲善其事,必先利其器.我们可以使用IDE来根据数据库中的表反向生成实体类和映射文件,虽然这些东西手写也并不是难度很大,但是如果存在大量的简单工作需要我们做,也会显得很麻烦. 写在前面 我们反向生成的 ...
- Eclipse从数据库逆向生成Hibernate实体类和映射文件(Eclipse插件系列之HibernateTools)
♣下载安装Eclipse插件(HibernateTools) ♣Eclipse连接数据库(Mysql5.7) ♣新建hibernate.properties和hibernate.cfg.xml文件 ♣ ...
- mybatis根据表逆向自动化生成代码(自动生成实体类、mapper文件、mapper.xml文件)
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- java web(七): mybatis的动态sql和mybatis generator自动生成pojo类和映射文件
前言: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据 不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...
- MyBatis 逆向工程——根据数据表自动生成model、xml映射文件、mapper接口
MyBatis Generator(MBG)的使用 MBG可以根据数据表生成对应的model.xml映射文件.mapper接口,只是简单的生成,还需要根据需求修改. 1.下载jar包 https:// ...
- SSM_CRUD新手练习(4)修改生成的mapper.xml映射文件
我们为什么要修改呢,这是因为我们查询的时候,我们有时候需要连表查询,例如我们需要查询出员工表的信息(emp_id,emp_name...)与此同时,我们还想查询出该员工所在的部门(dept_name) ...
随机推荐
- 基于腾讯手Q样式规范Frozen UI
Frozen UI是一个开源的简单易用,轻量快捷的移动端UI框架.基于手Q样式规范,选取最常用的组件,做成公用离线包减少请求,升级方式友好,文档完善,目前全面应用在腾讯手Q增值业务中. css组件包括 ...
- 微软发布TX(LINQ To Logs And Traces)
微软开源技术公司于发布了Tx,这是一个Apache 2协议的开源项目,可以使用日志/跟踪文件辅助调试,以及创建实时监控和告警系统. 下面是几个引人关注的功能-- 允许在原始事件源上使用LINQ 允许在 ...
- Javascript基础回顾 之(一) 类型
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- 从Undo,Redo谈命令模式
一般的应用软件中,通常会提供Redo和Undo的操作,比如Paint.NET中的动作面板,Word中的撤销重做,一般我们按Ctrl-Z即可回退到上次操作. 要实现上面的这一功能,最直观的想法就是,我们 ...
- 如何在没有域的环境中搭建AlwaysOn(二)
对DBA而言,不需要域就可以搭建SQL Server AlwaysOn是Windows Server 2016中最令人兴奋的功能了,它不仅可以降低搭建的成本,而且还减少了部署和运维的工作量. 上篇博客 ...
- Web3DGame之路(三)分析babylonjs
BabylonJS的例子十分详实 http://doc.babylonjs.com/tutorials Babylonjs的学习比较顺畅,开始做一些深入分析 一.语言选择 首先是js还是ts的问题 ...
- static与并发
在java中static用来修饰Class类中属性和方法. 被static修饰的成员属性和成员方法独立于该类的任何对象,它们在内存空间上会被放在描述Class的位置中,也就是说它们为此类(Class) ...
- enum操作--获取枚举里的最大值
一个应用系统,如果程序里没有任何enum的使用,我认为它的可读性是有待商榷的. 求枚举里的最大/最小枚举值, 其实是对Array进行操作: enum EnumTest { ddd = , eee } ...
- angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- testServe
angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope <- testSer ...
- 使用Java纯代码实现MySQL的连接
建立数据库 1. 点击连接-->MySQL: 输入连接名 . 主机名/IP地址 .端口 .用户名.密码(没有密码就省略),然后点击确定,建立的表格是灰色表示关闭状态,双击开启 2. 重新创建 ...