比较Hibernate和ADO.net 2.0,问?Hibernate还有什么特性更值得期待?

简介:

本文通过比较Hibernate3.0ADO.net 2.0对数据库存储过程的执行来比较两者的基本情况。

由于本人对Hibernate不熟悉,所有Hibernate代码均转载自http://java.e800.com.cn/articles/2007/515/1179165860296629767_1.html

如果有任何不恰当的地方请多多指教

本文的目的是

如果Nhibernate没有其它的过人之处,在.net环境下要他干嘛呢?

主要还是更针对在.net环境下的NHibernate

微软的ADO.net有着良好的结构。看见很多人在研究ORM。由于对具体的ORM产品没有过多了解,因此感觉这些产品存在的意义似乎不大?

下面表格的比较,试图说明,ADO本身也已经支持对象持久化。如果仅仅是单独一个对象对应一个表或者一行数据,似乎根本不需要使用任何的ORM产品

如果我的论断是对的,那么很多ORM可以洗洗睡了。园子里的某些“兴趣组”也可以关门了

-----------------------------------------------------------------
2007-09-14 14:06 henry
多体验一下NHibernate的对象化操作,而不是简单对象添加,删除和查询.
-----------------------------------------------------------------

我觉得在微软的Linq里面非常强大得可以对对象进行各种操作。自然,在没有Linq支持的地方可能NHibernate的作用能够体现出来一些。算是本贴的第一个成果。

那么,在完全支持Linq的地方NHibernate就没有用处了吧?


------------------------------------------------------------------
2007-09-14 17:11 henry

到底现在Linq是不是真的利害到可以扼杀一切还没有定断,我看来现版本的Linq在数据操远达到SQL优雅高效,唯的好处就是借助于编译器实现检测(不 过的确可以节省很大调试成本,但对于其编写简洁性有所保留),如果编译器直接直入SQL并根据查询返回动太对象类型那这个时候Linq就走一边去了.任何 事物都在发展的别看了一个东西有些甜头就把别东西看成一坨屎......
-------------------------------------------------------------------

恩,那么本主题的最后结论可能是这样的:
不考虑Linq、ADO3.0等未来的变化
目前ADO.net2.0完全可以胜任将数据表映射成对象的操作,以及提供对象间的关系操作
但是NHibernet扩展了强大的面向对象的数据操作性能,可以让程序员方便得以对象的方式进行很多操作,而不用去关心数据库访问的细节。这个是ADO.net不能做到的

因此如果有人不好好学习NHibernate
仅仅拿来做做增删改查
那么最好不要到处跟人家说,俺项目里用了NHibernate
因为丢人家NHibernate的脸


步骤

作用

Hibernate

ADO.net 2.0

数据源连接配置

设定连接到什么数据据库以及具体的连接参数

所在文件:hibernate的配置文件

<property name="connection.url">jdbc:mysql://localhost:3306/test</property>

   <property name="connection.username">root</property>

   <property name="connection.password">root</property>

   <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

   <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

所在文件:app.config

<configuration>

    <configSections>

    </configSections>

    <connectionStrings>

        <add name="WindowsApplication1.Properties.Settings.TestConnectionString"

            connectionString="Data Source=."SQLEXPRESS;AttachDbFilename=|DataDirectory|"Test.mdf;Integrated Security=True;User Instance=True"

            providerName="System.Data.SqlClient" />

    </connectionStrings>

</configuration>

实体类

所谓ORM里面程序中使用到的业务对象类

所在文件:User.java

public class User implements java.io.Serializable {

private static final long serialVersionUID = 1L;

/** 用户id*/

private String userid;

/** 用户姓名*/

private String name;

/** 用户blog*/

private String blog;

//省略get/set方法

}

