【补充1:《ORM使用过程中的常见问题和说明》在 http://www.wojilu.com/Forum1/Topic/152 】
【补充2:wojilu ORM 支持垂直分库(比如可以将某些表放在数据库a,某些表放在数据库b中……),具体做法见本文末尾说明。】
wojilu ORM 尽量设计得简单易用,从下图可以看出,总共也就9个方法(重载方法不算)。
下面举一些例子来演示:
findById
Article article = Article.findById( 2 );
findAll
List<Article> list = Article.findAll();
find
说明:本方法最强大,一般的查询、搜索都使用本方法。
List<Article> list = Article.find( "Title=:t and IsDelete=:isdel" )
.set( "t", "" )
.set( "isdel", 1 )
.list();
List<Article> list = Article.find( "Title=:t and IsDelete=:isdel" )
.set( "t", "" )
.set( "isdel", 1 )
.first();
参数化查询说明1(id in 的特殊处理)
List<TCat> cats = db.find<TCat>( "Id in (:id1,:id2,:id3)" )
.set( "id1", 6 )
.set( "id2", 7 )
.set( "id8", 8 )
.list();——这句是对的。或者拼接ids,不使用参数化
注意,不应该是List<TCat> cats = db.find<TCat>( "Id in (:ids)" )
.set( "ids", "6,7,8" )
.list();——这句是错误的
更多说明在这里:http://www.wojilu.com/Forum1/Topic/1108
参数化查询说明2(like语句中的特殊处理)
正确的做法是:Post.find("Status=0 and Title like '%'+:t+'%'").set("t",t).list()
注意:不是 Post.find("Status=0 and Title like '%:t%'").set("t",t).list()——这是错误做法,注意区分。
findPage
DataPage<Article> plist = Article.findPage( "IsDelete=0" );
int rd = plist.RecordCount;
int pageCount = plist.PageCount;
string pagerBar = plist.PageBar;
List<Article> list = plist.Results;
findBySql
List<Article> list = Article.findBySql( "select * from Article" );
说明:更多直接sql查询请看教程《直接运行sql语句》。
count
int articleCount = Article.count( "IsDelete=0" );
insert
Article article = new Article();
...
article.insert();
update
Article article = Article.findById( 2 );
article.Title = "my new title";
article.update();
update( string property )
Article article = Article.findById( 2 );
article.Title = "my new title";
article.update( "Title" );
updateBatch
Article.updateBatch( "set IsDelete=1", "CategoryId=2" );
delete
Article article = Article.findById( 2 );
article.delete();
deleteBatch
Article.deleteBatch( "CategoryId=2" );
以上方法看似简单,实际上可以对付95%的数据操作需求,尤其是第三个find方法,采用参数化查询方式,可以做大多数事情。
另外的 5% 的需求,您可以使用ORM内置的方法,直接运行原生的sql语句(运行sql教程参看此处),也是非常方便的。
在设计 wojilu ORM 的时候,改版了好多次,曾经的接口方法要多很多,也复杂很多。比如曾经有一个 findBy( string property, object val ) 方法,看似很有用,在实际项目中进行统计之后,才发现用到的地方极少,就砍掉了,万一需要,您也可以通过find方法实现。
这就是 wojilu ORM 的设计原则:简洁!简洁!简洁!实用!实用!实用!
【表名称和数据字段自定义】
默认情况下,对象名称和表名称是相同的,属性名称和数据字段名称也是相同的。但你可以修改两者之间的映射关系,如果属性名称和字段名称不一致的话。
[Table("你的表名称")]
public class Article {
[Column(Name="你的列名称")]
public String Name {get;set;}
}
如上图蓝色部分,加上 Column 批注,可以映射字段,加上 Table 批注,可以映射表名称。
【时间类型】
DateTime 类型的属性,如果不赋值,ORM默认会插入当前时间,即 DateTime.Now
【货币类型】
如果要使用货币类型或者小数,做法是必须打上批注,要么打上 [Money] 批注,要么打上 [Decimal( Precision=10, Scale=5)] 批注。前者 money批注使用(19,4)的精度定义;后者由你自定义。
比如——
[Money]
public decimal ProductPrice { get; set; }
或者
[Decimal( Precision=10, Scale=5)]
public decimal ProductPrice { get; set; }
【直接使用.net原生对象,直接操作sql】
比如你要使用复杂的sql联表语句进行统计,你可以绕开ORM,直接使用.net原生对象。因为wojilu框架作为一个.net平台下的框架,它和.net不是矛盾的关系。它能够让开发过程更加快速可靠,而不是说用了wojilu,就不能使用.net原生的方法了。在使用wojilu不方便的或力所不及的地方,仍然可以直接使用.net原生的方法。——这也就是为什么使用 wojilu framework 可以开发出“我记录网站综合系统”这个无所不包的系统的原因,因为.net能做的,它都能做到。你可以理解为,wojilu什么都能做。
举个例子,使用wojilu ORM 可以应付95%以上的数据操作,但对于另外的5%的复杂查询,比如一些多表的联表检索和复杂统计,wojilu ORM就不擅长(其实任何一个ORM都不擅长复杂的查询和统计)。这时候,你可以直接使用.net 原生的command来操作,教程参看:http://www.wojilu.com/common/page/166 即使作为一个通用的第三方数据库查询组件,wojilu orm也是极其优秀、极其方便的。
【wojilu ORM 配置】
--------------------------------------
【垂直分库说明】
以用户表独立的例子,配置文件中相关内容如下——
ConnectionStringTable : {
default:"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=wojilu.mdb",
feeddb:"server=127.0.0.1;uid=sa;pwd=aa;database=feed;",
userdb:"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=wojiluUser.mdb"
},
DbType : {
default:"access",
feeddb:"sqlserver",
userdb:"access"
},
Mapping:[
{ name:"wojilu.Apps.Reader.Domain.FeedSource", database:"feeddb" },
{ name:"wojilu.Apps.Reader.Domain.FeedEntry", database:"feeddb" },
{ name:"wojilu.Members.Users.Domain.User", database:"userdb" }
],
上面配置指明:
FeedSource 和 FeedEntry 不再从默认数据库中读取数据,而是从 feeddb 中读取数据。
User 用户数据不再从默认数据库中读取,而是从 userdb 中读取。
不用修改源码,重启一下网站就直接生效。