===============================
注:示例使用 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>
五:操作数据库: ISession、 ISessionFactory、 ITransation、 IQuery、 ICriteria。
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.--不建议这么做,视频中没有搞成功,一直报异常。
多表查询、继承:视频教程中没有,以后继续总结。
注:示例使用 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>
五:操作数据库: ISession、 ISessionFactory、 ITransation、 IQuery、 ICriteria。
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.--不建议这么做,视频中没有搞成功,一直报异常。
多表查询、继承:视频教程中没有,以后继续总结。