NHibernate实现CRUD

来源:互联网 发布:python 截断文件 编辑:程序博客网 时间:2024/05/01 20:29

[代码] hibernate.cfg.xml

view source
print?
01<?xml version="1.0" encoding="utf-8" ?>
02<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
03 <session-factory>
04  <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
05  <property name="connection.connection_string">
06   Data Source=zhou;Initial Catalog=AspNetStudy;User ID=sa;Password=jerry;
07  </property>
08  <property name="adonet.batch_size">10</property>
09  <property name="show_sql">true</property>
10  <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
11  <property name="use_outer_join">true</property>
12  <property name="command_timeout">10</property>
13  <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
14  <property name="proxyfactory.factory_class">
15   NHibernate.ByteCode.Castle.ProxyFactoryFactory,
16   NHibernate.ByteCode.Castle
17  </property>
18  <mapping assembly="NHibernateDemo"/>
19 </session-factory>
20</hibernate-configuration>

[代码] UserInfo.hbm.xml

view source
print?
01<?xml version="1.0" encoding="utf-8" ?>
02<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
03 assembly="NHibernateDemo" namespace="NHibernateDemo">
04 <class name="UserInfo">
05  <id name="UserId" column="UserId">
06   <generator class="native"/>
07  </id>
08  <property name="UserName"/>
09  <property name="RealName"/>
10  <property name="Age"/>
11  <property name="Sex"/>
12  <property name="Mobile"/>
13  <property name="Phone"/>
14  <property name="Email"/>
15 </class>
16</hibernate-mapping>

[代码] UserInfo.cs

view source
print?
01using System;
02using System.Collections.Generic;
03using System.Text;
04  
05namespace NHibernateDemo
06{
07    /// <summary>
08    /// 数据库中UserInfo表的持久化类
09    /// 作者:周公
10    /// 博客地址:http://blog.csdn.net/zhoufoxcn
11    /// 日期:2010-03-19
12    /// </summary>
13    public class UserInfo
14    {
15        public virtual int UserId { get; set; }
16        public virtual string UserName { get; set; }
17        public virtual string RealName { get; set; }
18        public virtual int Age { get; set; }
19        public virtual bool Sex { get; set; }
20        public virtual string Mobile { get; set; }
21        public virtual string Phone { get; set; }
22        public virtual string Email { get; set; }
23    }
24}

[代码] NHibernateCRUD.cs

view source
print?
001using System;
002using System.Collections.Generic;
003using System.Text;
004using Iesi.Collections;
005using NHibernate;
006using NHibernate.Cfg;
007  
008namespace NHibernateDemo
009{
010    /// <summary>
011    /// 说明:这个类是为了演示NHibernate中的CRUD的用法
012    /// 作者:周公(周金桥)
013    /// 日期:2010-03-07
014    /// </summary>
015    public class NHibernateCRUD
016    {
017        private ISessionFactory sessionFactory;
018        public NHibernateCRUD()
019        {
020            sessionFactory = new Configuration().Configure().BuildSessionFactory();
021        }
022  
023        public ISession GetSession()
024        {
025            return sessionFactory.OpenSession();
026        }
027        /// <summary>
028        /// 统计用户总数
029        /// </summary>
030        /// <returns></returns>
031        public int Count()
032        {
033            #region 方法一
034            //ISession session = GetSession();
035            //ISQLQuery query = session.CreateSQLQuery("select count(1) from UserInfo");
036            //int count = query.List<int>()[0];
037            //session.Close();
038            //return count;
039            #endregion
040  
041            #region 方法二
042            ISession session = GetSession();
043            IQuery query = session.CreateQuery("select count(c.UserId) from UserInfo c");
044            //注意:不能对于count函数不能使用query.List<int>(),因为默认返回的数值类型是long
045            //否则会抛出GenericADOException,异常描述是:Could not execute query[SQL: SQL not available]
046            //InnerException: System.ArgumentException,InnerException描述是:"值“*”不是“System.Int32”类型,不能在此泛型集合中使用。/r/n参数名: value
047            int count =(int)(query.List<long>()[0]);
048            session.Close();
049            return count;
050            #endregion
051        }
052        /// <summary>
053        /// 创建用户
054        /// </summary>
055        /// <param name="info">用户实体</param>
056        /// <returns></returns>
057        public int Create(UserInfo info)
058        {
059            ISession session = GetSession();
060            int newId=(int)(session.Save(info));
061            session.Flush();
062            session.Close();
063            return newId;
064        }
065        /// <summary>
066        /// 读取用户信息
067        /// </summary>
068        /// <param name="userId">用户编号</param>
069        /// <returns></returns>
070        public UserInfo Read(int userId)
071        {
072            ISession session = GetSession();
073            UserInfo info=session.Get<UserInfo>(userId);
074            session.Close();
075            return info;
076        }
077        /// <summary>
078        /// 更新用户信息
079        /// </summary>
080        /// <param name="info">用户实体</param>
081        /// <returns></returns>
082        public void Update(UserInfo info)
083        {
084            ISession session = GetSession();
085            session.Update(info);
086            session.Flush();
087            session.Close();
088        }
089        /// <summary>
090        /// 删除用户
091        /// </summary>
092        /// <param name="userId">用户编号</param>
093        /// <returns></returns>
094        public void Delete(int userId)
095        {
096            ISession session = GetSession();
097            //在NHibernate中支持直接使用参数值、":"+参数名、?(类似于在Access中使用参数化SQL语句的方式,给参数赋值要按照参数出现的顺序来)等几种方式
098            IQuery query = session.CreateQuery("delete from UserInfo where UserId=:UserId");
099            //如果采用":"+参数名方式使用参数,那么给参数赋值时不需要在参数名前加":"号,如query.SetInt32(":UserId", userId);就会报错
100            query.SetInt32("UserId", userId);
101            int affectedRows = query.ExecuteUpdate();
102            session.Close();
103            //return affectedRows;
104        }
105  
106        /// <summary>
107        /// 删除用户
108        /// </summary>
109        /// <param name="userId">用户实体</param>
110        /// <returns></returns>
111        public void Delete(UserInfo info)
112        {
113            ISession session = GetSession();
114            session.Delete(info);
115            session.Flush();
116            session.Close();
117        }
118  
119        /// <summary>
120        /// 获取用户表中编号最大的用户
121        /// </summary>
122        /// <returns></returns>
123        public int GetMaxUserId()
124        {
125            ISession session = GetSession();
126            IQuery query=session.CreateQuery("select max(UserId) from UserInfo");
127            int userId=query.List<int>()[0];
128            session.Close();
129            return userId;
130        }
131    }
132}

