• NHibernate&&Linq简单的CRUD操作


          因为最近在做一些有关数据库方面的开发,其实,说白了,就是对数据库的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), 5as 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), 6as 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>() <= 0return;

                    
    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技术,当然了,才接触到这些东西,也许有其它的解决办法也说不定,待自己慢慢研究吧!!

  • 相关阅读:
    sshd
    eclipse运行报java.lang.OutOfMemoryError: PermGen space解决方法
    项目之间依赖
    shell-
    部署记录
    mysql index使用
    GitHub上搭建私人hexo博客操作教程
    关于Vue实例的生命周期(2)
    JS中的五种去重方法
    Vue入门教程(2)
  • 原文地址:https://www.cnblogs.com/wangyong/p/1749993.html
Copyright © 2020-2023  润新知