【C#】使用NHibernate连接MySQL数据库及增删改查
学习资料
- 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案例。
<?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 = "" };
User user2 = new User() { UserName = "jjssag3", UserPwd = "" };
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()指定!否则报错如下图:

【C#】使用NHibernate连接MySQL数据库及增删改查的更多相关文章
- 使用NHibernate连接MySQL数据库及增删改查
学习资料 http://www.sikiedu.com/course/51/task/891/show https://www.codeproject.com/Articles/26123/NHibe ...
- java jdbc 连接mysql数据库 实现增删改查
好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...
- 通过jdbc连接MySql数据库的增删改查操作
一.获取数据库连接 要对MySql数据库内的数据进行增删改查等操作,首先要获取数据库连接 JDBC:Java中连接数据库方式 具体操作如下: 获取数据库连接的步骤: 1.先定义好四个参数 String ...
- php 连接mysql数据库以及增删改查
php 连接数据库 一般是用面向对象的方法,需要先创建一个对象,即造一个连接对象,然后再写sql语句,(增改查删),最后执行sql语句 其中在创建连接对象时 我们用到的是MySQLI 是不区分大小写 ...
- C++ API方式连接mysql数据库实现增删改查
这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...
- 使用nodejs连接mysql数据库实现增删改查
首先要有数据库 使用xampp 或者 phpstudy 可以傻瓜式安装 新建一个项目文件夹 之后在这个目录下初始化package.json (npm init) 先在项目中安装mysql 和 ex ...
- php之PDO连接mysql数据库,增删改查等等操作实例
我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严就有SQL注入风险,导致网站被攻击. 虽然可以用mysql_real_escape_string ...
- 连接mysql数据库实现增删改查(一)
在python中我们通过pymysql来连接数据库,具体实现如下 ''' 连接mysql数据库 此类进行封装了一些基础的操作数据库方法 ''' import pymysql from Homework ...
- MyEclipse 05_连接mysql数据库进行增删改查
例子: 1.在数据库中建立如下表 2. 在MyEclipse里按本主博客文MyEclipse 03_jdbc连接数据库,注意数据库名要一致 运行后在Navicat里如下: 代码如下: package ...
随机推荐
- ArcGIS 10.2数字化线状要素时自己主动拼接成一条线
一開始一直和捕捉和经典捕捉过不去.最后才发现找错了地方,原来要Customize.自己定义加入"Continue Feature"工具,将其拖动到界面上的随意工具条内就可以.如图1 ...
- 删除vector指定位置的元素
原文链接: http://www.cnblogs.com/yeahgis/archive/2012/05/29/2523476.html #include <vector>#include ...
- CListCtrl自适应宽度
原文链接: http://blog.csdn.net/benny5609/article/details/1967084 void CListCtrlExDlg::AdjustColumnWidth( ...
- 温故而知新 Vue 原来也有this.$forceUpdate();
由于一些嵌套特别深的数据,导致数据更新了.UI没有更新(连深度监听都没有监听到),我捉摸着有没有和react一样的立即更新UI的API呢 this.forceUpdate()呢?结果还真有: this ...
- spring中InitializingBean接口使用理解(转)
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: imp ...
- Nginx+tomcat组合实现高并发场景的动静分离和负载均衡方案
简介 Java服务大多是跑在tomcat里,但是众所周知tomcat的并发性能没有优势(tomcat8及以上的版本可能有所改善),所以为了更好的适应高并发的应用场景,我们可以使用tomcat+ngin ...
- MySQL 5.6学习笔记(函数)
1. 数学函数 ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEIL(x)或CEILING(x) 返回大于x的最小整数值EXP(x) ...
- Android基础知识之Manifest文件中的用户权限元素
原文:http://android.eoe.cn/topic/android_sdk 分任务原文链接一:http://developer.android.com/guide/topics/manife ...
- wget常见用法
1.很多软件官网会有安装脚本,并把脚本搞成raw模式,方便下载后直接运行的shell文件.比如docker wget -qO- get.docker.com | bash -q的含义是:--quiet ...
- tiny-cnn开源库的使用(MNIST)
tiny-cnn是一个基于CNN的开源库,它的License是BSD 3-Clause.作者也一直在维护更新,对进一步掌握CNN非常有帮助,因此以下介绍下tiny-cnn在windows7 64bit ...