• [Nhibernate]sqlite数据库基本使用


    目录

    写在前面

    操作步骤

    总结

    写在前面

    昨天有朋友问我在nhibernate中如何使用sqlite数据库,当时实在忙的不可开交,下周要去山西出差,实在没空,按我的说法使用sqlite跟使用sqlserver,本质上其实没啥区别,nhibernate的配置文件不同而已,而且在下载nhibernate的时候,他已经提供了针对不同的数据库的模版了。你只需在这基础上修改即可。

    别人问到了,再加上即将的项目中需要用到sqlite数据库,就也趁着这股风总结一下,算是弄一个在nhibernate中使用sqlite的模版吧。

    操作步骤

    可视化工具:http://www.oschina.net/news/43608/5-popular-and-free-sqlite-management-tools

    SqliteSpy:http://www.yunqa.de/delphi/doku.php/products/sqlitespy/index

    说到sqlite,得创建一个sqlite数据库啊,上面的工具,你可以选择一个用着顺手的工具使用,我这里就使用sqlitespy这个工具,新建一个shop数据库,新建一个userinfo的数据表。

    下载sqlite的dll:http://www.sqlite.org/,或者使用Nuget安装

    创建数据表的sql语句

    1 create table UserInfo
    2 (
    3 ID int primary key  not null,
    4 UserName nvarchar(32),
    5 Gender bit,
    6 Age int,
    7 Address nvarchar(128)
    8 )

    如图:

    新建个测试用的项目,项目结构如图所示:

    关于项目结构就不进行说明了,项目名称已经比较清楚了。

    项目Wolfy.Data和Wolfy.UnitTest需要引用System.Data.SQLite.dll,并把SQLite.Interop.dll放在bindebug下(因为这个dll是引用不了的)。

    从下载的nhibernate中找到sqlite的数据库的配置模版

    将名称修改为hibernate.cfg.xml,复制到单元测试项目下,并修改该文件的属性为始终复制,内容如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <!-- 
     3 This template was written to work with NHibernate.Test.
     4 Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it 
     5 for your own use before compile tests in VisualStudio.
     6 -->
     7 <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
     8     <session-factory name="NHibernate.Test">
     9         <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
    10         <property name="connection.connection_string">
    11             Data Source=nhibernate.db
    12         </property>
    13         <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
    14     </session-factory>
    15 </hibernate-configuration>

    修改内容,使其使用于当前项目

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
     3   <session-factory name="sqlite_session">
     4     <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property>
     5     <property name="connection.connection_string">
     6       Data Source=C:UsersWolfyDesktopSQLiteSpy_1.9.8Shop.db3
     7     </property>
     8     <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
     9     <mapping assembly="Wolfy.Domain"/>
    10   </session-factory>
    11 </hibernate-configuration>

    注意,把不必要的注释去掉,避免不不要的麻烦。

    通用NHibernateHelper类

    测试用的持久化类

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Wolfy.Domain.Entity
     8 {
     9     /// <summary>
    10     /// 用户持久化类
    11     /// </summary>
    12     public class UserInfo
    13     {
    14         /// <summary>
    15         /// 用户标识
    16         /// </summary>
    17         public virtual int ID { set; get; }
    18         /// <summary>
    19         /// 用户姓名
    20         /// </summary>
    21         public virtual string UserName { set; get; }
    22         /// <summary>
    23         /// 性别
    24         /// </summary>
    25         public virtual bool Gender { set; get; }
    26         /// <summary>
    27         /// 年龄
    28         /// </summary>
    29         public virtual int Age { set; get; }
    30         /// <summary>
    31         /// 住址
    32         /// </summary>
    33         public virtual string Address { set; get; }
    34     }
    35 }

    对应的持久化类的映射文件,UserInfo.hbm.xml并修改其属性生成操作为“嵌入资源”

     1 <?xml version="1.0" encoding="utf-8" ?>
     2 <hibernate-mapping  xmlns="urn:nhibernate-mapping-2.2" assembly="Wolfy.Domain"  namespace="Wolfy.Domain.Entity">
     3   <class name="Wolfy.Domain.Entity.UserInfo,Wolfy.Domain" table="UserInfo">
     4     <!--主键 如果没有设置值则默认为0-->
     5     <id name="ID" type="Int32" unsaved-value="0">
     6       <column name="ID" sql-type="int" not-null="true" unique="true"/>
     7       <!--主键自增-->
     8       <generator class="increment"></generator>
     9     </id>
    10     <property name="UserName" type="String">
    11       <column name="UserName" sql-type="nvarchar"  not-null="false"/>
    12     </property>
    13     <property name="Gender" type="Boolean">
    14       <column name="Gender" sql-type="bit" not-null="false"></column>
    15     </property>
    16     <property name="Age" type="Int32">
    17       <column name="Age" sql-type="int" not-null="false"></column>
    18     </property>
    19     <property name="Address" type="String">
    20       <column name="Address" sql-type="nvarchar"  not-null="false"/>
    21     </property>
    22   </class>
    23 </hibernate-mapping>

    在Wolfy.Data下添加类UserInfoData

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 using NHibernate.Cfg;
     7 using NHibernate;
     8 using Wolfy.Domain.Entity;
     9 namespace Wolfy.Data
    10 {
    11     /// <summary>
    12     /// 用户数据层操作
    13     /// </summary>
    14     public class UserInfoData
    15     {
    16         /// <summary>
    17         /// 添加用户
    18         /// </summary>
    19         /// <param name="userInfo"></param>
    20         /// <returns></returns>
    21         public bool AddUserInfo(UserInfo userInfo)
    22         {
    23             ISession session = NHibernateHelper.GetOcextSession();
    24             using (ITransaction trans = session.BeginTransaction())
    25             {
    26                 try
    27                 {
    28                     session.SaveOrUpdate(userInfo);
    29                     session.Flush();
    30                     trans.Commit();
    31                     return true;
    32                 }
    33                 catch (Exception)
    34                 {
    35                     trans.Rollback();
    36                     return false;
    37                     throw;
    38                 }
    39             }
    40         }
    41     }
    42 }

    在单元测试项目下添加DataTest.cs进行单元测试,如下

     1 using System;
     2 using Microsoft.VisualStudio.TestTools.UnitTesting;
     3 using Wolfy.Domain.Entity;
     4 using Wolfy.Data;
     5 
     6 namespace Wolfy.UnitTest
     7 {
     8     [TestClass]
     9     public class DataTest
    10     {
    11         private UserInfoData _userInfoData;
    12         public DataTest()
    13         {
    14             _userInfoData = new UserInfoData();
    15         }
    16         [TestMethod]
    17         public void AddUserInfoTest()
    18         {
    19             bool result = _userInfoData.AddUserInfo(new UserInfo()
    20             {
    21                 Address = "北京",
    22                 Age = 25,
    23                 Gender = true,               
    24                 UserName = "wolfy"
    25             });
    26             Assert.IsTrue(result);
    27         }
    28     }
    29 }

    添加一个用户wolfy,并断言结果为true,即添加成功,测试结果,使用sqlitespy工具查看sqlite数据库中的数据

    关于查删改的操作类似,就不再进行测试了。

    总结

     弄一个sqlite数据库的配置,其实也没多大难度,关键还是nhibernate的配置文件,及持久化类的映射文件这块,你把这两个弄通了,其他的都好说,基本上类似,比如映射文件,你完全可以把内容复制到其他持久化类的映射文件中,并在这个基础上改吧改吧就是一个新的,关键还是第一步,你有没有走通。总结就到这里吧,你在使用的过程中,如果用到sqlite,可以将上面nhibernate配置文件和userinfo的映射文件作为模版,使用的时候,就在这基础上改吧改吧就行了。本文已加入Nhibernate系列:http://www.cnblogs.com/wolf-sun/p/4138918.html

    demo地址:http://pan.baidu.com/s/1c0F6cSC

  • 相关阅读:
    Ubuntu上使用Latex
    Ubuntu18.04 解压文件名乱码的解决方法
    Android 编译 opencv
    android 使用编译好的sdk
    https协议加密原理介绍(一)
    java 面试题目 class.forName和load的区别
    给进程设置环境变量
    Maven 编译jdk配置
    Docker积累
    潜谈单例模式
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/4160578.html
Copyright © 2020-2023  润新知