使用NHibernate连接MySQL数据库及增删改查

深碍√TFBOYSˉ_ 2023-06-01 05:38 84阅读 0赞

学习资料

  • http://www.sikiedu.com/course/51/task/891/show
  • https://www.codeproject.com/Articles/26123/NHibernate-and-MySQL-A-simple-example

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

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

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

复制代码

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

复制代码

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

759894-20170912114348032-1500260450.jpg

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

复制代码

  1. namespace NHibernateConnectMySQL.Model
  2. {
  3. public class User
  4. {
  5. public virtual int Id { get; set; }
  6. public virtual string UserName { get; set; }
  7. public virtual string UserPwd { get; set; }
  8. public virtual DateTime UserRegisterTime { get; set; }
  9. }
  10. }

复制代码

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

复制代码

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

复制代码

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

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

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

复制代码

  1. using NHibernate;
  2. using NHibernate.Cfg;
  3. using NHibernateConnectMySQL.Model;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. namespace NHibernateConnectMySQL
  9. {
  10. class Program
  11. {
  12. static void Main(string[] args)
  13. {
  14. // ---- NHibernate初始化 ----
  15. var conf = new Configuration();
  16. // 解析hibernate.cfg.xml
  17. conf.Configure(); // 参数为文件,缺省值就是hibernate.cfg.xml
  18. // 解析表映射文件(User.hbm.xml等),表映射文件已被集成到程序集中(嵌入的资源)
  19. //conf.AddAssembly("NHibernateConnectMySQL"); // 参数为文件所在的程序集,已在hibernate.cfg.xml中声明
  20. // ---- 完成初始化 ----
  21. // ---- 连接数据库 ----
  22. ISessionFactory sessionFactory = null;
  23. ISession session = null;
  24. ITransaction transaction = null;
  25. try
  26. {
  27. // 连接数据库的会话工厂
  28. sessionFactory = conf.BuildSessionFactory();
  29. // 打开一个跟数据库的会话
  30. session = sessionFactory.OpenSession();
  31. // 开启事务
  32. transaction = session.BeginTransaction();
  33. User user1 = new User() { UserName = "jjssag2", UserPwd = "4606519" };
  34. User user2 = new User() { UserName = "jjssag3", UserPwd = "46064519" };
  35. session.Save(user1);
  36. session.Save(user2);
  37. // 提交事务
  38. transaction.Commit();
  39. }
  40. catch (Exception e)
  41. {
  42. Console.WriteLine(e);
  43. }
  44. finally
  45. {
  46. if (transaction != null)
  47. {
  48. transaction.Dispose();
  49. }
  50. if (session != null)
  51. {
  52. session.Close();
  53. }
  54. if (sessionFactory != null)
  55. {
  56. sessionFactory.Close();
  57. }
  58. }
  59. Console.ReadKey();
  60. }
  61. }
  62. }

复制代码


完善增删改查

项目目录如下:

759894-20170913115338282-247348526.png

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

复制代码

  1. using NHibernate.Cfg;
  2. using NHibernate;
  3. namespace NHibernateConnectMySQL
  4. {
  5. class NHibernateHelper
  6. {
  7. private static ISessionFactory _sessionFactory;
  8. public static ISessionFactory SessionFactory
  9. {
  10. get
  11. {
  12. if (_sessionFactory == null)
  13. {
  14. var conf = new Configuration();
  15. conf.Configure();
  16. conf.AddAssembly("NHibernateConnectMySQL");
  17. _sessionFactory = conf.BuildSessionFactory();
  18. }
  19. return _sessionFactory;
  20. }
  21. }
  22. public static ISession OpenSession()
  23. {
  24. return SessionFactory.OpenSession();
  25. }
  26. }
  27. }

复制代码

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

复制代码

  1. using System.Collections.Generic;
  2. using NHibernateConnectMySQL.Model;
  3. using NHibernate;
  4. using NHibernate.Criterion;
  5. namespace NHibernateConnectMySQL.Manager
  6. {
  7. class UserManager : IUserManager
  8. {
  9. // 插入一条纪录
  10. public void Add(User user)
  11. {
  12. using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
  13. {
  14. using (ITransaction transaction = session.BeginTransaction())
  15. {
  16. session.Save(user);
  17. transaction.Commit();
  18. }
  19. }
  20. }
  21. // 删除一条纪录
  22. public void Delete(User user)
  23. {
  24. using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
  25. {
  26. using (ITransaction transaction = session.BeginTransaction())
  27. {
  28. session.Delete(user);
  29. transaction.Commit();
  30. }
  31. }
  32. }
  33. // 更新一条纪录
  34. public void Update(User user)
  35. {
  36. using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
  37. {
  38. using (ITransaction transaction = session.BeginTransaction())
  39. {
  40. session.Update(user);
  41. transaction.Commit();
  42. }
  43. }
  44. }
  45. // 查询一条纪录
  46. public User GetUserByID(int id)
  47. {
  48. using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
  49. {
  50. // 查询不会对数据进行操作,可以不用事务
  51. User user = session.Get<User>(id);
  52. return user;
  53. }
  54. }
  55. // 查询一条纪录
  56. public User GetUserByUserName(string userName)
  57. {
  58. using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
  59. {
  60. //ICriteria criteria = session.CreateCriteria(typeof(User));
  61. // 添加查询条件为传入的参数等于实体类中的属性
  62. //criteria.Add(Restrictions.Eq("UserName", userName));
  63. //User user = criteria.UniqueResult<User>();
  64. User user = session
  65. .CreateCriteria(typeof(User))
  66. .Add(Restrictions.Eq("UserName", userName))
  67. .UniqueResult<User>();
  68. return user;
  69. }
  70. }
  71. // 查询多条纪录
  72. public ICollection<User> GetAllUsers()
  73. {
  74. using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
  75. {
  76. IList<User> list = session.CreateCriteria(typeof(User)).List<User>();
  77. return list;
  78. }
  79. }
  80. // 校验登录
  81. public bool VerifyUser(string userName, string password)
  82. {
  83. using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
  84. {
  85. User user = session
  86. .CreateCriteria(typeof(User))
  87. .Add(Restrictions.Eq("UserName", userName))
  88. .Add(Restrictions.Eq("UserPwd", password))
  89. .UniqueResult<User>();
  90. if (user == null)
  91. return false;
  92. else
  93. return true;
  94. }
  95. }
  96. }
  97. }

复制代码

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

复制代码

  1. using NHibernateConnectMySQL.Manager;
  2. using System;
  3. namespace NHibernateConnectMySQL
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. UserManager userManager = new UserManager();
  10. // 插入数据
  11. //User user = new User() { UserName = "3643uhyrjut", UserPwd = "123453143" };
  12. //UserManager userManager = new UserManager();
  13. //userManager.Add(user);
  14. // 查询单条纪录
  15. //User user = userManager.GetUserByUserName("agr43");
  16. //Console.WriteLine(user.UserPwd);
  17. // 查询多条纪录
  18. //ICollection<User> list = userManager.GetAllUsers();
  19. //foreach (User item in list)
  20. //{
  21. // Console.WriteLine(item.UserPwd);
  22. //}
  23. // 验证登录
  24. //Console.WriteLine(userManager.VerifyUser("jjssag1", "4606519"));
  25. Console.ReadKey();
  26. }
  27. }
  28. }

复制代码


坑点

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

759894-20170913103112485-990775687.png

转载于:https://www.cnblogs.com/Jeely/p/11357733.html

发表评论

表情:
评论列表 (有 0 条评论,84人围观)

还没有评论,来说两句吧...

相关阅读