学习资料


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 = "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 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()指定!否则报错如下图:

使用NHibernate连接MySQL数据库及增删改查的更多相关文章

  1. 【C#】使用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. C++ API方式连接mysql数据库实现增删改查

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. vue图片不存在时加载默认图片

    在文件中的img那里添加:οnerrοr="errorImg01",然后设置errorImg01的路径如果直接写成 errorImg01: ('../../assets/image ...

  2. <input type="radio">单选按钮

    转自:http://www.divcss5.com/html/h490.shtml1 <form> 男性: <input type="radio" checked ...

  3. 33. Search in Rotated Sorted Array (JAVA)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  4. 如何设置一个App的缓存机制

    在手机应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存,这篇文章将设计一个本地缓存的机制. 功能需求 这个 ...

  5. Java基础学习(1)

    Java基础知识 Java平台 1995年由Sun公司创建 Java的体系结构 JVM Java Virtue Machine Java代码的执行顺序 JDK Java Development Kit ...

  6. Nginx 编译安装工程优化

    1.减小 nginx 编译后的文件大小 在编译 nginx 时,默认以 debug 模式进行,在 debug 模式下会插入很多跟踪和 assert 之类的信息. 在 nginx 源码文件解压后,找到源 ...

  7. .net 正则表达式

    string RegStr = @"^[0-9]*[1-9][0-9]*$"; if (Regex.IsMatch("待验证的字符串", RegStr)) { ...

  8. slots_doc_call属性

    class Foo: "这时文档doc属性" __slots__ = ["name","age"] #[“name”=None,“age&q ...

  9. VB Open 函数详解 打开、关闭、读、写文件

    (一)打开和关闭文件      1.顺序文件     打开顺序文件,我们可以使用Open语句.它的格式如下:Open pathname For [Input |Output |Append] As [ ...

  10. 浅谈C++ allocator内存管理(对比new的局限性)(转)

    STL中,对内存管理的alloc的设计,迫使我去学习了allocator类.这里对allocator内存管理做了点笔记留给自己后续查阅.allocator类声明.定义于头文件<memory> ...