C#访问数据库的一种方法——NHibernate的配置和使用

2 篇文章 0 订阅

目录

 

1.背景

2.配置

3.使用

4. 注意事项


1.背景

一般C#访问数据库可以通过引用MySql.Data.dll库来实现,然后添加一个MySqlHelper类来对MySql数据库进行访问和操作,

添加引用后在你的数据库操作类(如MySqlHelper.cs)中添加引用声明

using MySql.Data;
using MySql.Data.MySqlClient;

然后创建一个查询事务,获得你想要的的数据。这种查询方法是传统的点对点查询。我们的程序一般都是面向对象的,如果能采用面向对象的方法,将.Net类映射到数据库表,将会大大减轻程序员在SQL语句的编写任务。

Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框架,它对Java的JDBC(类似于ADO.Net)进行了非常轻量级的对象封装,使得程序员可以随心所欲的使用对象编程思维来操纵数据库,目前在国内Java开发界已经颇为流行,Hibernate+Spring往往是很多Java公司招聘的要求。而NHibernate,顾名思义,如同NUnit,NAnt一样,是基于.Net的Hibernate实现。

2.配置

Nhibernate官网提供了一个详细的文档。但是没有中文版,有兴趣的朋友可以参考。这里结合一个例子来讲解。

  • 1.首先打开Visual Studio,创建一个控制台程序,可以基于.Net framework也可以基于.Net Core。
  • 2.右键你创建的项目->管理Nuget包:

 点击后,在搜索框输入:NHibernate,第一个就是我们要安装的包:

 点击安装即可。

  •  3.在你的工程目录下创建一个文件夹,取名为Model(名字可以任取)。在改文件加下新建一个xml文件,固定取名为:hibernate.cfg.xml ,这是一个配置文件,用于连接你创建的数据库 。该文件的内容可以从官网下载页面提供的文件夹复制,链接在此。我这里贴一个官方的模板:
<?xml version="1.0" encoding="utf-8"?>
<!-- 
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it 
for your own use before compile tests in VisualStudio.
-->
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
	<session-factory name="NHibernate.Test">
		<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
		<property name="connection.connection_string">
			Database=nhibernate;Data Source=localhost;User Id=nhibernate;Password=;
			Protocol=memory;Old Guids=True;
		</property>
		<property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
	</session-factory>
</hibernate-configuration>

因为我用的是MySql数据库,所以选择MySql对应版本。但是还要做相应的修改:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="PCController.GlueController">
    <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
    <!--用来配置使用什么版本的数据库-->
    <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
    <!--用来配置使用什么数据库-->
    <!--配置MySQL的IP地址数据库名用户名和密码-->
    <property name="connection.connection_string">
      Database=db_mom;Data Source=192.168.50.100;User Id=root;Password=******;Port=30302
    </property>
  </session-factory>
</hibernate-configuration>
属性
session-factory name=填写你的项目名(对应的命名空间),我这里的项目空间是PCController.GlueController,所以填这个。

property name="connection.connection_string"

这里主要设置数据库的连接:Datebase是你数据库的名字;Data Sorce是你数据库所在服务器的IP地址,User Id是数据库的用户名;Password 是你访问该数据的登录密码;Port是服务器端口号。

其它属性均保持不变。最后右键该文件,选择属性:“复制到输出目录” 的值为 始终赋值。

  • 4. 根据数据库中数据的内容建立对应的类。

如图,我的表样式如下:

 共有五列,分别对应五个数据,每一行对应一个对象,所以我的类如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace PCController.GlueController.Model
{
    class GluePip
    {
        //对应于数据库的属性
        private int id;
        private int glueId;
        private string stationId;
        private bool status;
        private DateTime updateTime;

        public virtual int ID { get=>id; set=>id=value; }
        public virtual int GlueID { get=>glueId; set=>glueId=value; }
        public virtual bool Status { get=>status; set=>status=value; }
        public virtual string StationID { get=>stationId; set=>stationId=value; }
        public virtual DateTime UpdateTime { get=>updateTime; set=>updateTime=value; }

    }
}
  •  5.设置映射文件。

新建一个Mapping文件夹(名字任取),在Mapping文件夹下创建一个xml文件(作映射文件)。命名有要求: *.hbm.xml  比如我创建一个gluePipe.hbm.xml。完后对该XML文件右键,点属性,修改生成操作为 嵌入资源。

文件如下,里面有详细的中文注释:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="PCController.GlueController"
                   namespace="PCController.GlueController.Model">
  <!-- 项目所在的程序集;该配置文件所关联的User.cs类所在的名称空间 -->
    <!--assembly 为程序集名(当前项目名),namespace为实体类(与数据库对应的类)所在的命名空间-->
  <class name="GluePip" table="tb_glue_pipe_basic_info">
    <!-- 指定名称空间下的User类,要与数据库中的user表映射 -->
    <!--在class节点下,ID节点打头作为代表主键的节点-->
    <!--name指定的实体类里面的某个属性名,column对应数据表内某列的名字-->
    <!--TYPE 既不是实体类类型,也不是数据库内的类型是Nhibernate的类型-->
    <id name="ID" column="id" type="Int32">
      <!-- 配置主键。类中的Id属性映射表中的user_id列 -->
      <generator class="native" />
      <!-- 主键自增。使用数据库自带的生成器 -->
    </id>
    <property name="GlueID" column="glue_id" type="Int32"/>
    <!-- 只有主键用id,其他字段都用property -->
    <property name="StationID" column="station_id" type="String"/>
    <!-- 是NHibernate定义的类型,查看文档http://nhibernate.info/doc/nhibernate-reference/index.html搜索type -->
    <property name="Status" column="status" type="Boolean"/>
    <property name="UpdateTime" column="gmt_modified" type="Date"/>
  </class>

