[Nhibernate]sqlite数据库基本使用

[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 )

如图:

[Nhibernate]sqlite数据库基本使用

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

[Nhibernate]sqlite数据库基本使用

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

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

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

[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:\Users\Wolfy\Desktop\SQLiteSpy_1.9.8\Shop.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数据库中的数据

[Nhibernate]sqlite数据库基本使用

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

总结

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

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

转载于:https://www.cnblogs.com/wolf-sun/p/4160578.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109627.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • math.random()随机整数_随机函数rand公式

    math.random()随机整数_随机函数rand公式Math.round(Math.random()*x);Math.round(Math.random()*(y-x)+x);Math.ceil(Math.random()*x);

  • IP地址划分[通俗易懂]

    IP地址划分[通俗易懂]IP地址划分1IP地址分类(1)A类IP地址一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”,地址范围:1.0.0.1——126.255.255.254二进制表示为:00000001000000000000000000000001——01111110111111111111111111111110可用的A类网络有126个,每个网络能容纳…

  • 矩阵的行列式、秩的意义

    矩阵的行列式、秩的意义线性代数真是一个很抽象的东西,即使我们很多人都学过,但是我相信绝大部分的都不知道这是干嘛用的,找了不少资料,终于发现了这么一篇好文章,于是强烈希望可以和大家分享,帮助大伙进一步理解矩阵的行列式和秩的本质意义。1关于面积:    一种映射 大家会说,面积,不就是长乘以宽么,其实不然。我们首先明确,这里所讨论的面积,是欧几里得空间几何面积的基本单位:平行四边形的面积。平行四边形面积

  • Java把string转json格式_java实体类转json字符串

    Java把string转json格式_java实体类转json字符串做项目时遇到一个错误:其实这个错误也是一种广义的序列化错误,指将对象转换为JSON格式的字符串出现异常;狭义的序列化指:将对象转换为字节反序列化指:将字节转换成对象★Java对象—–>JSON格式字符串用到的API:1.先new一个ObjectMapper对象ObjectMapperom=newObjectMapper();StringjsonStr=om.writeValueAsString(传入java对象);System.ou..

  • linux 进程抓包命令,linux抓包命令之tcpdump详解[通俗易懂]

    linux 进程抓包命令,linux抓包命令之tcpdump详解[通俗易懂]顾名思义,tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息,tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具.实用命令实例:(1).默认启动#普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包.[[…

  • 海洋测绘 知识点 详细

    海洋测绘 知识点 详细一、第一章海洋测绘概述第一节、海洋测绘的发展第二节、世界海洋新格局1.海洋法公约的一些主要概念与定义:(1)内海:也叫内水,指的是领海基线以内的水域,国家对其享有完全排他性主权(2)领海:领海向外延伸12海里的区域(1海里(nmi)=1.852千米(km),沿海国主权管辖下与其海岸或内水相邻的一定宽度的海域,是国家领土的组成部分(3)毗邻区:毗邻国家领海,并在领海外一定宽度的,供沿…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号