【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 ...
随机推荐
- Android adjustresize全屏无效问题
屏模式下,即使将activity的windowSoftInputMode的属性设置为:adjustResize,在键盘显示时它未将Activity的Screen向上推动,所以你Activity的vie ...
- 从语句 char* p="test" 说起
我相信,使用C/C++多年的人对下面这个字符串赋值语句都不会陌生吧. char* p = "test"; 同时,我也相信,各位在使用这种语句后吃 ...
- php性能优化(一)压力測试工具篇
ab使用 Apache附带的压力測试工具ab,很easy使用,而且全然能够摸你各种条件对Webserver发起測试请求.ab能够直接在Webserver本地发起測试请求.这对于须要了解server的处 ...
- (面试题)两个对象值相同 (x.equals(y) == true) ,但却可有不同的 hash code ,这 句话对不对
答:不对,有相同的 hash code这是java语言的定义:1) 对象相等则hashCode一定相等:2) hashCode相等对象未必相等 1.如果是基本变量,没有hashcode和equals方 ...
- Knockout: 实践CSS绑定和jQuery的blur失去焦点事件, 给未通过校验的输入框添加红色边框突出显示.
目的: 实践一下Knockout提供的CSS绑定功能和JQuery的blur失去焦点事件, 这次不使用Knockout的afterkeydown事件了. 步骤: 先在htm中添加.error的css样 ...
- VS2005快捷键大全
快捷键功能 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O打开项目 CTRL + SHIFT + C显示类视图 ...
- js判断是否IE浏览器
//ie? if (!!window.ActiveXObject || "ActiveXObject" in window){ //是 alert(1); }else{ //不是 ...
- [转载]Cortana 设计指导方针
来源:@微软中国MSDN,源地址:http://weibo.com/p/1001603898586285925224 使用语音命令,延伸 Cortana 与您的应用程序所提供的功能.启动应用程序,启动 ...
- Android 控件: Webview 的一些知识点
WebView 加载网页,当点击返回键的时,会显示上一个页面,并刷新. 同时可以对返回上一个页面进行干预,就是用到了缓存. webview加载网页的几个模式,即websetting中设置的加载模式.w ...
- ubuntu18.04下安装Anaconda及numpy、matplotlib
为了学习深度学习,我需要首先掌握利用python进行科学计算的知识,顺便复习一下线性代数.微积分.概率论.当然,现在我要做的是安装Anaconda. 1.官网下载,linux版本:https://ww ...