orm存储过程
1. mybatis算是orm框架吗,可以更换底层数据库吗
1、定义
mybatis是一个支持普通sql查询,存储过程和高级映射的优秀持久层框架。
2、使用原因
mybatis消除了几乎所有的jdbc代码和参数的手工设置以及对结果集的检索封装。mybatis可以使用简单的xml或注解用于配置和原始映射
2. 关于.net项目 框架选取(orm或其他) ,中型电子商务网站,使用什么框架比较好(性能、效率、易维护)
你说的3个都是数据库ORM框架,如果你不熟悉,项目时间不多,就不要用了,
使用EnterpriseLibrary调用SQL或存储过程,这样比较简单,性能可以说最好
网上搜的三层架构EnterpriseLibrary源码,很多的
3. 谈谈如何从本质上理解SQL语句、存储过程与ORM之间的联系和取舍
存储过程就是stored procere, 简写为sp。 ORM就是对象-关系映射,比如Hibernate。 大多数的.NET程序都是会围绕sql服务器展开,经常要面临在这些技术间进行选择。所以我们需要来理解这些技术的本质。 一,演变 刚开始的时候,只有sql语句,即可以用交互模式一句一句执行, 也可以用批模式执行,多行sql语句一次提交执行。 很快人们发现用批模式执行的一堆sql语言可以用过程的形式,事先存放到数据库里面,这就变成了存储过程。 随着面向对象技术的成熟,从程序中可以自动生成sql语句,这就是ORM。 二,性能 很多人会说存储过程比sql语句性能好,其实这个说法并不精确。 在这种情况下,性能差不多。 但是,如果我们不注意,很有可能,把可以一次提交的sql,变成了多次提交,甚至是每个循环做了一次提交,那么性能就很差了。 也就是说如果使用sql,只要写法得当,性能和sp区别不大。 同样的道理,ORM的性能取决于ORM的Sql生成算法, 和用户使用的时候,对生成算法的控制,比如利用好Lazy laoding等,在某些情况下,甚至可以不通过sql,毕竟没有sql比最优化的sql还要快。 三,可维护性 可维护性是选择sql,sp,orm最主要的因素。 这里面有点”玄“,因为不同的场景会得出不同的结论,俗称“It depends"。 刚开始的时候,sql的维护性看起来是最差,因为它往往散布在程序的每个角落。而存储过陈都放在数据库中,有清晰接口。 但是如果我们做一次重构,情况居然会颠倒过来。 首先,存储过程完全可以照搬到C#中,sp的名字直接变成method的名字,sp的参数表直接变成method的参数表,(其实就是Command模式)。 其次,把这些methdod放到一个文件或者文件夹中。(所谓的DAL层,如果喜欢层的话) 通过这个重构,我们获得了以下的好处: 1,首先是过程的调用和过程的定义放到了一起,修改起来比较方便。IDE都有定义跳转功能。 2,过程的调用和定义同时进行版本控制,不会出现不匹配的情况。减少了sp的参数表和调用的不匹配,包括拼写,类型,参数次序 3,单元测试非常方便 当然sp也有存在的价值,比如所谓的安全性,后面会提到。比如友好的调试环境,对于中小型项目,和初级程序员来说,也是很好的选择。 ORM则将可维护性提升身到了一个新的高度,它试图将sql屏蔽起来,在操作对象的同时,自动就把数据库的事情给办了。 ORM有两种模式,一种是ActiveRecord, 一种是Datamapper,前者从数据库中读取定义,后者在程序中定义。不过由于前者往往用migration来生成数据库,其实也是定义在程序里面的。好的ORM都有"leaking"的设计,也就是留了个”后门“,让你有机会用sql来控制。 微软的linq从某个角度类说,也是一种ORM, 它的设计思想可能是因为它觉得写sql语句比写c#代码效率高,所以提供直接在C#中写sql语句的机制,再自动生成真正的sql。不过,ORM真正价值在于它可以在恰当的时候,完全抛弃sql,比如比如读用cache,写用queue。而微软的linq,完全是“无厘头”的风格,在O中用R的写法,难道是RRM, 唯一的好处只是锁定程序和程序员在微软的平台上。 四,安全性 对企业来说,安全性有的时候比性能更重要,由于存储过程在数据库上多加了一道屏障,所以很多企业会把存储过程作为首选。 ORM可以说是安全性最差的, 因为只有到程序运行起来,你才能知道,会产生什么样的sql。 但是保证安全有许多方法和方面,比如部署前的测试, 数据库的备份,对表的权限的设置。等。用sp来保证安全,只是多个选项中的一个。 在startup型企业中,高级程序员往往起到主导作用, 所以他们会不犹豫的选择ORM。
4. oracle11g 存储过程
下了个简单的调用存储过程的代码:
//存储过程调用的字符串格式{call 存储过程名(参数1|参数2)} 无惨也可以
String sql="{call getCouserInfo(?,?,?)}";
CallableStatement cs=conn.prepareCall(sql);
//为第一个问号赋值
cs.setInt(1, 1);
//因为第二,三个问号代表的是输出参数,所以只需要指定返回类型就可以了
cs.registerOutParameter(2, java.sql.Types.VARCHAR);
cs.registerOutParameter(3, java.sql.Types.INTEGER);
cs.execute();
//返回输出参数中的值
String name=cs.getString(2);
int score=cs.getInt(3);
(2)没有返回参数,但是有结果集的时候
//存储过程调用的字符串格式{call 存储过程名(参数1|参数2)} 无惨也可以
String sql="{call getAllCourse()}";
CallableStatement cs=conn.prepareCall(sql);
ResultSet rs=cs.executeQuery();
5. 现在的数据库开发还经常用到游标吗
准确的说 是数据库编程有越来越少的趋势 特别是ORM工具的风靡 以及mysql构建集群的低成本
在构建集群时,你会发现,使用存储过程会很头痛(表分割,分布式计算等)所以,现在这些逻辑处理,一般都放在应用程序那里(如java,c#),再加上hibernate这些orm工具的使用,所以,存储过程有渐渐没落的趋势。至于游标,普通的,如果你不使用orm工具,直接jdbc什么的连接上去,那用游标还是很正常的。
另外,在数据编程中,能不用游标,还是尽量少用。
一般的,你可以使用如下两个方法去解决使用游标这个矛盾:
一是尽量将语句,通过sql原生代码去生成结果集
二是可以使用%ROWTYPE;这些语句去作为变量
当然,在结果集输出的时候,用游标是可以的,你要保证,你每一个使用游标的地方,都是为了直观的输出数据或者变量赋值,而不是为了加工处理游标中的数据。
6. C#环境,MVC模式时,ORM怎么处理分表的问题
我不太清楚mvc,怎么实现数据banding的,但是我到csla架构中,很容易实现这个问题,就是将一条完整的记录,分成4个部分,然后就很容易拆分成4个对象,然后分别对应4个控件绑定4个对象,这样很容易能控制,想更改那一个对象的数据,前提满足表的约束条件,比如吧,你的主键有好几个field组成,你就不能把部分的更改,部分忽略。你可以顺着这个思路,去处理。
7. 如何在c#代码里调用oracle存储过程
rotected void Button2_Click(object sender, EventArgs e)
{
String oc = ConfigurationManager.ConnectionStrings["conn"].ToString();
OracleConnection conn = new OracleConnection(oc);
conn.Open();
OracleCommand orm = conn.CreateCommand();
orm.CommandType = CommandType.StoredProcere;
orm.CommandText = "proc1";
orm.ExecuteNonQuery();
conn.Close();
8. 如何编写带有ORM的三层架构,最好给个例子看看。
ORM可以这么理解:
一般的,我们把系统所需要的数据放在数据库中。而显示给用户的页面中使用的数据是通过读取数据库并进一步处理得到的。
而数据库中的数据是结构的。
我们需要的.net编程中的数据时面向对象整合了的。
故:我们需要一种机制,可以把数据库中的结构性的数据转换为面向对象的数据。于是就出现了系统架构中常见的3层架构:
底层:DAL(Data Access Layer,数据访问层)
中间:BLL (Bussiness Logic Layer,业务逻辑层)
顶层:UI层~
DAL中,我们使用实体类完成对数据库表的封装:
例如:我们构建一个文章管理系统。需要以下表
[Articles] [Categories] [Comments]
以[Articles]为例,包含的字段:
[ArticleID] [Title] [Content] [AddedBy] [AddedDate]
DAL层对应的实体类为[ArticleDetails]
包含以下属性[ArticleID] [Title].......等5个属性,以此对应表的5个字段。
对应DB中的3个表,我们有3个实体类。
创建类SqlArticlesProvider 来完成对DB的操作的封装。
通常每个方法封装一个存储过程~
例如:GetArticles(int categoryID)方法中。
我们连接DB,调用SP,并将返回的DataReader封装到实体类集合List<ArticleDetails>中。以用于传输给BLL层。
BLL层:
之中的类称为域对象。有[Article] [Category] [Comment]
这里的每个类就是我们传统OOP中的类。
每个对象包含描述自己的属性和可执行行为的方法。
UI层,直接调用BLL层的类以获取数据,并通过数据绑定控件显示的页面等~
说的有点乱。。。光这么着说确实不是特别充分。。
而且真正实践编程起来,比这个复杂。。
三层架构之后的系统更易于维护。变更底层数据存储,需要改动的地方非常少。
故,主要是用于大中型系统架构。
而且现在推出LINQ后,对编码量也降低了。但是单独学习LINQ,时间也不会少。
如果不要LINQ的话,还是有很多工具代码可以帮助自动的构建一些类的~
9. ASP.NET中如何执行各种类型的存储过程
看到这个手写的类,就知道还是手工作坊的产物。
在实际项目中从不用手写数据访问类,用微软给的,或者用MSORM直接生成,
比这样手写,更快,更安全,代码量更少,调用更方便。
---------------------------
代码重用目地在于提高生产力,
并不是你写一个类就永垂不朽了,
而是要在需求有变更的情况下,能够复用和扩展。
你可以看看.NET里面的ORM是如何进行代码复用和扩展的,
观察一下数据库结构以及存储过程改变的情况下,代码是如何变化的。
事实上,完全不需要手动编码。
能够应付更加复杂的应用场景和需求变更,才能提高生产力,才能被称之为面向对象。
10. 如何用ServiceStack.OrmLite执行存储过程,并将结果以DataTable形式返回
和调用sql语句一样,执行“exec 存储过程名 参数1,参数2”,然后存储过程中需要执行一个查询语句,那么执行存储过程就是执行这个查询语句,结果也就是一张表,其他的都和sql语句一样了