学习资料


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数据库及增删改查的更多相关文章

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

    学习资料 http://www.sikiedu.com/course/51/task/891/show https://www.codeproject.com/Articles/26123/NHibe ...

  2. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

  3. 通过jdbc连接MySql数据库的增删改查操作

    一.获取数据库连接 要对MySql数据库内的数据进行增删改查等操作,首先要获取数据库连接 JDBC:Java中连接数据库方式 具体操作如下: 获取数据库连接的步骤: 1.先定义好四个参数 String ...

  4. php 连接mysql数据库以及增删改查

    php 连接数据库 一般是用面向对象的方法,需要先创建一个对象,即造一个连接对象,然后再写sql语句,(增改查删),最后执行sql语句 其中在创建连接对象时 我们用到的是MySQLI  是不区分大小写 ...

  5. C++ API方式连接mysql数据库实现增删改查

    这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...

  6. 使用nodejs连接mysql数据库实现增删改查

      首先要有数据库 使用xampp 或者 phpstudy 可以傻瓜式安装 新建一个项目文件夹 之后在这个目录下初始化package.json (npm init) 先在项目中安装mysql 和 ex ...

  7. php之PDO连接mysql数据库,增删改查等等操作实例

    我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严就有SQL注入风险,导致网站被攻击. 虽然可以用mysql_real_escape_string ...

  8. 连接mysql数据库实现增删改查(一)

    在python中我们通过pymysql来连接数据库,具体实现如下 ''' 连接mysql数据库 此类进行封装了一些基础的操作数据库方法 ''' import pymysql from Homework ...

  9. MyEclipse 05_连接mysql数据库进行增删改查

    例子: 1.在数据库中建立如下表 2. 在MyEclipse里按本主博客文MyEclipse 03_jdbc连接数据库,注意数据库名要一致  运行后在Navicat里如下: 代码如下: package ...

随机推荐

  1. 启动mysql报错 -- ERROR! The server quit without updating PID file

    开发说某个测试环境的mysql,无法重启了,报以下错误提示: # service mysqld restart Shutting down MySQL.. SUCCESS! Starting MySQ ...

  2. 从sys/power/state分析并实现S3C2416的睡眠和唤醒

    环境: PC: debian-7.6.0 ARM CPU: S3C2416 Linux-Kernel: 3.6.0(FriendlyARM) U-boot: 1.3.4 一.问题来源 依据须要,在S3 ...

  3. nginx 配置支持URL HTML5 History 模式 与 设置代理

    拾人牙慧:https://segmentfault.com/q/1010000007140360 nginx 配置支持URL HTML5 History 模式 location / { try_fil ...

  4. 更改 AWS RDS mysql时区 -摘自网络

    AWS RDS AWS上搭建数据库的时候,不是DB on EC2就是RDS,但是选择RDS时,Timezone怎么处理? 「面向全球提供的AWS来讲理所当然的是UTC」,而RDS也不是例外.把服务器迁 ...

  5. MySQL各类日志文件相关变量介绍

    文章转自:http://www.ywnds.com/?p=3721 MySQL各类日志文件相关变量介绍 查询所有日志的变量   1 mysql> show global variables li ...

  6. 直接获取摄像头传回的图像数据(人脸、微笑、眨眼: 识别--&gt;第一步):图像识别第一步

    转:ios通过摄像头获取特定数据(http://www.2cto.com/kf/201404/290777.html) 凝视: 因为近期项目需求,须要一个可以实现对摄像头图片获取当中部分内容的功能,类 ...

  7. 腾讯云服务器 - 定时备份MariaDB/MySQL

    数据库数据备份尤为重要,而我们不会人工手动去备份,这样会很麻烦,我们都是通过服务器每日自定运行来做的,设置一个定时时间即可 首先我们看一下mysqldump这个文件的位置: 可以看到目录在 /usr/ ...

  8. zabbix server 在配置客户端的时候 在zabbix server端的/etc/hosts文件的hostname 对应的ip这样可以更快的让server端发现agent端

    如下: # cat /etc/hosts 127.0.0.1 localhost.localdomain localhost.localdomain localhost4 localhost4.loc ...

  9. 每日英语:How Your Knees Can Predict the Weather

    The Wolff family of Paramus, N.J., was eyeing the gathering clouds and debating whether to cancel a ...

  10. excel 添加换行符,去除换行符:

    excel 中添加换行符: :alt+enter 去掉excel中的换行符有三种方法: 注:解决过程中翻阅其他博客,看到如下方式: 1.看到有的说全选后“取消自动换行”,保存后,再打开,依然存在换行符 ...