最近用到SSH(spring+struct+hibernate),从java里面的hibernate,不自觉联系到.net里面的Nhibernate。
下面来简单聊下Nhibernate.
主要有三个:
基本的就这三个,其他的,比如Castle.Core.dll,Castle.DynamicProxy2.dll,Iesi.Collections.dll,log4net.dll
就用到了再引入吧。
<?xml version="1.0" encoding="utf-8"?> <!-- This template was written to work with NHibernate.Test. Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it for your own use before compile tests in VisualStudio. --> <!-- This is the System.Data.dll provider for SQL Server --> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > <!--表明一些配置是针对session-factory配置的,sessionfactory是hibernate中的一个类,这个类主要负责保存hibernate的配置信息,以及对session的操作--> <session-factory> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property><!--配置数据库的驱动程序,hibernate在连接数据库时,需要用到数据库的驱动程序--> <property name="connection.connection_string">server=ZB-LIUHCH-PC\SQLEXPRESS;database=TestMemcached;uid=sa;pwd=123456;</property> <!--Server=ZB-LIUHCH-PC\SQLEXPRESS;UserID=sa;Database=TestMemcached;Password=123456;--> <property name="adonet.batch_size">10</property> <property name="show_sql">true</property> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <!--<property name="use_outer_join">true</property>--> <property name="command_timeout">10</property> <property name="hbm2ddl.auto">update</property> <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> <mapping assembly="NhibernateTest"/> </session-factory> </hibernate-configuration>
PS:文件属性为始终复制到输出路径;
实体类:
namespace NhibernateTest { public class User { public virtual string UserCode { get; set; } public virtual string UserName { get; set; } public virtual string UserAge { get; set; } } }
配置文件:
<?xml version="1.0" encoding="utf-8" ?> <!--assembly:程序集,namespace:命名空间--> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NhibernateTest" namespace="NhibernateTest"> <class name="NhibernateTest.User,NhibernateTest" table="User"> <!--主键--> <id name="UserCode" type="string" unsaved-value="null"> <column name="UserCode" sql-type="nvarchar" not-null="true" unique="true"/> <generator class="assigned"></generator> </id> <property name="UserName" type="String"> <column name="UserName" sql-type="nvarchar" not-null="false"/> </property> <property name="UserAge" type="String"> <column name="UserAge" sql-type="nvarchar" not-null="false"/> </property> </class> </hibernate-mapping>
为了方便操作使用nhibernate,最好编写一个工具类:
public class NHibernateHelper { private ISessionFactory _sessionFactory; public NHibernateHelper() { //创建ISessionFactory _sessionFactory = GetSessionFactory(); } /// <summary> /// 创建ISessionFactory /// </summary> /// <returns></returns> public ISessionFactory GetSessionFactory() { //配置ISessionFactory return (new Configuration()).Configure().BuildSessionFactory(); } /// <summary> /// 打开ISession /// </summary> /// <returns></returns> public ISession GetSession() { return _sessionFactory.OpenSession(); } }
之后我们写四段代码来简单看看CRUD操作:
static void Main(string[] args) { Configuration configuration = new Configuration().Configure("hibernate.cfg.xml"); //nhibernate的配置文件的路径 ISessionFactory sessionFactory = configuration.BuildSessionFactory(); ISession isession = sessionFactory.OpenSession(); #region 添加用户 User user = new User() { UserName="漠漠水田飞白鹭", UserAge="789", UserCode="momoshuitianfeibailu" }; isession.Save(user); //isession.Flush(); //isession.Close(); #endregion #region 读取用户信息 User MyUser = isession.Get<User>("momoshuitianfeibailu"); #endregion #region 更新用户信息 MyUser.UserAge="00000000"; isession.Update("momoshuitianfeibailu", MyUser); #endregion #region 删除数据 isession.Delete(MyUser); isession.Flush(); isession.Close(); #endregion }
整个项目结构:
小结:
以前在配置spring的时候就有这种感觉,感觉java平台下面的配置文件和。net平台下的配置文件配置起来大致是雷同的,还是蛮有意思的。
另一方面,与之前使用过的EF相比,EF因为有三种开发模式,code first,DB first, Model First,选择性比较大,如果我不想配置那么多文件,完全可以直接db first,之后各种东西就生成了,我直接用一个上下文参数就可以操作数据库。而Nhibernate的配置文件则要手写,万一我一手抖,写错一个字母,debug就耗费好多时间。
但是Nhibernate感觉比EF轻量一点儿,而且Nhibernate的透明持久化,这个特性挺有意思的,与EF相比,可以说它是基于Session的,不是长连接。
个人感觉就这么多啦。。