NHibernate

===============================
注:示例使用 NHibernate-2.1.0.GA

数据库表:
Id:int,主键,自动增长.
Name:varchar(50),可空。

一、生成实体和映射文件: https://blog.csdn.net/zhaolijing2012/article/details/38314883
       1)安装CodeSimth,下载nhibernate模板(包含4个文件:NHibernate.class.cst、NHibernate.cst、NHibernate.hbm.cst、NHibernate.inc),双击NHibernate.cst(会自动用CodeSmith打开).
           OutputDirectory:生成文件保存位置。
           SourceDatabase:设置数据库连接。
           Assemby:程序集。
           ForceId:强制所有表都必须有主键。
           Namespace:命名空间.
      点击“Generate”按钮生成类和映射文件。

二、新建类库(NHBDemo.Models):Assembly和Namespace与生成代码和映射文件时设置的保持一致。
      把生成的.cs和.xml拷贝到类库中,并 把xml文件的生成操作设置为嵌入的资源(必须这么设置,否则找不到映射文件)。

三、:新建一个控制台程序(NHBDemo):
     添加引用:NHibernate.dll、NHibernate.ByteCode.LinFu.dll、log4net.dll、Antlr3.Runtime.dll。

四、配置数据库连接:(可以参考 Configuration_Templates\MSSQL.cfg.xml )
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate" requirePermission="false"/>
  </configSections>
  MSSQL.cfg.xml 中的hibernate-configuration节点拷贝到这里再改下连接字符串
</configuration>

五:操作数据库: ISessionISessionFactoryITransationIQueryICriteria
class Program
    {
        static ISessionFactory factory = null;/*缓存了映射关系等,很占内存,应该只生成一个实例,因此factory设计为单件模式比较好.*/
        static void Main(string[] args)
        {
            //全局初始化:
            Configuration cfg = new Configuration(). AddAssembly("NHBDemo.Models");
            factory = cfg. BuildSessionFactory();

            //Insert();

            //Select(1);

            //Update(1, "abc");

            //Delete(5);

            Query();

            Console.ReadLine();
        }
        static void Insert()
        {
            var session = factory. OpenSession();
            var trans = session. BeginTransaction();
            var person = new Person()
            {
                Name = "测试-" + DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")
            };
            try
            {
                session. Save(person);
                trans.Commit();
            }
            catch (Exception ex)
            {
                trans.Rollback();
            }
           
        }
        static void Select(int id)
        {
            var session = factory.OpenSession();
            var person=session. Get<Person>(id);//根据主键查询.
            Console.WriteLine("Id:"+person.Id+",Name:"+person.Name+"");
        }
        static void Update(int id,string name)
        {
            var session = factory.OpenSession();
            var trans = session.BeginTransaction();
            var person = session.Get<Person>(id);
            person.Name = name;
            try
            {
                session. Update(person);
                trans.Commit();
            }
            catch (Exception ex)
            {
                trans.Rollback();
            }
           
        }
        static void Delete(int id)
        {
            var session = factory.OpenSession();
            var trans = session.BeginTransaction();
            var person = session.Get<Person>(id);
            try
            {
                session. Delete(person);
                trans.Commit();
            }
            catch (Exception ex)
            {
                trans.Rollback();
            }
           
        }
        static void Query()
        {
            var session = factory. OpenSession();
            //session.CreateQuery(...)返回IQuery.参数中的SQL语句就是HQL。
            //var personList = session.CreateQuery("from Person").List<Person>();
            //var personList = session.CreateQuery("from Person where Name like '%a%'").List<Person>();
            //var personList = session.CreateQuery("from Person where t_Name like '%a%'").List<Person>();//假如数据库中字段为t_Name,与实体对应的字段为Name,那么这样写是可以的。
            //var personList = session.CreateQuery("select * from Person").List<Person>();//错误,不符合HQL语法.
            //var personList = session.CreateQuery("select p from Person p").List<Person>();//正确,符合HQL语法.

            //参数
            //var query = session. CreateQuery("from Person p where p.Id>?");
            //query.SetParameter(0, 2);//0表示第1个参数即第一个问号.
            //var personList = query.List<Person>();

            //var query = session.CreateQuery("from Person p where p.Id>:id");
            //query.SetParameter("id", 2);
            //var personList = query.List<Person>();

            //表达式
            //ICriteria crt = session.CreateCriteria(typeof(Person));
            //crt.Add(Expression.Eq("Name", "Test_1"));
            //var personList = crt.List<Person>();

            // 分页
            var pageSize = 10;
            var pageNo = 1;
            ICriteria crt = session. CreateCriteria(typeof(Person));
            var personList = crt
                .SetFirstResult(pageSize * (pageNo < 1 ? 0 : pageNo - 1))
                .SetMaxResults(pageSize)
                .List<Person>(); 

            foreach (var person in personList)
            {
                Console.WriteLine("Id:" + person.Id + ",Name:" + person.Name + "");
            }

            //统计
            var count = session.CreateQuery("select count(p.Id) from Person p").List()[0];
            Console.WriteLine("count:"+count+"");

        }
    }
注:示例文件:NHibernate-5.1.1-bin\Tests\ABC.hbm.xml
===============================
SessionFactory占内存用 单件模式

配置文件中show_sql设置为true,那么,例如在session.Save()时,会在调试窗口打印出sql语句。

trans需要的时候再trans=session.BeginTransation()开启事务.

IQuery,HQL语句,支持泛型和Linq.

插入:Save(),更新:Updatet();

配置关系映射:

配置数据库链接:
\NHibernate-5.1.1-bin\Configuration_Templates

参数可以用"?",也可以用":参数名"

IQuery:ExecuteUpdate()可以执行insert、update、delete.--不建议这么做,视频中没有搞成功,一直报异常。

多表查询、继承:视频教程中没有,以后继续总结。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值