[代码] 单元测试 NHibernateTest.cs

view source
print?
01using System;
02using System.Collections.Generic;
03using System.Linq;
04using System.Text;
05using NUnit.Framework;
06using NHibernateDemo;
07  
08namespace NUnitTest
09{
10    [TestFixture]
11    public class NHibernateTest
12    {
13        private NHibernateCRUD instance = null;
14        [SetUp]
15        public void Initialize()
16        {
17            instance = new NHibernateCRUD();
18        }
19        [Test]
20        /// <summary>
21        /// 统计用户总数
22        /// </summary>
23        /// <returns></returns>
24        public void Count()
25        {
26            Assert.Greater(instance.Count(), 0);
27        }
28        [Test]
29        /// <summary>
30        /// 创建用户
31        /// </summary>
32        /// <param name="info">用户实体</param>
33        /// <returns></returns>
34        public void Create()
35        {
36            UserInfo info = new UserInfo()
37            {
38                Age = 12,
39                Email = "zzz@ccav.com",
40                Mobile = "13812345678",
41                Phone = "01012345678",
42                RealName = "测试" + DateTime.Now.Millisecond.ToString(),
43                Sex = true,
44                UserName = "zhoufoxcn" + DateTime.Now.Millisecond.ToString()
45            };
46            instance.Create(info);
47        }
48        [Test]
49        /// <summary>
50        /// 读取用户信息
51        /// </summary>
52        /// <param name="userId">用户编号</param>
53        /// <returns></returns>
54        public void Read()
55        {
56            UserInfo info = instance.Read(1);
57            Assert.NotNull(info);
58        }
59        [Test]
60        /// <summary>
61        /// 更新用户信息
62        /// </summary>
63        /// <param name="info">用户实体</param>
64        /// <returns></returns>
65        public void Update()
66        {
67            UserInfo info = instance.Read(1);
68            info.RealName = "测试" + DateTime.Now.Millisecond.ToString();
69            instance.Update(info);
70        }
71        [Test]
72        /// <summary>
73        /// 删除用户
74        /// </summary>
75        /// <param name="userId">用户编号</param>
76        /// <returns></returns>
77        public void DeleteByID()
78        {
79            int userId = instance.GetMaxUserId();
80            instance.Delete(userId);
81        }
82  
83        [Test]
84        /// <summary>
85        /// 删除用户
86        /// </summary>
87        /// <param name="userId">用户实体</param>
88        /// <returns></returns>
89        public void Delete()
90        {
91            int userId = instance.GetMaxUserId();
92            UserInfo info = instance.Read(userId);
93            Console.WriteLine("MaxUserId=" + userId);
94            instance.Delete(info);
95        }
96    }
97}