zoukankan      html  css  js  c++  java
  • 使用NHibernate连接MySQL数据库及增删改查

    学习资料


    Visual Studio新建一个C#控制台程序,设为启动项,在项目属性中设置目标框架为.NET Framework4.5。

    添加两个DLL引用:MySQL.Data.dll和NHibernate.dll。后者在NHibernate官网中下载或者直接从Nuget安装。

    新建一个文件hibernate.cfg.xml。该配置文件的内容复制于NHibernate文档(搜Configure NHibernate)。因为文档中连接的是SqlServer,而我们要用的是MySQL,所以要做如下修改。配置文档的写法参考NHibernate连接MySQL案例

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
      <session-factory>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property> <!-- 数据库的版本 -->
        <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property> <!-- 使用什么数据库 -->
        <property name="connection.connection_string">Server=localhost;Database=mygamedb;User ID=root;Password=root</property> <!-- 端口号缺省值为3306 -->
    
        <property name="show_sql">true</property> <!-- 是否打印执行的SQL语句 -->
    
        <!-- 坑点:如果当前解决方案下有多个项目,一定要指定程序集! -->
        <mapping assembly="NHibernateConnectMySQL"/>
      </session-factory>
    </hibernate-configuration>
    复制代码

    已知MySQL数据库中的表和内容如下图:

    项目根目录新建Model文件夹,在该文件夹下新建User.cs类。内容如下:

    复制代码
    namespace NHibernateConnectMySQL.Model
    {
        public class User
        {
            public virtual int Id { get; set; }
            public virtual string UserName { get; set; }
            public virtual string UserPwd { get; set; }
            public virtual DateTime UserRegisterTime { get; set; }
        }
    }
    复制代码

    项目根目录新建Mappings文件夹,在该文件夹下新建User.hbm.xml文件(命名习惯上与要关联的User.cs类命名一致)。写法同样参考官方文档(搜The complete mapping file)。

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       assembly="FirstSolution"
                       namespace="NHibernateConnectMySQL.Model"> <!-- 项目所在的程序集;该配置文件所关联的User.cs类所在的名称空间 -->
    
      <class name="User" table="user"> <!-- 指定名称空间下的User类,要与数据库中的user表映射 -->
        <id name="Id" column="user_id" type="Int32"> <!-- 配置主键。类中的Id属性映射表中的user_id列 -->
          <generator class="native" /> <!-- 主键自增。使用数据库自带的生成器 -->
        </id>
        <property name="UserName" column="user_name" type="String"/> <!-- 只有主键用id,其他字段都用property -->
        <property name="UserPwd" column="user_pwd" type="String"/> <!-- 是NHibernate定义的类型,查看文档http://nhibernate.info/doc/nhibernate-reference/index.html搜索type -->
        <property name="UserRegisterTime" column="user_register_time" type="Date"/>
      </class>
    
    </hibernate-mapping>
    复制代码

    在【属性】窗体修改hibernate.cfg.xml的【复制到输出路径】为【始终复制】。修改User.hbm.xml的【生成操作】为【嵌入的资源】。然后生成项目。可以在Debug目录下看到hibernate.cfg.xml文件直接被复制过来了,而User.hbm.xml的内容被集成到了exe文件中。

    写代码完成NHibernate初始化操作,就是解析数据库链接配置文件(即hibernate.cfg.xml)和各种表映射文件(User.hbm.xml等等)。通常在项目的主函数中执行。

    测试插入一条纪录,代码如下:

    复制代码
    using NHibernate;
    using NHibernate.Cfg;
    using NHibernateConnectMySQL.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace NHibernateConnectMySQL
    {
        class Program
        {
            static void Main(string[] args)
            {
                // ---- NHibernate初始化 ----
                var conf = new Configuration();
                // 解析hibernate.cfg.xml
                conf.Configure(); // 参数为文件,缺省值就是hibernate.cfg.xml
                // 解析表映射文件(User.hbm.xml等),表映射文件已被集成到程序集中(嵌入的资源)
                //conf.AddAssembly("NHibernateConnectMySQL"); // 参数为文件所在的程序集,已在hibernate.cfg.xml中声明
                // ---- 完成初始化 ----
    
                // ---- 连接数据库 ----
                ISessionFactory sessionFactory = null;
                ISession session = null;
                ITransaction transaction = null;
                try
                {
                    // 连接数据库的会话工厂
                    sessionFactory = conf.BuildSessionFactory();
                    // 打开一个跟数据库的会话
                    session = sessionFactory.OpenSession();
                    // 开启事务
                    transaction = session.BeginTransaction();
    
                    User user1 = new User() { UserName = "jjssag2", UserPwd = "4606519" };
                    User user2 = new User() { UserName = "jjssag3", UserPwd = "46064519" };
                    session.Save(user1);
                    session.Save(user2);
    
                    // 提交事务
                    transaction.Commit();
    
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
                finally
                {
                    if (transaction != null)
                    {
                        transaction.Dispose();
                    }
                    if (session != null)
                    {
                        session.Close();
                    }
                    if (sessionFactory != null)
                    {
                        sessionFactory.Close();
                    }
                }
    
                Console.ReadKey();
            }
        }
    }
    复制代码

    完善增删改查

    项目目录如下:

    由于每次操作都要开启一个会话Session,都要使用事务Transaction,所以考虑将重复的内容进行封装,写一个NHibernateHelper.cs工具类。

    复制代码
    using NHibernate.Cfg;
    using NHibernate;
    
    namespace NHibernateConnectMySQL
    {
        class NHibernateHelper
        {
            private static ISessionFactory _sessionFactory;
            public static ISessionFactory SessionFactory
            {
                get
                {
                    if (_sessionFactory == null)
                    {
                        var conf = new Configuration();
                        conf.Configure();
                        conf.AddAssembly("NHibernateConnectMySQL");
    
                        _sessionFactory = conf.BuildSessionFactory();
                    }
                    return _sessionFactory;
                }
            }
    
            public static ISession OpenSession()
            {
                return SessionFactory.OpenSession();
            }
    
        }
    }
    复制代码

    Manager文件夹下是各个类的增删改查操作实现。

    复制代码
    using System.Collections.Generic;
    using NHibernateConnectMySQL.Model;
    using NHibernate;
    using NHibernate.Criterion;
    
    namespace NHibernateConnectMySQL.Manager
    {
        class UserManager : IUserManager
        {
            // 插入一条纪录
            public void Add(User user)
            {
                using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.Save(user);
                        transaction.Commit();
                    }
                }
            }
    
            // 删除一条纪录
            public void Delete(User user)
            {
                using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.Delete(user);
                        transaction.Commit();
                    }
                }
            }
    
            // 更新一条纪录
            public void Update(User user)
            {
                using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.Update(user);
                        transaction.Commit();
                    }
                }
            }
    
            // 查询一条纪录
            public User GetUserByID(int id)
            {
                using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
                {
                    // 查询不会对数据进行操作,可以不用事务
                    User user = session.Get<User>(id);
                    return user;
                }
            }
            
            // 查询一条纪录
            public User GetUserByUserName(string userName)
            {
                using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
                {
                    //ICriteria criteria = session.CreateCriteria(typeof(User));
                    // 添加查询条件为传入的参数等于实体类中的属性
                    //criteria.Add(Restrictions.Eq("UserName", userName));
                    //User user = criteria.UniqueResult<User>();
    
                    User user = session
                        .CreateCriteria(typeof(User))
                        .Add(Restrictions.Eq("UserName", userName))
                        .UniqueResult<User>();
                    return user;
                }
            }
    
            // 查询多条纪录
            public ICollection<User> GetAllUsers()
            {
                using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
                {
                    IList<User> list = session.CreateCriteria(typeof(User)).List<User>();
                    return list;
                }
            }
    
            // 校验登录
            public bool VerifyUser(string userName, string password)
            {
                using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
                {
                    User user = session
                        .CreateCriteria(typeof(User))
                        .Add(Restrictions.Eq("UserName", userName))
                        .Add(Restrictions.Eq("UserPwd", password))
                        .UniqueResult<User>();
    
                    if (user == null)
                        return false;
                    else
                        return true; 
                }
            }
    
        }
    }
    复制代码

    在主函数中调用增删改查方法。

    复制代码
    using NHibernateConnectMySQL.Manager;
    using System;
    
    namespace NHibernateConnectMySQL
    {
        class Program
        {
            static void Main(string[] args)
            {
                UserManager userManager = new UserManager();
    
                // 插入数据
                //User user = new User() { UserName = "3643uhyrjut", UserPwd = "123453143" };
                //UserManager userManager = new UserManager();
                //userManager.Add(user);
    
                // 查询单条纪录
                //User user = userManager.GetUserByUserName("agr43");
                //Console.WriteLine(user.UserPwd);
    
                // 查询多条纪录
                //ICollection<User> list = userManager.GetAllUsers();
                //foreach (User item in list)
                //{
                //    Console.WriteLine(item.UserPwd);
                //}
    
                // 验证登录
                //Console.WriteLine(userManager.VerifyUser("jjssag1", "4606519"));
    
                Console.ReadKey();
            }
        }
    }
    复制代码

    坑点

    • 如果当前解决方案下有多个项目,在总的配置文件中(hibernate.cfg.xml)一定要指定是哪个程序集,或者代码中用conf.AddAssembly()指定!否则报错如下图:

  • 相关阅读:
    jQuery里使用setinterval
    关于java以及JavaScript或者更多的语言中Data类的问题
    重置input checked
    利用CSS变量实现悬浮效果
    vue 可编辑表格组件
    js 可拉伸表格
    vue 自定义拖拽指令
    vue 表格导出excel
    vue 侧边导航栏递归显示
    RUP(Rational Unified Process)统一软件过程概述
  • 原文地址:https://www.cnblogs.com/Jeely/p/11357733.html
Copyright © 2011-2022 走看看