Dos.ORM学习
因为公司使用.net+dosORM开发,所以对常用的语句做个小结,一方面为了巩固,一方面不知道。
开始
查询第一条数据并返回实体:
List products=DbSession.Default.From().Where(Products._.ID==2).ToList();
也可以返回其他类型 ToDateTable();ToDateSet();
查询,在于构造一个查询条件
FromSection,查询的字段,排序,分页都是FromSection 提供
dbsession.default.from<>().
.distinct()
.Top(5)
太复杂的报表使用手写sql或者存储过程实现‘
Products p=new Products();
//开启修改 但是我一般不这样写修改
p.Attach();
//获取页面中输入的值
entityUtils.updateModel(p,“txt_”);
//返回值 插入操作
int returnValue=dbsession.default.insert§;
//查询
//什么是自增长字段
Dictionary<field,object> dic=new Dictionary<Field,object>();
dic.Add(name,“apple”);
dic.Add(level,20);
int returnValue=Dbsession.default.update(dic,id==1);
//就是将需要修改的字段,值放到字典中,根据条件去更新。
关于如何直接执行sql语句
dbsession.default.fromsql(“select * from products”).toDateTable();
可以添加参数
DbSession.Default.FromSql(“select * from products where productid=pid”)
.AddInParameter(“pid”, DbType.Int32, 1)
.ToDataTable();
//这里看上去不太习惯 添加参数过程
DbSession.Default.FromSql("select * from products where productid=pid or categoryid=cid")
.AddInParameter("pid", DbType.Int32, 1)
.AddInParameter("cid", DbType.Int32, 2)
.ToDataTable();
addInParamter方法需要传进去三个参数
返回类型可以有很多种
这一块,下午刚刚学习了mysql中的存储过程,看上去大体上相似。
首先创建存储过程
create procedure “sale by year”
@Beginning_Date DateTime,@Ending_Date DateTime AS
select A.shippedDate
from A inner join B on A.id=B.id
where A.shipDate between @Beginning_Date and @Ending_Date
执行带参数的存储过程
DbSession.Default.FromProc(“sale by year”)
.AddInParameter(“Beginning_Date”,DbType.DateTime,“1999-02-2”)
.AddInParameter()
.ToDataTable();
??什么是方法添加返回参数
AddReturnValueParameter
返回参数值
ProcSection proc=Dbsession.Default.FromProc(“testoutstore”)
.addoutParameter(“in1”,Int32,1);
proc.ExecuteNonQuery();//
Dictionary<string,object> returnValue=proc.GetReturnValues();
foreach(KeyValuePair<string ,object> kv in returnValue){
Response.Write(“ParameterName:”+kv.Key+“returnValue:”+Convert.ToString(kv.Value));
}
//扩展 关于executeNonQuery()
执行sql,返回一个整型变量,如果对数据库记录进行操作,返回操作受影响条数;如果是创建表,创建成功后返回-1.
1、sum方法
dbsession.default.sum<表>(条件);
2、avg
3、count
dbsession.default.count<表>(条件);
4、max
5、min
通过注册事件生成sql
dbsession.default.registerSqlLogger(database_OnLog);
private string sql;
void database_onLog(string logMsg){
sql+=logMsg;
}
通过执行以下,注销注册事件
dbsession.default.unregisterSqlLogger(datebase_onLog);
1/完全模糊
Products._.ProductName.Contain(“apple”)
2/左匹配
Products._.ProductName.BeginWith(“apple”)
3/in查询
Where(Products._.CategoryID.SelectIn(1,2,3))
4/not in 对应方法
是SelectNotIn
一样
三表以上关联
from().
innerjoin(A.id==B.id)
.innerjoin(C.cid==B.cid)
.where(A._.country==“usa”)
.toDataTable();
下面 关于union和unionAll
union会区分结果排除相同的,union all直接合并结果集合。
分页中如果没有指定排序。组件会默认一个排序来实现分页。
当然也可以自己指定,如:
orderby(products._.categoryId.asc)
通过groupby设置按照哪些字段分组
这个看着有点奇怪
dbsession.default.from()
.groupby(A.id.groupby)
.select(A.name)
.todatatable();
这个挺重要的,之前也听困扰我,做个小结。
给字段起别名,select productname as pname from products
在dos中,select(products._.productName.As(“pname”))
字段是一个field类 表示字段信息
field.count(); 记录数
field.trim() 去掉左右空格
field.left(int length) 从左边开始截取相应长度内容
field.substring(int startindex.int endindex) 截取相应范围内的字段内容
组件对于事务的封装做的不是很简洁,大体如下
using(DbTrans trans=DbSession.default.beginTransaction()){
dbsession.default.update(products..productName,“apple”,products..productID==1,trans);
trans.commit();
}
下面是他的try_catch写法
DbTrans trans = DbSession.Default.BeginTransaction();
try
{
DbSession.Default.Update<Products>(Products._.ProductName, "apple", Products._.ProductID == 1, trans);
DbSession.Default.Update<Products>(Products._.ProductName, "egg", Products._.ProductID == 2, trans);
trans.Commit();
}
catch
{
trans.Rollback();
}
finally
{
trans.Close();
}
可以看到,添加了一个回滚和一个关闭数据库的操作;
另外,存储过程和直接执行sql也是可以添加事务。
也可以设置事务级别,如下
DbTrans trans=dbsession.default.beginTransaction(isolationLevel.readCommitted);
关于事务的更新内容:
改成这样:
{
trans.Update(Products._.ProductName,“apple”);
trans.commit();
}
看上去简洁了,忘掉前面的做法
用的不多
提交的脚本不是马上执行,而是到一定数量才提交
using (DbBatch batch=dbsession.default.beginBatchConnection()){
batch.update(Products._.ProductName,“apple”);
等多条
}
默认是10条执行一次,也可自定义
dbBatch batch=dbsession.default.beginBatchConnection(20)
有封装好的方法,这里就不写了。
组件自动转换类型
dbsession.default.from().select(products._.productID).top(1).toscalar();
开启缓存
enable=“true”
表示缓存60秒
缓存的存在,减少了连接数据库的次数,提高效率。
1、刷新缓存,不从缓存中读取,直接从数据库读,然后重新缓存。
dbsession.default.from().where(Products._.ProductID==1).Refresh().ToFirst();
2、设置查询的缓存有效期
dbsession.default.from().where(products._.productID==1).setCacheTimeOut(180).ToFirst();
1、配置数据库连接
2、
Dbsession session=new Hxj.Data.Dbsession( “sqliteconnectionString”);
using(Hxj.data.DbBatch batch=session.BeginBatchConnection()){
for(int i=0;i<100;i++){
test t=new test();
batch.Insert(t);
}
}
批量添加100条数据。
没有看懂
有点累了 不想写了
新领域
操作数据的入口,之前一直用的都是dbsession.default
推荐在实际项目中创建dbsession
什么是log4net
之前版本中,每增加一个条件都是生成一个新的whereClip,实际上会引起资源浪费
现在使用:
WhereClipBuilder wherebuilder=new WhereClipBuilder();
whereclipbuilder.And(kkkkk);
whereclipbuilder.Or(dsffd);
好了,常用的工具小结就先告一段落。