存储过程相当难说,将t-sql语句放入存储过程预编译后可以加快执行速度,但又时不时会将业务放入存储过程中,还会对orm产生不好的影响
1. 创建一个存储过程 用 Menus表为处理对象
(
@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结节
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. 访问方法
{
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的里面
<return class="llr.Models.Menu,llr.Models"/>
exec proc_select @id=:id,@title=:title
</sql-query>
访问
如果sql-squery放错位置了就会报下面这个错误
Named query not known: tt
先到这~最近时间不大够用。其它的学习就靠大家自己的提升了。谢谢
如果不想用配置文件来执行存储过程,那你就在代码里面当成 sql语句用吧
session.CreateSQLQuery("exec proc_select ?,?").setXXX() 之类的
再这里下载全部代码