</hibernate-mapping>

至此,Nhibernate的配置就完成了。接下来就是测试和使用了。

 

3.使用

可以参考下面的代码写一个基本的测试函数:

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 System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using PCController.GlueController.Model;

namespace PCController.GlueController
{
    class NHibernateHelper
    {
        private static ISessionFactory _sessionFactory;
        public static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    //Configuration 已经是命名空间,所以加了前缀特指NHibernate命名空间中Configuration.
                    var configuration = new NHibernate.Cfg.Configuration();
                    configuration.Configure(@"D:\Zuru_File\Zuru_manufacture_stack\pc_controller\PCController.GlueController\Model\hibernate.cfg.xml");
                    //添加程序集映射文件,即程序集中后缀为.hbm.xml的文件。
                    configuration.AddAssembly("PCController.GlueController");
                    //建立Session工厂
                    _sessionFactory = configuration.BuildSessionFactory();
                }
                return _sessionFactory;
            }
        }
        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }
    }
}

然后我们再写一个类用于实现增删查改的操作,这个类我取名为:MySqlManage,  具体实现如下:

using PCController.GlueController.Model;
using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernate.Criterion;

namespace PCController.GlueController
{
    class MysqlManage
    {
        //插入一条记录
        public void Add(GluePip gluePip)
        {
            using (ISession session=NHibernateHelper.SessionFactory.OpenSession())
            {
                using(ITransaction transaction=session.BeginTransaction())
                {
                    session.Save(gluePip);
                    transaction.Commit();
                }
            }
        }
        //删除一条记录
        public void Delete(GluePip gluePip)
        {
            using(ISession session=NHibernateHelper.SessionFactory.OpenSession())
            {
                using(ITransaction transaction=session.BeginTransaction())
                {
                    session.Delete(gluePip);
                    transaction.Commit();
                }
            }
        }
        //更新一条记录
        public void Update(GluePip gluePip)
        {
            using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
            {
                using (ITransaction transaction = session.BeginTransaction())
                {
                    session.Update(gluePip);
                    transaction.Commit();
                }
            }
        }
        //查询一条记录
        public GluePip GetGluePipByID(int id)
        {
            using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
            {
                //查询数据不会对数据进行操作,可以不用事物
                GluePip gluePip = session.Get<GluePip>(id);
                return gluePip;
            }
        }
        //查询一条记录
        public GluePip GetGluePipByGlueId(int glueid)
        {
            using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
            {
                //查询数据不会对数据进行操作,可以不用事物
                GluePip gluePip = session.CreateCriteria(typeof(GluePip)).Add(Restrictions.Eq("GlueID", glueid)).UniqueResult<GluePip>();
                return gluePip;
            }
        }

        //查询多条记录
        public ICollection<GluePip> GetGluePips()
        {
            using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
            {
                IList<GluePip> list = session.CreateCriteria(typeof(GluePip)).List<GluePip>();
                return list;
            }
        }

        //使用sql语句查询
        public IList<GluePip> GetGluePipsBySQL(string sql)
        {
            using (ISession session = NHibernateHelper.SessionFactory.OpenSession())
            {
                IList<GluePip> gluePips = null;
                IQuery query = session.CreateSQLQuery(sql).AddEntity(typeof(GluePip));
                gluePips = query.List<GluePip>();
                return gluePips;
            }

        }
        
    }
}

最后一个函数GetGluePipBySQL可以直接将MySql查询语句作为字符串传入,实现sql语句查询。主函数中使用MySqlManage类:

            MysqlManage mysqlManage = new MysqlManage();
            IList<GluePip> Lp= mysqlManage.GetGluePipsBySQL(@"SELECT * FROM db_mom.tb_glue_pipe_basic_info  where status=1 order by gmt_modified limit 1 ");
            Console.WriteLine(Lp.First().UpdateTime);
            GluePip gluePip = new GluePip() { GlueID = 12, StationID = "Glue1", Status = true ,UpdateTime=DateTime.Now};
            mysqlManage.Add(gluePip);
            GluePip gluepip=mysqlManage.GetGluePipByGlueId(3);
            Console.WriteLine(gluepip.StationID);
            Console.WriteLine("OK!!");
            gluepip.StationID = "Fuuuuck you!";
            mysqlManage.Update(gluepip);
            Console.ReadKey();

运行成功后,会看到我的table里面出现了:Fuuuuuck you!, 说明更新成功。


4. 注意事项

如果你在运行中,报错,切输出一大堆文字,十之八九是你配置文件出问题,一定要仔细填写配置文件。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值