NHibernate 学习 第十二天 存储过程的使用

存储过程相当难说,将t-sql语句放入存储过程预编译后可以加快执行速度,但又时不时会将业务放入存储过程中,还会对orm产生不好的影响

 

1. 创建一个存储过程 用 Menus表为处理对象

 

create   proc   [ dbo ] . [ pro_insert ]
(
    
@title   nchar ( 10 ),
    
@url   nchar ( 10 ),
    
@parent   int ,
    
@mid   int
)
as  
    
declare   @u   nchar ( 10 )
    
set   @u   =   ' proc ' + @url

    
insert   into  Menus 
    
values ( @mid , @title , @parent , @u )

@u 是为了看到数据是由程序过程来决定的 , 注意注意: 存储过程的参数顺序就按表结构来,但主键要放到最后,这是规定

 

2. 修改Menu.hbm.xml

 添加一个sql-insert结节

< sql-insert >
      exec pro_insert ?,?,?,?
    
</ sql-insert >

并对其<generator class="assigned"/>的值进行调整,如果主键是自增的就参考以下几个参数

native:根据底层数据库的能力选择identity、sequence 或者hilo 中的一个。  --》 主键是自增的

increment :生成类型为Int64、Int16 或Int32 的标识符,只当没有其他进程同时往同一个表插入数据时,能够保持唯一性。
附:
• identity:对DB2、MySQL、SQL Server、Sybase 数据库内置标识字段提供支
持。数据库返回的标识符用Convert.ChangeType 加以转换,因此能够支持任何整型。
• sequence:在DB2、PostgreSQL、Oracle 数据库中使用序列或者Firebird 的
生成器。数据库返回的标识符用Convert.ChangeType 加以转换,因此能够支持任何
整型。
• hilo:使用一个高/低位算法高效地生成Int64、Int32 或Int16 类型的标识符。给
定一个表和字段(默认分别是hibernate_unique_key 和next_hi)作为高位值的来
源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。如果是用户提供的连
接,不要使用此生成器。

 3.  访问方法

 

  public   static   void  Insert(Menu m)
        {
            
using  (ITransaction ts  =  session.BeginTransaction())
            {
                
try
                {
                    session.Save(m);
                    ts.Commit();
                }
                
catch  (Exception ex)
                {
                    ts.Rollback();
                }
            }
        }

大家发现了嘛,跟原来的是一样的,其实就是由sql-insert标签来控制,如果配置文件里面有,则按配置文件里面的来

修改和删除就交给大家自己去完成了再看一下查询的

 添加一个sql-query 标签

 注意 sql-query 放在class标签的外面 hibernate-mapping的里面

< sql - query name = " tt " >
      
< return   class = " llr.Models.Menu,llr.Models " />
      exec proc_select @id
= :id,@title = :title
    
</ sql - query >

访问

 

return  session.GetNamedQuery( " tt " ).SetInt32( " id " 0 ).SetString( " title " "" ).List < Menu > ();

 

如果sql-squery放错位置了就会报下面这个错误

Named query not known: tt 

先到这~最近时间不大够用。其它的学习就靠大家自己的提升了。谢谢

如果不想用配置文件来执行存储过程,那你就在代码里面当成 sql语句用吧

session.CreateSQLQuery("exec proc_select ?,?").setXXX() 之类的

 

再这里下载全部代码

 全部源代码

你可能感兴趣的:(Hibernate)