因为最近在做一些有关数据库方面的开发,其实,说白了,就是对数据库的CRUD操作,写了n多的存储过程,倒不是说存储过程多难,关键是在后期的维护方面有点头疼,没办法,研究一下ORM吧。

下面分别是用NHibernate和Linq实现的简单的CRUD操作,当是一开始的练练手(开关环境:VS08+SQL2000)。

①:NHibernate

不管三七二十一,先看看实体类吧。(数据库代码省略,映射文件对应着表结构)

代码

    public class User
    {
        #region 构造函数
        /// <summary>
        /// 用户信息
        /// </summary>
        public User() { }
        #endregion

#region 属性

private int userID;
        /// <summary>
        /// 用户ID
        /// </summary>
        public virtual int UserID
        {
            get
            {
                return userID;
            }
            set
            {
                userID = value;
            }
        }

private string userName;
        /// <summary>
        /// 用户姓名
        /// </summary>
        public virtual string UserName
        {
            get
            {
                return userName;
            }
            set
            {
                userName = value;
            }
        }

private string userPwd;
        /// <summary>
        /// 用户密码
        /// </summary>
        public virtual string UserPwd
        {
            get
            {
                return userPwd;
            }
            set
            {
                userPwd = value;
            }
        }

private int userAge;
        /// <summary>
        /// 用户年龄
        /// </summary>
        public virtual int UserAge
        {
            get
            {
                return userAge;
            }
            set
            {
                userAge = value;
            }
        }
        #endregion
    }

这里用的NHibernate是NHibernate-2.1.2.GA-bin,映射文件如下(注意映射文件中nh的版本号):

代码

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
  <class name="NHUser.User,NHUser" table="UserInfo"> //NHUser为命名空间、UserInfo为数据表名
    <id name="UserID" type="Int32" unsaved-value="null">
      <column name="UserID" length="4" sql-type="int" not-null="true" unique="true" index="PK_UserInfo"/>
      <generator class="native"/>
    </id>
    <property name="UserName" type="String">
      <column name="UserName" length="50" sql-type="nvarchar" not-null="false"/>
    </property>
    <property name="UserPwd" type="String">
      <column name="UserPwd" length="50" sql-type="nvarchar" not-null="false"/>
    </property>
    <property name="UserAge" type="Int32">
      <column name="UserAge" length="4" sql-type="int" />
    </property>
  </class>
</hibernate-mapping>

基本工作还剩下个配置文件hibernate.cfg.xml

代码

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">Server=localhost;uid=sa;pwd=123456;database=NunitUser;Integrated Security=SSPI</property>
    <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
    <property name="adonet.batch_size">100</property>
    <property name='proxyfactory.factory_class'>
      NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle
    </property>
    <mapping assembly="NHUser"/>
  </session-factory>
</hibernate-configuration>

OK!准备工作over了,下面看看CRUD的操作代码吧

代码

