学习资料


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. 模拟select下拉框、复选框效果

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  2. [七月挑选]优化hexo目录,使本地图片能显示出来

    title: 优化hexo目录,使本地图片能显示出来 查看了一下从此蜕变作者的Hexo中添加本地图片,提炼了一些能优化本地图片存放及编写是图片查看的问题. 1.修改配置文件_config.yml 里的 ...

  3. rest_framework框架的认证、权限

    REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.TokenAuth", ] ...

  4. flask框架上下文

    上下文 上下文:相当于一个容器,保存了 Flask 程序运行过程中的一些信息. Flask中有两种上下文,请求上下文和应用上下文 请求上下文(request context) 在 flask 中,可以 ...

  5. impala常用语法

    参考:https://www.w3cschool.cn/impala/impala_alter_table.html

  6. Flutter-使用Dialog時出現No MaterialLocalizations found

    在显示SimpleDialog时候程序报错 No MaterialLocalizations found 没有找到 MaterialLocalizations 搜索找到原因 runApp 需要先调用 ...

  7. SOJ 一句话题解整理

    #50 离线+按位考虑 #99 %6拆成%2和%3合并+将图定向为DAG的方案数为 (-1)^n P(-1) #123 储存分数最后求逆元 #124 $\binom{2n}{n}$大概在25的时候就已 ...

  8. 《SaltStack技术入门与实践》——执行结果处理

    执行结果处理 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 Return组件可以理解为SaltStack系统对执行Minion返回后的数据进行存储或 ...

  9. 【leetcode】299. Bulls and Cows

    题目如下: 解题思路:本题难度不太大,对时间复杂度也没有很高的要求.我的做法是用一个字典来保存每个字符出现的次数,用正数1记录标记secret中出现的字符,用负数1记录guess中出现的字符,这样每出 ...

  10. 大数加法(A + B Problem Plus)问题

    解题思路 两个⼤数可以⽤数组来逐位保存,然后在数组中逐位进⾏相加,再判断该位相加后是否需要进位.为了⽅便计算,可以把数字的低位放到数组的前面,高位放在后面. 样例输入 3 18 22 56 744 5 ...