zoukankan      html  css  js  c++  java
  • Nhibernate+SQLite 入门实例指南一

     
    Nhibernate+SQLite 实例指南

    前言

    (注:这一章基本上全是废话,大家可跳过不看)

    Nhibernate 是最近比较流行的一个源自于Java Hibernate的ORM工具,网上也有许多高水平的关于Nhibernate的文章,但是对于初学者来说,还是比较希望看到一些带有人门性质的初学者文章。我曾在自己的Blog(http://www.cnblogs.com/9527)上也发表了一些关于Nhibernate的文章,也得到了许多朋友的支持与来信,希望我能继续这一系列的文章。

    由于前两年由于个人的原因,一直没有时间在继续自己的文章。辜负了大家的期望。在这里先向一些支持我的朋友道个歉。

    文章主要面向对象是广大的初学者,所以我还是坚持自己简单为主、实例为上的风格,一方面自己水平有限写不出高深的文章,另一方面对于初学者来说,在了解一个新事物前,实例是最好的老师,看了许许多多的资料但是还是不知道怎么搭建最初始的环境,不知道怎么开始第一行代码哪是比较郁闷的:)。还有所有的文章都是我一边调试一边写的,所以可能过程中有许多错误,还请大家谅解,希望大家能一起解决问题,共同进步。

    开发环境

    开发工具我用的是SharpDevelop 2.0不是我喜欢,只因为我用的哪个笔记本跑不动VS.Net。大家用条件的话,还是建议大家用VS.Net来调试和运行代码,SharpDevelop 2.0虽然灵巧好用,但是就在我写第一个例子的时候,由于其功能的原因,我找不到具体错误的所在,我竟然用了整整两天的空余时间,汗自己一个。

    数据库用的是SQLite一个轻量级的数据库,这个我也是刚接触,也就是打算在研究NHibernate的时候顺带学习一下它。

    为了避免一些因为使用不同版本类库组件而带来的代码不能运行,异常出错等所以我在这里公布一下我所用的版本号

    NHibernate.dll 1.0.0.0

    System.Data.SQLite.dll 1.0.35.0

    SQLite 0.21.1869.3794

    .Net framework v2.0.50727

    这些个东西sf.net都用下载,大家很容易可以下载到。

    好了废话说的够多了,让我们开始吧

    实例一、让我们把Nhibernate运行起来

    新建数据库(这里推荐一大家一个很好用的用来管理SQLite数据库的工具SQLite Developer你可以从http://www.sharpplus.com/免费下载它。不然的话你会被SQLite Console下建立和修改数据库的过程给烦死。)

    数据库的DDL

    CREATE TABLE 't_user'(

    [uid] INTEGER PRIMARY KEY NOT NULL

    ,[name] varchar(100) NOT NULL

    )

    编写Domain Object文件和NHibernate映射文件。

    这两种文件可以用许多代码生成工具来生成,但是初学的时候还是希望大家不要怕麻烦,自己动手写一下,特别是映射文件,加深一下各个参数的作用,但是自己写的话也要异常小心,因为NHibernate对大小写敏感,还有就是在一在设置一些字段对应的时候一定要确保数据类型一致,这些错误就是因为小,在调试的时候有时还能找出来。

    在工程中添加一个TUser.cs代码如下

    using System;

    namespace QuickStart

    {

    [Serializable]

    public class TUser

    {

    private Int64 id;

    private String name;

    public TUser()

    {

    }

    public Int64 Id

    {

    get

    { return id; }

    set

    { id=value; }

    }

    public String Name

    {

    get

    { return name; }

    set

    {name=value;}

    }

    }

    }

    映射文件TUser.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">

    <class name="QuickStart.TUser, QuickStart" table="t_user">

    <id name="Id" column="uid" type="Int64">

    <generator class="identity" />

    </id>

    <property name="Name" type="String(100)" column="name" />

    </class>

    </hibernate-mapping>

    好了这个工程中现在只需要这两个文件,工程树如下:

    需要注意的地方,TUser.cs中没有特别需要注意的地方仔细一点就可以了,TUser.hbm.xml中需要注意的地方注要有:

    <generator class="identity" />

    这里是用来生成数据库表的主键字段的自动生成方式,Nhibernate提供了数种默认的方式(具体参见Nhibernate的文档,这里就不重复了)要提醒的是,有些方式只能支持特定的数据库,所以在选择的时候要注意。

    TUser.hbm.xml在编译的时候一定要把编译方式选成“嵌入式资源”。

    再次提醒特别要注意各个属性和字段一定要注意大小写,数据类型一定要一致,特别是手写代码。不是我啰嗦,实在是这样的错误太难找了。

    完成了基础代码,接下来就再新建一个QuickStart.Console项目添加到工程里面。

    (注:为什么不用NUnit,SharpDeveloper 2.0本身就集成了NUnit,但是不知道是BUG还是其它原因,我的测试文件,在单步调试可以顺利通过,但是在Run Test的时候,就是报错,出错的原因似乎是读取不到QuickStart.Test.Config,但是我明明就是有这个文件在bin下面,所以只能委曲求全建立一个Console项目来测试了)

    首先要添加Nhibernate和QuickStart的引用。添另一个App.config文件作为程序的配置文件,这样的话在编译完后可以自动在bin目录下生成QuickStart.Console.config文件。Nhibernate的配置信息全部可以放在App.config中,配置文件的具体内容

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration>

    <configSections>

    <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />

    </configSections>

    <system.data>

    <DbProviderFactories>

    <remove invariant="System.Data.SQLite"/>

    <add name="SQLite Data Provider" invariant="System.Data.SQLite"

    description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />

    </DbProviderFactories>

    </system.data>

    <nhibernate>

    <add key="hibernate.show_sql" value="true"/>

    <add key="hibernate.dialect" value="NHibernate.Dialect.SQLiteDialect"/>

    <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>

    <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SQLiteDriver"/>

    <add key="hibernate.connection.connection_string" value="Data Source=C:\book\Test\Nhibernate\QuickStart.db3;Version=3"/>

    <add key="hibernate.query.substitutions" value="true=1;false=0"/>

    </nhibernate>

    </configuration>

    由于我们使用的是SQLite数据库,系统中没有默认的驱动程序,所以在安装了System.Data.SQLite后要在配置文件中也要加上相应的配置。

    下面一节是NHibernate的配置,由于NHibernate文档中有比较详细的介绍,所以我这里只是更据项目的情况做一个简单的介绍。

    hibernate.show_sql :这个配置参数的主要做用要在程序运行中把NHibernate生成的SQL语句显示在控制台里,当然一般情况下只有控制台应用程序才能看见。所以我们在平常调试过程中应该把它设置为true,方便调试。

    Hibernate.dialect:NHibernate方言(Dialect)的类名 - 可以让NHibernate使用某些特定的数据库平台的特性,我们这里使用的是SQLite数据库,所以要它的value设置成“NHibernate.Dialect.SQLiteDialect”,

    Hibernate_connection_driver_class指定数据库链接驱动类的,NHibernate已经为SQLite创建好了驱动类,我们只要在配置文件中为SQLite配置好驱动程序能让NHibernate.DriverSQLiteDriver正确的访问到驱动程序。

    hibernate.connection.connection_string这个就是指定数据库链接字符串。

    写完了配置文件,现在我们可以开发构建第一段代码,来体验一下Nhibernate的强大功能了,我们在IDE中新建一个SessionFactory.cs的文件,用来做一些初始化Session,具体代码如下

    using System;

    using System.Reflection;

    using System.Data;

    using NHibernate;

    using NHibernate.Cfg;

    using NHibernate.Dialect;

    using NHibernate.Tool.hbm2ddl;

    namespace QuickStart.Tests

    {

    public class SessionFactory

    {

    private static ISessionFactory sessions;

    private static Configuration cfg;

    private static Dialect dialect;

    public SessionFactory(){}

    public static ISession OpenSession()

    {

    if(sessions==null)

    {

    BuildSessionFactory();

    }

    return sessions.OpenSession();

    }

    private static void BuildSessionFactory()

    {

    ExportSchema(new string[]{"TUser.hbm.xml"},false);

    }

    private static void ExportSchema(string[] files,bool exportschema)

    {

    cfg=new Configuration();

    for(int i=0;i<files.Length;i++)

    {

    cfg.AddResource("QuickStart."+files[i],Assembly.Load("QuickStart"));//加载hbm文件

    }

    dialect=Dialect.GetDialect();

    if(exportschema) new SchemaExport(cfg).Create(true,true);//如果数据结构不存在,则更据hbm文件创建

    sessions=cfg.BuildSessionFactory();

    }

    }

    }

    这个类的主要作用更据我们的配置文件返回一个实例化的Session。Session是Nhibernate持久化的基础,是贯穿NHibernate持久化的管理核心,提供了Save、Update、Delete、Find等持久化方法。通过这些方法,我们就可以完成对对象的增加、修改、删除、查找。

    然后我们打开Main.cs添加如下代码。

    using System;

    using System.Collections.Generic;

    using NHibernate;

    using QuickStart;

    namespace QuickStart.Console

    {

    class MainClass

    {

    public static void Main(string[] args)

    {

    ISession session=null;

    ITransaction t=null;

    try

    {

    session=SessionFactory.OpenSession();//得到Session的实例

    t=session.BeginTransaction();//事务开始

    TUser tuser=new TUser();//

    tuser.Name="Pingbo";

    session.Save(tuser);

    session.Flush();

    t.Commit();

    }

    catch(HibernateException e)

    {

    System.Console.Write(e.Message.ToString());

    if(t!=null)

    {

    try

    {

    t.Rollback();

    }

    catch(HibernateException e1)

    {

    System.Console.Write(e1.Message.ToString());

    }

    }

    }

    finally

    {

    session.Close();

    }

    System.Console.ReadLine();

    }

    }

    }

    总算是大功告成了,如果不出意外的话应该可以编译通过了。我们运行一下QuickStart.Console,在运行结束以后应该可以看到有一条记录已经被插入到数据库中

    由于我们在配置文件在把Hibernate.Show_Sql设为了True所以在运行的时候我们可以在控制台看到NHibernate产生的SQL语句。

    好了,第一个实例运行成功了,可以说我们迈出坚实的第一步,虽然整个程序十分简单,但它毕竟是一个完整的使用NHibernate程序,万事开头难,通过这个实例我们对NHibernate由陌生走向了熟悉,我在学习的过程中,花时间最多的就是如何成功运行第一段代码,只要这里成功了,下面就没有太多莫明其妙的问题,可以专心研究NHibernate的各个功能。好了先祝大家好运,能一次性成功运行代码。如果不能一次性搞定也不是没有好处,在排错过程中可以加深对NHibernate的理解。

  • 相关阅读:
    使用dozermapper,处理不了LocalDateTime的映射问题:java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()
    mybatis-plus使用Wrapper自定义sql时出现错误:Invalid bound statement (not found)
    com.baomidou.mybatisplus.core.mapper 不存在
    python爬虫
    DRF源码系列分析
    python学习目录
    脚本加载django环境
    celery定时任务
    用脚本创建django-orm数据库表数据
    关于python很吊的一项技术!!!!!
  • 原文地址:https://www.cnblogs.com/9527/p/512618.html
Copyright © 2011-2022 走看看