博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C#】使用NHibernate连接MySQL数据库及增删改查
阅读量:6811 次
发布时间:2019-06-26

本文共 8250 字,大约阅读时间需要 27 分钟。

学习资料


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

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

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

NHibernate.Connection.DriverConnectionProvider
NHibernate.Dialect.MySQL5Dialect
NHibernate.Driver.MySqlDataDriver
Server=localhost;Database=mygamedb;User ID=root;Password=root
true

已知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)。

在【属性】窗体修改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
(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 = session .CreateCriteria(typeof(User)) .Add(Restrictions.Eq("UserName", userName)) .UniqueResult
(); return user; } } // 查询多条纪录 public ICollection
GetAllUsers() { using (ISession session = NHibernateHelper.SessionFactory.OpenSession()) { IList
list = session.CreateCriteria(typeof(User)).List
(); 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
(); 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
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()指定!否则报错如下图:

 

转载地址:http://kgwzl.baihongyu.com/

你可能感兴趣的文章
css正方形照片墙
查看>>
找工作的程序员必懂的Linux
查看>>
shell脚本实现杨辉三角形
查看>>
ComponentOne 2019V1火热来袭!全面支持 Visual Studio 2019
查看>>
装了一款系统优化工具,如何从Mac上卸载MacBooster 7?
查看>>
使用符号表调试release程序
查看>>
Delphi 设置系统默认打印机
查看>>
AliOS Things网络适配框架 - SAL
查看>>
数组 将一个数组的元素和另一个素组的元素相加,然后赋给第三个数组
查看>>
Python常用模块汇总
查看>>
sa提开放系统下的虚拟新贵Virtualbox权技巧之xp_regwrite替换sethc.exe
查看>>
SpringBoot开发案例之整合Dubbo提供者(一)
查看>>
变态的程序
查看>>
腾讯抄你肿么办 ?
查看>>
java多线程的Fork/Join
查看>>
ftp 服务器的配置
查看>>
JavaScript的浏览器兼容性问题小结。
查看>>
Oracle Hint的用法
查看>>
Postfix邮件系统
查看>>
《编写可读代码的艺术》读书文摘--第一部分 表面层次的改进
查看>>