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) ...
随机推荐
- Microsoft Azure Web Sites应用与实践【3】—— 通过Visual Studio Online在线编辑Microsoft Azure 网站
Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...
- WPF RichTextBox 做内容展示框 滚动条控制判定是否阅读完成
一.项目背景: 最近,做项目,因为是金融项目,客户登录交易的时候,有一个提示框,就是告知客户要“入市需谨慎”等等,想必大家都遇到这样的场景,当然,这种提示是没人会看的,不过作为交易所,这样的提示又必不 ...
- (转)webHttpBinding、basicHttpBinding和wsHttpBinding区别
(1)webHttpBinding与basicHttpBinding / wsHttpBinding的区别: webHttpBinding is the REST-style binding, w ...
- 【VC++技术杂谈008】使用zlib解压zip压缩文件
最近因为项目的需要,要对zip压缩文件进行批量解压.在网上查阅了相关的资料后,最终使用zlib开源库实现了该功能.本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解 ...
- linux java so 历险
一开始 -bash-4.1# java -cp "/usr/linkapp/bin/tomcat-master/webapps/ROOT/WEB-INF/lib/*":" ...
- iOS-调试技巧
目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印的艺术 NSLog 开启僵尸对象 ...
- js中的块作用域
今天我们来一起研究下JavaScript中的变量作用域问题,话不多说,直接上代码. <script type="text/javascript"> (function( ...
- javascript的快速排序法
在排序方式中,快速是比较普遍使用的,因为其速度快. 因为其是不断的递归,而且是根据基准点的左右两边开始递归,直到数组只有一个值的时候才返回. 这个基准点是自己定的. 一般取中间,比较好理解. < ...
- 解密jQuery内核 Sizzle引擎筛选器 - 位置伪类(一)
本章开始分析过滤器,根据API的顺序来 主要涉及的知识点 jQuery的组成 pushStack方法的作用 sizzle伪类选择器 首页我们知道jQuery对象是一个数组对象 内部结构 jQuery的 ...
- C# 获取当前月第一天和最后一天 计算两个日期差多少天
获取当前月的第一天和最后一天 DateTime now = DateTime.Now; DateTime firstDay = ); DateTime lastDay = firstDay.AddMo ...