所在文件:TestDataSet.Designer.cs

        /// <summary>

        ///Represents strongly named DataRow class.

        ///</summary>

        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "2.0.0.0")]

        public partial class tbl_userRow : global::System.Data.DataRow {

            private tbl_userDataTable tabletbl_user;

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

            internal tbl_userRow(global::System.Data.DataRowBuilder rb) :

                    base(rb) {

                this.tabletbl_user = ((tbl_userDataTable)(this.Table));

            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

            public string userid {

                get {

                    return ((string)(this[this.tabletbl_user.useridColumn]));

                }

                set {

                    this[this.tabletbl_user.useridColumn] = value;

                }

            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

            public string name {

                get {

                    try {

                        return ((string)(this[this.tabletbl_user.nameColumn]));

                    }

                    catch (global::System.InvalidCastException e) {

                        throw new global::System.Data.StrongTypingException("表“tbl_user”中列“name”的值为 DBNull", e);

                    }

                }

                set {

                    this[this.tabletbl_user.nameColumn] = value;

                }

            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

            public string blog {

                get {

                    try {

                        return ((string)(this[this.tabletbl_user.blogColumn]));

                    }

                    catch (global::System.InvalidCastException e) {

                        throw new global::System.Data.StrongTypingException("表“tbl_user”中列“blog”的值为 DBNull", e);

                    }

                }

                set {

                    this[this.tabletbl_user.blogColumn] = value;

                }

            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

            public bool IsnameNull() {

                return this.IsNull(this.tabletbl_user.nameColumn);

            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

            public void SetnameNull() {

                this[this.tabletbl_user.nameColumn] = global::System.Convert.DBNull;

            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

            public bool IsblogNull() {

                return this.IsNull(this.tabletbl_user.blogColumn);

            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

            public void SetblogNull() {

                this[this.tabletbl_user.blogColumn] = global::System.Convert.DBNull;

            }

        }

映射关系

指定在程序中使用的实体类与数据库中实际表以及列之间的关联关系

所在文件:User.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.amigo.proc.model">

    <class name="User" table="tbl_user">

        <id name="userid" column="userid">

            <generator class="assigned"/>

        </id>

        <property name="name" column="name" type="string" />

        <property name="blog" column="blog" type="string" />

    </class>

    <sql-query name="getUserList" callable="true">

 <return alias="user" class="User">

   <return-property name="userid" column="userid"/>

   <return-property name="name" column="name"/>

   <return-property name="blog" column="blog" />

 </return>

 {call getUserList()}

 </sql-query>

</hibernate-mapping>

所在文件:TestDataSet.Designer.cs

global::System.Data.Common.DataTableMapping tableMapping = new global::System.Data.Common.DataTableMapping();

            tableMapping.SourceTable = "Table";

            tableMapping.DataSetTable = "tbl_user";

            tableMapping.ColumnMappings.Add("userid", "userid");

            tableMapping.ColumnMappings.Add("name", "name");

            tableMapping.ColumnMappings.Add("blog", "blog");

…………

private void InitCommandCollection() {

            this._commandCollection = new global::System.Data.SqlClient.SqlCommand[1];

            this._commandCollection[0] = new global::System.Data.SqlClient.SqlCommand();

            this._commandCollection[0].Connection = this.Connection;

            this._commandCollection[0].CommandText = "dbo.getUserList";

            this._commandCollection[0].CommandType = global::System.Data.CommandType.StoredProcedure;

            this._commandCollection[0].Parameters.Add(new global::System.Data.SqlClient.SqlParameter("@RETURN_VALUE", global::System.Data.SqlDbType.Variant, 0, global::System.Data.ParameterDirection.ReturnValue, 0, 0, null, global::System.Data.DataRowVersion.Current, false, null, "", "", ""));

        }

其它存储过程省略……

查询


// 测试实现查询的存储过程

 private void testProcQuery(Session session) throws Exception ...{

 //查询用户列表

        List list = session.getNamedQuery("getUserList").list();

        for (int i = 0; i < list.size(); i++) ...{

            User user = (User) list.get(i);

            System.out.print("序号: " + (i+1));

            System.out.print(", userid: " + user.getUserid());

            System.out.print(", name: " + user.getName());

            System.out.println(", blog: " + user.getBlog());

        }

 }

private void testProcQuery()
        {
            //定义用户类集合
            TestDataSet.tbl_userDataTable Users = new TestDataSet.tbl_userDataTable();
            //获得数据
            this.tbl_userTableAdapter1.Fill(Users);
            int i = 0;
            //显示内容
            foreach(TestDataSet.tbl_userRow User in Users)
            {
                System.Console.WriteLine(string.Concat("序号:", i++, ",用户ID:", User.userid, ",用户姓名:", User.name, ",Blog:", User.blog));
            }
        }

更新


/**//**

 * 测试实现更新的存储过程

 * @throws Exception

 */

 private void testProcUpdate(Session session) throws Exception ...{

 //更新用户信息

 Transaction tx = session.beginTransaction();

        Connection con = session.connection();

        String procedure = "{call updateUser(?, ?, ?)}";

        CallableStatement cstmt = con.prepareCall(procedure);

        cstmt.setString(1, "xx");

        cstmt.setString(2, "http://www.blogjava.net/sterningChen");

        cstmt.setString(3, "sterning");

        cstmt.executeUpdate();

        tx.commit();

 }

private void testProcUpdate()
        {
            //类似Java的写法
            this.tbl_userTableAdapter1.Update("newID", "陈xx", "http://www.blogjava.net/sterningChen");

            //使用业务对象的写法
            //GetUsserByUserID是另一个因存储过程而产生的方法,自动生成的,以下同
            TestDataSet.tbl_userRow user = this.tbl_userTableAdapter1.GetUserByUserID("NewUserID")[0];
            user.name = "newName";
            user.blog = "newBlog";
            this.tbl_userTableAdapter1.Update(user);
        }

插入


// 测试实现插入的存储过程

 private void testProcInsert(Session session) throws Exception ...{

 //创建用户信息

 session.beginTransaction();

        PreparedStatement st = session.connection().prepareStatement("{call

createUser(?, ?, ?)}");

        st.setString(1, "amigo");

        st.setString(2, "阿蜜果");

        st.setString(3, "http://www.wblogjava.net/amigoxie");

        st.execute();

        session.getTransaction().commit();

 }

private void testProcInsert()
        {
            //直接使用数据
            this.tbl_userTableAdapter1.Insert("newID", "newName", "newBlog");  
            //使用面向对象
            TestDataSet.tbl_userDataTable tb = new TestDataSet.tbl_userDataTable();
            TestDataSet.tbl_userRow user = tb.Newtbl_userRow();
            user.userid = "NewUserID";
            user.name = "NewUser";
            user.blog = "testBlog";
            tb.Addtbl_userRow(user) ;
            this.tbl_userTableAdapter1.Update(user);  
        }


// 测试实现删除的存储过程

 private void testProcDelete(Session session) throws Exception ...{

 //删除用户信息

 session.beginTransaction();

 PreparedStatement st = session.connection().prepareStatement("{call deleteUser

(?)}");

        st.setString(1, "amigo");

        st.execute();

        session.getTransaction().commit();

 }

 private void testProcDelete()
        {
            //直接使用UserID删除
            this.tbl_userTableAdapter1.Delete("newID");

            //面向对象的方法
            TestDataSet.tbl_userRow user = this.tbl_userTableAdapter1.GetUserByUserID("NewUserID")[0];
            user.Delete();
            this.tbl_userTableAdapter1.Update(user);  
        }





作者: 徐少侠
出处: http://www.cnblogs.com/Chinese-xu/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
如有问题,可以通过 Chinese_Xu@126.com 联系我,非常感谢。

分享家:Addthis中文版

本文转自徐少侠博客园博客,原文链接:http://www.cnblogs.com/Chinese-xu/archive/2007/09/14/892821.html,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
115 4
|
21天前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
30 1
|
1月前
|
存储 编译器
.Net特性Attribute的高级使用
【10月更文挑战第14天】在.NET中,特性(Attribute)是一种强大的机制,用于在代码中添加元数据。本文介绍了特性的高级用法,包括自定义特性、通过反射读取特性、条件编译与特性结合、多个特性应用以及特性继承。通过示例展示了如何创建自定义特性类、应用自定义特性,并通过反射获取特性信息。此外,还介绍了如何利用条件编译符号实现不同版本的代码控制,以及如何在一个代码元素上应用多个特性。最后,探讨了如何通过`AttributeUsage`控制特性的继承行为。
|
3月前
|
数据采集 API 开发者
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
在.NET 8中,通过`ConfigurePrimaryHttpMessageHandler`方法,开发者能更精细地控制HTTP请求,这对于构建高效爬虫尤为重要。此特性支持定制代理IP、管理Cookie与User-Agent,结合多线程技术,有效应对网络限制及提高数据采集效率。示例代码展示了如何设置代理服务器、模拟用户行为及并发请求,从而在遵守网站规则的同时,实现快速稳定的数据抓取。
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
|
3月前
|
JSON API C#
闲话 .NET(6):.NET Core 各个版本的特性
闲话 .NET(6):.NET Core 各个版本的特性
|
4月前
|
人工智能 开发框架 Devops
.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。
【7月更文挑战第4天】.NET技术概览:** 本文探讨了.NET的核心特性,包括多语言支持、Common Language Runtime、丰富的类库和跨平台能力,强调其在企业级、Web、移动及游戏开发中的应用。此外,讨论了.NET如何通过性能优化、DevOps集成、AI与ML支持以及开源策略应对未来挑战,为开发者提供强大工具,共创软件开发新篇章。
52 3
|
5月前
|
存储 编译器
【.NET Core】特性(Attribute)详解
【.NET Core】特性(Attribute)详解
299 2
|
6月前
|
机器学习/深度学习 存储 开发工具
【专栏】解读 .NET 技术的先进特性
【4月更文挑战第29天】.NET 技术推动各行业软件开发创新,提供高效开发环境(如Visual Studio)和跨平台能力(.NET Core),支持多语言和函数式编程。其生态系统繁荣,NuGet包含大量开源库。同时,.NET整合云服务(Azure)和机器学习(ML.NET),强化应用扩展性和智能处理,巩固其在现代开发中的关键角色。
39 0
|
6月前
|
开发框架 .NET Java
ASP.NET Core高级编程--C#基本特性(一)
本文章简略介绍C#的部分特性
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」