namespace NHUser
{
    public partial class NHCRUD : Form
    {
        public NHCRUD()
        {
            InitializeComponent();
        }

private void btnOK_Click(object sender, EventArgs e)
        {
            try
            {
                string username = this.tbUserName.Text.ToString();
                string userpwd = this.tbUserPwd.Text.ToString();
                int userage = Convert.ToInt32(this.tbUserAge.Text.ToString());

//定义配置文件
                Configuration cfg = new Configuration();
                cfg.Configure();

//创建会话工厂
                ISessionFactory factory = cfg.BuildSessionFactory();
                ISession session = factory.OpenSession();
                //用户赋值
                User user = new User();
                user.UserName = username;
                user.UserPwd = userpwd;
                user.UserAge = userage;

//开启事务
                ITransaction trans = session.BeginTransaction();
                try
                {
                    session.Save(user);

                    //Commit
                    trans.Commit();
                    MessageBox.Show("用户数据插入成功!", "系统提示!");
                    this.Close();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    MessageBox.Show("用户数据插入失败!" + ex.Message, "系统提示!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误提示!");
            }
        }

/// <summary>
        /// 查询指定数据
        /// </summary>
        private void btnRead_Click(object sender, EventArgs e)
        {
            //定义配置文件
            Configuration cfg = new Configuration();
            cfg.Configure();
            //创建会话工厂
            ISessionFactory factory = cfg.BuildSessionFactory();
            using (ISession session = factory.OpenSession())
            {
                IList users = session.CreateCriteria(typeof(User)).Add(Expression.Eq("UserName", "dukeyongwang")).List();

foreach (User user in users)
                {
                    Console.WriteLine("UserID:" + user.UserID + "——>UserName:" + user.UserName + "——>UserPwd:" + user.UserPwd + "——>UserAge:" + user.UserAge);
                }
            }
        }

/// <summary>
        /// 修改
        /// </summary>
        private void btnUpdate_Click(object sender, EventArgs e)
        {
            //定义配置文件
            Configuration cfg = new Configuration();
            cfg.Configure();
            //创建会话工厂
            ISessionFactory factory = cfg.BuildSessionFactory();

try
            {
                using (ISession session = factory.OpenSession())
                {
                    User user = session.Load(typeof(User), 5) as User;

Console.WriteLine("修改前==>>UserID:" + user.UserID + "——>UserName:" + user.UserName + "——>UserPwd:" + user.UserPwd + "——>UserAge:" + user.UserAge);

user.UserName = "dukeyongwang";
                    user.UserPwd = "dkwang";
                    user.UserAge = 25;

using (ITransaction trans = session.BeginTransaction())
                    {
                        session.Update(user, user.UserID);

User updateUser = session.Load(typeof(User), user.UserID) as User;

//修改后
                        Console.WriteLine("修改后==>>UserID:" + updateUser.UserID + "——>UserName:" + updateUser.UserName + "——>UserPwd:" + updateUser.UserPwd + "——>UserAge:" + updateUser.UserAge);

trans.Commit();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("修改时错误:" + ex.Message, "错误提示!");
            }
        }

/// <summary>
        /// 删除(可通过查询出来的实体对象,然后删除)
        /// </summary>
        private void btnDel_Click(object sender, EventArgs e)
        {
           //定义配置文件
            Configuration cfg = new Configuration();
           cfg.Configure();
           //创建会话工厂
            ISessionFactory factory = cfg.BuildSessionFactory();

using (ISession session = factory.OpenSession())
            {
                using (ITransaction trans = session.BeginTransaction())
                {
                    User newUser = session.Load(typeof(User), 6) as User;
                    //删除
                    session.Delete(newUser);
                    
                    trans.Commit();
                }
            }
        }
    }
}

运行以上代码,就可以实现数据的CRUD,感觉没有SQL,代码清爽了许多。呵呵。。。。

②:Linq

在linq中少了NHibernate的映射文件,这部分实现在实体类中通过TableAttribute和ColumnAttribute实现,少建一个xml文件,也许你会说,现在的映射文件可以自动生成,好吧,我承认的确是可以。

代码

[Table(Name="UserInfo")]
    public class User
    {
        private int userID;
        /// <summary>
        /// 用户ID
        /// </summary>
        [Column(DbType="int",IsPrimaryKey=true,IsDbGenerated=true)]
        public int UserID
        {
            get
            {
                return userID;
            }
            set
            {
                userID = value;
            }
        }

private string userName;
        /// <summary>
        /// 用户姓名
        /// </summary>
        [Column(DbType="nvarchar(50)")]
        public string UserName
        {
            get
            {
                return userName;
            }
            set
            {
                userName = value;
            }
        }

private string userPwd;
        /// <summary>
        /// 用户密码
        /// </summary>
        [Column(DbType="nvarchar(50)")]
        public string UserPwd
        {
            get
            {
                return userPwd;
            }
            set
            {
                userPwd = value;
            }
        }

private int userAge;
        /// <summary>
        /// 用户年龄
        /// </summary>
        [Column(DbType="int")]
        public int UserAge
        {
            get
            {
                return userAge;
            }
            set
            {
                userAge = value;
            }
        }
    }

好了,现在就可以看看在LINQ中如何完成CRUD的操作:

代码

namespace LinqUser
{
    public partial class LinqCRUD : Form
    {
        //映射实体
        DataContext objContext = null;

public LinqCRUD()
        {
            InitializeComponent();
            string strConnection = "Server=localhost;uid=sa;pwd=123456;database=NunitUser;Integrated Security=SSPI";
            objContext = new DataContext(strConnection);
        }

#region 数据CRUD
        /// <summary>
        /// 数据插入
        /// </summary>
        private void btnCreate_Click(object sender, EventArgs e)
        {
            try
            {
                string userName = this.tbUserName.Text.ToString();
                string userPwd = this.tbUserPwd.Text.ToString();
                int userAge = Convert.ToInt32(this.tbUserAge.Text.ToString());

User user = new User();
                user.UserName = userName;
                user.UserPwd = userPwd;
                user.UserAge = userAge;
                
                //插入
                objContext.GetTable<User>().InsertOnSubmit(user);
                //提交
                objContext.SubmitChanges();

MessageBox.Show("插入数据成功!", "系统提示!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("插入数据时错误:" + ex.Message, "系统提示!");
            }
        }

/// <summary>
        /// 数据修改
        /// </summary>
        private void btnUpdate_Click(object sender, EventArgs e)
        {
            try
            {
                var myUpdate = from user in objContext.GetTable<User>()
                               where user.UserID == 1
                               select user;
                User userUpdate = myUpdate.First<User>() as User;
                if (null == userUpdate) return;
                userUpdate.UserName = this.tbUserName.Text.ToString();
                userUpdate.UserPwd = this.tbUserPwd.Text.ToString();
                userUpdate.UserAge = Convert.ToInt32(this.tbUserAge.Text.ToString());

//提交
                objContext.SubmitChanges();

MessageBox.Show("修改数据成功!", "系统提示!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("修改数据时错误:" + ex.Message, "系统提示!");
            }
        }

/// <summary>
        /// 数据删除
        /// </summary>
        private void btnDel_Click(object sender, EventArgs e)
        {
            try
            {
                var myDel = from user in objContext.GetTable<User>()
                            where user.UserID == 1
                            select user;
                User userDel = myDel.First<User>();
                if (null == userDel) return;

//删除
                objContext.GetTable<User>().DeleteOnSubmit(userDel);

//提交
                objContext.SubmitChanges();

MessageBox.Show("删除数据成功!", "系统提示!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("删除数据时出错:" + ex.Message, "系统提示!");
            }
        }

/// <summary>
        /// 数据查询
        /// </summary>
        private void btnRead_Click(object sender, EventArgs e)
        {
            try
            {
                var myQuery = from user in objContext.GetTable<User>()
                              where user.UserID == 1
                              select user;

if (myQuery.Count<User>() <= 0) return;

foreach (User user in myQuery)
                {
                    Console.WriteLine("用户信息:UserID——>" + user.UserID + "、UserName——>" + user.UserName + "、UserPwd——>" + user.UserPwd + "、UserAge——>" + user.UserAge);
                }

MessageBox.Show("查询数据成功!", "系统提示!");

}
            catch (Exception ex)
            {
                MessageBox.Show("查询数据时错误:" + ex.Message, "系统提示!");
            }
        }
        #endregion
    }
}

到这里,LINQ的操作也结束了。运行感受一下吧。

先说说我的感受吧,用NHibernate明显感觉到效率没有原生的SQL语句的好,可能只是插入一条语句,没有批量的处理,Linq反而没感觉到比NHibernate效率低。如果是对数据库操作的实时性要求很高的话,可能不太适合使用ORM技术,当然了,才接触到这些东西,也许有其它的解决办法也说不定,待自己慢慢研究吧!!

转载于:https://www.cnblogs.com/wangyong/archive/2010/06/02/1749993.html

NHibernateLinq简单的CRUD操作相关推荐

  1. 使用mybatis完成简单的crud操作

    目录 1.配置核心配置文件和jdbc.properties 2. 装mybatis工具类 3.创建实体类 4.创建mapper接口 5.编写测试类 下面介绍基于注解的方式实现基本的 CRUD 操作 1 ...

  2. mongodb java crud_MongoDB用Java,简单的CRUD操作,两种方法,附源码下载。

    两种不同的连接数据库的方式来操作. MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); 方法1: D ...

  3. T4生成实体和简单的CRUD操作

    主要跟大家交流下T4,我这里针对的是mysql,我本人比较喜欢用mysql,所以语法针对mysql,所以你要准备mysql的DLL了,同理sqlserver差不多,有兴趣可以自己写写,首先网上找了一个 ...

  4. 如何用php实现crud,php实现简单的CRUD操作

    学生管理信息 信息浏览 ID 姓名 性别 年龄 班级 操作 //连接数据库 try { $pdo=new PDO("mysql:host=localhost;dbname=test;&quo ...

  5. java增删改查实例源码_Spring Data JPA 实现简单的CRUD增删改查源码案例

    Spring专题 Spring Data JPA 实现简单的CRUD增删改查源码案例 Spring Data JPA旨在简化JPA基础知识库构建和减少需要与数据库进行通信的代码量.第一部分是如何配置H ...

  6. HBase学习之路(二):Java客户端的CRUD操作详讲

    内容简介 一.概述 二.操作前的准备 三.put操作 1.单行put方法 2.使用Put列表 四.get操作 1.单行get方法 2.使用Get列表 五.delete操作 1.单行delete方法 2 ...

  7. php xml 增删改查,PHP实现对xml进行简单的增删改查(CRUD)操作示例

    本文实例讲述了PHP实现对xml进行简单的增删改查(CRUD)操作.分享给大家供大家参考,具体如下: 假如有下面xml文件: 55.8 56 40 339 如何使用php对它进行CRUD?其实像这种简 ...

  8. Elasticsearch中的document数据格式,简单的集群管理,商品的索引的CRUD操作(学习资料记录)

    1.Document数据格式 面向文档的搜索分析引擎 (1)应用系统的数据结构都是面向对象的,复杂的. (2)对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式, ...

  9. iBatis的CRUD操作详细总结

    昨天晚上看了一下关于iBatis的一个讲解的视频,讲的和我的这个简单的总结差不多.... 思考了一下还是把主要操作都总结一下吧,当然这里也不是全的,知识简单的CRUD... 首先我觉得持久层的操作主要 ...

最新文章

  1. 层化(stratification)的方法
  2. java模拟验证码生成
  3. sftp服务器同步文件到本地,服务器之间通过sftp的方式同步文件,并入库到本地数据的表中...
  4. 怎么看rx580是不是470刷的_怎么看钻石是不是奶咖钻,钻石证书上可以看出奶咖钻石吗...
  5. 一道十分有趣的概率题!3局2胜和5局3胜哪个胜算更大?你怎么思考
  6. leetcode 190. 颠倒二进制位(位运算)
  7. 要记住的Facepalm:我在未先测试SDK的情况下对其进行了改进。
  8. 【CodeForces - 764D】Timofey and rectangles (四色定理 + 找规律 + 构造)
  9. 解决python导入当前文件夹下的包时可以运行,但编辑器报错
  10. Apache Mnemonic成为Apache顶级项目,主要解决大数据性能问题
  11. c#_delegate_异步调用_BeginInvoke
  12. 【笔记本触摸板失灵】终极解决办法
  13. 中国计算机学会推荐国际学术会议和期刊(A类)2019年
  14. 在无处落脚的大海,你就是我的岛屿
  15. Node.js的环境搭建方法和 npm 的使用方法
  16. 农用地转为建设用地审批(农转用审批)
  17. 数字社区数字化技术应用
  18. 《生物化学与分子生物学》----蛋白质----听课笔记(五)
  19. PHP用户注册页面测试用例,用户注册界面测试用例
  20. 一个简单的神经网络股票买卖策略

热门文章

  1. 解决fixed在苹果手机抖动问题/头部底部固定布局
  2. PHP文件上传,下载,Sql工具类!
  3. Win7系统安装MySQL5.5.21图解教程
  4. listview条目用状态选择器没反应
  5. 国家“十三五”重点出版规划获批
  6. (五十九)自动存储、静态存储、动态存储
  7. MySQL备份恢复工具xtrabackup
  8. AMD Athlon ⅡX2 240 K10 平台 超频 全记录
  9. [Silverlight资源]处理bmp,gif及ico图像类文件
  10. Makefile 书写命令