NHibernate小结之三

这次主要用的数据库是sql server 2005,而里面还有图片要存放,所以这里写个例子对图片等二进制数据的存放进行操作。

 

代码还是上传到csdn,地址上传后再定。

 

开发环境:vs2008sp1, nunit, nhibernate1.21

 

先新建一个空项目或一个控制台程序,名字为HiberDemo2。

加入必要的dll文件,并设置为复制到项目中。

 

还是老规矩,建Domain和Mappings目录分别放pojo类和hbm.xml文件。

这次先写pojo吧,Domain目录下面新建一个Friends.cs

  1.     public class Friends
  2.     {
  3.         virtual public int id { getset; }
  4.         virtual public string name { getset; }
  5.         virtual public byte[] pic { getset; }
  6.     }

 

再是Mapping中建立对应的Friends.hbm.xml

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="HiberDemo2" namespace="HiberDemo2.Domain">
  3.     <class name="Friends">
  4.         <id name="id">
  5.             <generator class="native"></generator>
  6.         </id>
  7.         <property name="name"/>
  8.         <property name="pic" type="BinaryBlob" length="9000"/>
  9.     </class>
  10. </hibernate-mapping>

 

然后在根目录中建立hibernate.cfg.xml配置文件

  1. <?xml version="1.0" ?>
  2. <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
  3.     <session-factory>
  4.         <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
  5.         <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
  6.         <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
  7.         <property name="connection.connection_string">Server=USER;Initial Catalog=MyTest;User Id=sa;Password=sa</property>
  8.         <property name="show_sql">true</property>
  9.         <mapping file="Mappings/Friends.hbm.xml"/>
  10.     </session-factory>
  11. </hibernate-configuration>

 

这里说明一下,关键是hbm.xml文件中图片字段用的是 type="BinaryBlob" length="9000", 对应于pojo中的byte[]类型。这个配置的来源是在NH的使用手册的5.2小节NHibernate Types中有专门的讲述,具体来说手册中是以列表来说明NH中的类型与.net中类型的对应关系。那么应用到我们的例子,NH中的BinaryBlob类型,对应于byte[],所以在hbm.xml中用NH的类型配,而POJO中直接写.net中的对应类型即可!!

另外,在sql server2005中,varbinary是对应的类型。但如果你不给长度或者长度小于8000,它会将长度设为8000或以下,这样只能读取很小的二进制文件,所以为了将其设为varbinary(max),可以读取2G文件的,在hbm.xml中一定要设置长度大于8000,这样创建表的sql语句才会自动生成正确的语句,其sql语句见本文后面。

但长度只写9000是不是会小呢,从我的例子来看,我的图片字节大小有444k之大,读取并写入磁盘文件后没有问题,所以这里应该是可以的。

 

下面就是测试了。

新建一个test目录,建一个testFriends类进行测试。

测试的内容有 1.创建对应的表 2.写入一个POJO  3.读出一个POJO,并把图片写到文件中。代码如下:

  1. namespace HiberDemo2.test
  2. {
  3.     [TestFixture]
  4.     public class testFriends
  5.     {
  6.         private static Configuration cfg;
  7.         private static ISession session;
  8.         [TestFixtureSetUp]
  9.         public void Initall()
  10.         {
  11.             cfg = new Configuration();
  12.             cfg.Configure();
  13.             session = cfg.BuildSessionFactory().OpenSession();
  14.         }
  15.         [Ignore]
  16.         public void testCreate()
  17.         {
  18.             new SchemaExport(cfg).Create(truetrue);
  19.         }
  20.         [Test]
  21.         public void testSave()
  22.         {
  23.             var fs = new FileStream("c:/temp/001.jpg", FileMode.Open);
  24.             var reader = new BinaryReader(fs);
  25.             var f = new Friends();
  26.             f.name = "f1";
  27.             f.pic = reader.ReadBytes((int) fs.Length);
  28.             reader.Close();
  29.             fs.Close();
  30.             session.BeginTransaction();
  31.             session.Save(f);
  32.             session.Transaction.Commit();
  33.             
  34.         }
  35.         [Test]
  36.         public void testRetreive()
  37.         {
  38.             var l = session.CreateCriteria(typeof(Friends)).List();
  39.             Assert.Greater(l.Count, 0);
  40.             var f = (Friends) l[0];
  41.             var fs = new FileStream("c:/temp/mypic.jpg", FileMode.Create);
  42.             var writer = new BinaryWriter(fs);
  43.             writer.Write(f.pic);
  44.             writer.Close();
  45.             fs.Close();
  46.             
  47.         }
  48.     }
  49. }

 

 

其中testCreate只是在第一次测试中单独运行,后面不用再测试了,所以后面改成了Ignore标签。它输出下面的建表sql语句

 

  1. if exists (select * from dbo.sysobjects where id = object_id(N'Friends') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Friends
  2. create table Friends (
  3.   id INT IDENTITY NOT NULL,
  4.    name NVARCHAR(255) null,
  5.    pic VARBINARY(MAX) null,
  6.    primary key (id)
  7. )

写入数据的时候,在上面代码的28行处,请你自己改图片的路径。

testRetrieve运行完后,在c:/temp/目录下应该有一张mypic.jpg图片。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值