Dos.ORM使用教程
Dos.C#.Net使用
Dos.ORM(原Hxj.Data)于2009年发布,并发布实体生成工具。在开发过程参考了多个ORM框架,特别是NBear,MySoft、EF、Dapper等。吸取了他们的一些精华,加入自己的新思想。该组件已在上百个成熟企业项目中应用
为什么选择Dos.ORM(原Hxj.Data)?
- 上手简单,0学习成本。使用方便,按照sql书写习惯编写C#.NET代码。功能强大
- 高性能(与Dapper媲美,接近手写Sql)
- 体积小(不到150kb,仅一个dll)
- 完美支持Sql Server(2000至最新版),MySql,Oracle,Access,Sqlite等数据库
- 支持大量Lambda表达式写法,国产ORM支持度最高,开源中国ORM排行前三
- 不需要像NHibernate的XML配置,不需要像EF的各种数据库连接驱动
- 众多成熟企业软件、互联网项目已应用此框架
- 遵循MIT开源协议,除不允许改名,其它随意定制修改
- Dos团队持续更新升级,任何Bug反馈都会立即得到解决
首先·在 App.config文件中配置连接数据库字符串。或者在程序中指定
1 <connectionStrings> 2 <add name="School" connectionString="Data Source=.;Initial Catalog=School;User ID=sa;Pwd=123;"></add> 3 </connectionStrings>
然后,进行增删改操作。如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using Hxj.Data; 7 using Hxj.Data.Sqlite; 8 using System.Data; 9 10 namespace cn.School 11 { 12 class Test 13 { 14 static void Main(string[] args) 15 { 16 17 // <connectionStrings> 18 //<add name="School" connectionString="Data Source=.;Initial Catalog=School;User ID=sa;Pwd=123;"></add> 19 //</connectionStrings> 20 21 //不同的数据库可构造不同的DbSession DbSession(connectionStrings节点的name) 22 //DbSession dbs = new DbSession("School"); 23 DbSession dbs2 = new DbSession(DatabaseType.SqlServer, "Data Source=.;Initial Catalog=School;User ID=sa;Pwd=123;"); 24 25 //TestSelDB(); 26 27 //addTestDB(); 28 29 //Updata(); 30 31 //DelData(); 32 33 //sqlFrom(); 34 35 assistmethod(); 36 } 37 38 /// <summary> 39 /// 查询操作 40 /// </summary> 41 public static void TestSelDB() 42 { 43 //查询Student表中第一条数据并返回实体,代码如下。 44 Student st = DbSession.Default.From<Student>() 45 //.Select(Products._.ProductID) //查询返回ProductID字段 46 //.GroupBy(Products._.CategoryID.GroupBy && Products._.ProductName.GroupBy)//按照CategoryID,ProductName分组 47 //.InnerJoin<Suppliers>(Suppliers._.SupplierID == Products._.SupplierID)//关联Suppliers表 --CrossJoin FullJoin LeftJoin RightJoin 同理 48 //.OrderBy(Products._.ProductID.Asc)//按照ProductID正序排序 49 //.Where((Products._.ProductName.Contain("apple") && Products._.UnitPrice > 1) || Products._.CategoryID == 2)//设置条件ProductName包含”apple”并且UnitPrice>1 或者CategoryID =2 50 //.UnionAll(DbSession.Default.From<Products>().Select(Products._.ProductID))//union all查询 51 //.Distinct() // Distinct 52 //.Top(5) //读取前5条 53 //.Page(10, 2)//分页返回结果 每页10条返回第2页数据 54 //.ToDataSet(); //返回DataSet 55 //.ToDataReader(); //返回IDataReader 56 //.ToDataTable(); //返回DataTable 57 //.ToScalar(); //返回单个值 58 .ToFirst(); 59 60 //分字段查询 61 DbSession.Default.From<Student>() 62 .Select(Student._.Stu_ID, Student._.Stu_name) 63 .ToDataTable(); 64 65 //分字段查询取别名 66 DbSession.Default.From<Student>() 67 .Select(Student._.Stu_ID, Student._.Stu_name.As("pname")) 68 .ToDataTable(); 69 70 //排序倒叙排列 71 DataTable dt = DbSession.Default.From<Student>().OrderBy(Student._.Stu_ID.Desc).ToDataTable(); 72 73 } 74 75 /// <summary> 76 /// 模糊查询 77 /// 子查询 78 /// in 查询 79 /// not iN查询 80 /// </summary> 81 public static void demoSelet() 82 { 83 84 //Contain完全模糊查询 85 DbSession.Default.From<Student>().Where(Student._.Stu_ID.Contain(41500)); 86 87 //查找Stu_ID列中所有以41500开头的。 88 DbSession.Default.From<Student>().Where(Student._.Stu_ID.BeginWith(41500)); 89 90 //查找Stu_ID列中所有以41500结尾的。 91 DbSession.Default.From<Student>().Where(Student._.Stu_ID.EndWith(41500)); 92 93 //in 查询 94 DbSession.Default.From<Student>() 95 .Where(Student._.Stu_ID.SelectIn(1, 2, 3)) 96 .ToList(); 97 98 //not in查询 99 DbSession.Default.From<Student>() 100 .Where(Student._.Stu_ID.SelectNotIn<int>(1, 2, 3)) 101 .ToList(); 102 103 //子查询 104 105 //SubQueryEqual = 106 //SubQueryNotEqual <> 107 //SubQueryLess < 108 //SubQueryLessOrEqual <= 109 //SubQueryGreater > 110 //SubQueryGreaterOrEqual >= 111 //SubQueryIn in 112 //SubQueryNotIn not in 113 DbSession.Default.From<Student>() 114 .Where(Student._.Stu_ID 115 .SubQueryEqual(DbSession.Default.From<Student>().Where(Student._.Stu_ID == "Produce").Select(Student._.Stu_ID).Top(1))) 116 .ToList(); 117 } 118 119 /// <summary> 120 /// 联合查询 121 /// </summary> 122 public static void likeSel() 123 { 124 //InnerJoin inner join 125 //LeftJoin left join 126 //RightJoin right join 127 //CrossJoin cross join 128 //FullJoin full join 129 //Union union 130 //UnionAll union all 131 DbSession.Default.From<Student>() 132 .InnerJoin<Gread>(Student._.gr_id == Gread._.gr_id) 133 .ToDataTable(); 134 //联合查询带条件 135 DbSession.Default.From<Student>() 136 .LeftJoin<Gread>(Student._.gr_id == Gread._.gr_id) 137 .Where(Student._.gr_id == 1) 138 .ToDataTable(); 139 140 //这两个是两个结果的合集,union会区分结果排除相同的,union all 则直接合并结果集合。 141 142 DbSession.Default.From<Student>().Where(Student._.gr_id == 4522) 143 .UnionAll(DbSession.Default.From<Gread>().Where(Gread._.gr_id == 1)) 144 .ToList(); 145 } 146 147 /// <summary> 148 /// 增加操作 149 /// </summary> 150 public static void addTestDB() 151 { 152 //新建一个实体 153 Student stu = new Student(); 154 stu.Stu_name = "小黑"; 155 stu.stu_phon = "1254555"; 156 stu.stu_Sex = "男"; 157 stu.stu_Age = 25; 158 stu.gr_id = 1; 159 160 //开启修改 (开启修改后的添加操作将只insert赋值过的字段) 161 stu.Attach(); 162 163 //返回值 如果有自增长字段,则返回自增长字段的值 164 int result = DbSession.Default.Insert<Student>(stu); 165 166 //将插入的数据查询出来 167 List<Student> listStu = DbSession.Default.From<Student>().Where(Student._.Stu_ID == result).ToList(); 168 } 169 170 /// <summary> 171 /// 修改操作 172 /// </summary> 173 public static void Updata() 174 { 175 //先查询一个Student对象 176 Student stu = DbSession.Default.From<Student>().Where(Student._.Stu_ID.Contain(41500)).ToFirst(); 177 178 //开启修改 (修改操作之前 必须执行此方法) 179 stu.Attach(); 180 181 stu.Stu_name = "王五"; 182 List<ModifyField> list = stu.GetModifyFields(); 183 //清除修改记录 (清除后更新操作无效) 184 //stu.ClearModifyFields(); 185 //返回0表示更新失败 组件有事务会自动回滚 186 //返回1表示更新成功 187 //更新成功返回值就是受影响的条数 188 int num = DbSession.Default.Update<Student>(stu); 189 190 191 //简单的修改方法,修改一个值的时候使用 192 //int nums = DbSession.Default.Update<Student>(Student._.Stu_name, "九九", Student._.Stu_ID == 41501); 193 194 195 //修改多个值的时候 196 //Dictionary<Field, object> st = new Dictionary<Field, object>(); 197 //st.Add(Student._.stu_Sex, "男"); 198 //st.Add(Student._.Stu_name, "小徐"); 199 //int returnvalue = DbSession.Default.Update<Student>(st, Student._.Stu_ID == 41501); 200 } 201 202 203 /// <summary> 204 /// 删除操作 205 /// </summary> 206 public static void DelData() 207 { 208 209 int returnValue = DbSession.Default.Delete<Student>(Student._.Stu_ID == 41504); 210 //与上面等效的删除语句 211 //int returnvalue = DbSession.Default.Delete<Student>(2); 212 213 214 //删除一个对象 215 //Student stu = DbSession.Default.From<Student>().ToFirst(); 216 //int returnvalue = DbSession.Default.Delete<Student>(stu); 217 } 218 219 220 /// <summary> 221 /// 使用SQL语句查询 222 /// </summary> 223 public static void sqlFrom() 224 { 225 226 //直接使用SQL语句查询 227 DataTable dt = DbSession.Default.FromSql("select * from Student").ToDataTable(); 228 229 //参数化SQL语句 230 //DataTable dt1 = DbSession.Default.FromSql("select * from Student where stu_id=id").AddInParameter("id", DbType.Int32, 41500).ToDataTable(); 231 232 //多个参数查询 233 //DataTable dt2 = DbSession.Default.FromSql("select * from Student where stu_id=id or stu_name=name") 234 // .AddInParameter("id", DbType.Int32, 41500) 235 // .AddInParameter("name", DbType.String, "张三") 236 // .ToDataTable(); 237 } 238 239 240 /// <summary> 241 /// 存储过程 242 /// </summary> 243 public static void ProcDemo() 244 { 245 //"ProcName"就是存储过程名称。 246 DataTable dt = DbSession.Default.FromProc("ProcName").ToDataTable(); 247 248 249 //执行带参数的存储过程 250 DataTable dt1 = DbSession.Default.FromProc("ProcName") 251 .AddInParameter("parameterName", DbType.DateTime, "1995-01-01") 252 .AddInParameter("parameterName1", DbType.DateTime, "1996-12-01") 253 .ToDataTable(); 254 255 256 257 //AddInputOutputParameter 方法添加输入输出参数 258 //AddOutParameter 方法添加输出参数 259 //AddReturnValueParameter 方法添加返回参数 260 261 ProcSection proc = DbSession.Default.FromProc("testoutstore") 262 .AddInParameter("in1", System.Data.DbType.Int32, 1) 263 .AddOutParameter("out2", System.Data.DbType.String, 100); 264 proc.ExecuteNonQuery(); 265 266 Dictionary<string, object> returnValue = proc.GetReturnValues(); 267 268 foreach (KeyValuePair<string, object> kv in returnValue) 269 { 270 Console.WriteLine("ParameterName:" + kv.Key + " ;ReturnValue:" + Convert.ToString(kv.Value)); 271 } 272 } 273 274 /// <summary> 275 /// 辅助方法 276 /// </summary> 277 public static void assistmethod() 278 { 279 //返回 Student._.Stu_name == "小黑" 的Student._.gr_id合计。 280 int? sum = (int?)DbSession.Default.Sum<Student>(Student._.gr_id, Student._.Stu_name == "小黑"); 281 282 //返回 Student._.Stu_ID == 2 的Stu_ID平均值。 283 DbSession.Default.Avg<Student>(Student._.Stu_ID, Student._.Stu_ID == 2); 284 285 //返回 Student._.Stu_ID == 2 的Stu_ID个数。 286 DbSession.Default.Count<Student>(Student._.Stu_ID, Student._.Stu_ID == 2); 287 288 //返回 Student._.Stu_ID == 2 的Stu_ID最大值。 289 DbSession.Default.Max<Student>(Student._.Stu_ID, Student._.Stu_ID == 2); 290 291 //返回 Student._.Stu_ID == 2 的Stu_ID最小值。 292 DbSession.Default.Min<Student>(Student._.Stu_ID, Student._.Stu_ID == 2); 293 294 } 295 296 297 /// <summary> 298 /// 添加事务处理 299 /// </summary> 300 public static void TestTrans() 301 { 302 303 DbTrans trans = DbSession.Default.BeginTransaction(); 304 try 305 { 306 DbSession.Default.Update<Student>(Student._.Stu_name, "apple", Student._.Stu_ID == 1, trans); 307 DbSession.Default.Update<Student>(Student._.Stu_name, "egg", Student._.Stu_ID == 2, trans); 308 trans.Commit(); 309 } 310 catch 311 { 312 trans.Rollback(); 313 } 314 finally 315 { 316 trans.Close(); 317 } 318 319 //存储过程中的事务 (ProcName表示存储过程名称) 320 DbTrans trans1 = DbSession.Default.BeginTransaction(); 321 DbSession.Default.FromProc("ProcName").SetDbTransaction(trans); 322 323 } 324 325 326 /// <summary> 327 /// 批处理 328 /// </summary> 329 public static void batingTest() 330 { 331 //默认是10条sql执行一次。也可以自定义。 332 //DbBatch batch = DbSession.Default.BeginBatchConnection(20) 333 334 using (DbBatch batch = DbSession.Default.BeginBatchConnection()) 335 { 336 batch.Update<Student>(Student._.Stu_name, "apple", Student._.Stu_ID == 1); 337 batch.Update<Student>(Student._.Stu_name, "pear", Student._.Stu_ID == 2); 338 //执行batch.Execute(),就会将之前的sql脚本先提交。 339 //batch.Execute(); 340 batch.Update<Student>(Student._.Stu_name, "orange", Student._.Stu_ID == 3); 341 } 342 } 343 344 345 /// <summary> 346 /// 缓存 347 /// </summary> 348 public static void SetCacheTimeOutDemo() { 349 350 //SetCacheTimeOut设置查询的缓存为180秒 351 DbSession.Default.From<Student>().Where(Student._.Stu_ID == 1).SetCacheTimeOut(180).ToFirst(); 352 353 354 355 } 356 357 358 359 } 360 }
工具生成的实体类如下:
//------------------------------------------------------------------------------ // <auto-generated> // 此代码由工具生成。 // 运行时版本:2.0.50727.5485 // Support: http://www.cnblogs.com/huxj // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // </auto-generated> //------------------------------------------------------------------------------ using System; using System.Data; using System.Data.Common; using Hxj.Data; using Hxj.Data.Common; namespace cn.School { /// <summary> /// 实体类Student 。(属性说明自动提取数据库字段的描述信息) /// </summary> [Serializable] public class Student : Entity { public Student():base("Student") {} #region Model private int _Stu_ID; private string _Stu_name; private int? _stu_Age; private string _stu_Sex; private string _stu_phon; private int _gr_id; /// <summary> /// /// </summary> public int Stu_ID { get{ return _Stu_ID; } set { this.OnPropertyValueChange(_.Stu_ID,_Stu_ID,value); this._Stu_ID=value; } } /// <summary> /// /// </summary> public string Stu_name { get{ return _Stu_name; } set { this.OnPropertyValueChange(_.Stu_name,_Stu_name,value); this._Stu_name=value; } } /// <summary> /// /// </summary> public int? stu_Age { get{ return _stu_Age; } set { this.OnPropertyValueChange(_.stu_Age,_stu_Age,value); this._stu_Age=value; } } /// <summary> /// /// </summary> public string stu_Sex { get{ return _stu_Sex; } set { this.OnPropertyValueChange(_.stu_Sex,_stu_Sex,value); this._stu_Sex=value; } } /// <summary> /// /// </summary> public string stu_phon { get{ return _stu_phon; } set { this.OnPropertyValueChange(_.stu_phon,_stu_phon,value); this._stu_phon=value; } } /// <summary> /// /// </summary> public int gr_id { get{ return _gr_id; } set { this.OnPropertyValueChange(_.gr_id,_gr_id,value); this._gr_id=value; } } #endregion #region Method /// <summary> /// 获取实体中的标识列 /// </summary> public override Field GetIdentityField() { return _.Stu_ID; } /// <summary> /// 获取实体中的主键列 /// </summary> public override Field[] GetPrimaryKeyFields() { return new Field[] { _.Stu_ID}; } /// <summary> /// 获取列信息 /// </summary> public override Field[] GetFields() { return new Field[] { _.Stu_ID, _.Stu_name, _.stu_Age, _.stu_Sex, _.stu_phon, _.gr_id}; } /// <summary> /// 获取值信息 /// </summary> public override object[] GetValues() { return new object[] { this._Stu_ID, this._Stu_name, this._stu_Age, this._stu_Sex, this._stu_phon, this._gr_id}; } /// <summary> /// 给当前实体赋值 /// </summary> public override void SetPropertyValues(IDataReader reader) { this._Stu_ID = DataUtils.ConvertValue<int>(reader["Stu_ID"]); this._Stu_name = DataUtils.ConvertValue<string>(reader["Stu_name"]); this._stu_Age = DataUtils.ConvertValue<int?>(reader["stu_Age"]); this._stu_Sex = DataUtils.ConvertValue<string>(reader["stu_Sex"]); this._stu_phon = DataUtils.ConvertValue<string>(reader["stu_phon"]); this._gr_id = DataUtils.ConvertValue<int>(reader["gr_id"]); } /// <summary> /// 给当前实体赋值 /// </summary> public override void SetPropertyValues(DataRow row) { this._Stu_ID = DataUtils.ConvertValue<int>(row["Stu_ID"]); this._Stu_name = DataUtils.ConvertValue<string>(row["Stu_name"]); this._stu_Age = DataUtils.ConvertValue<int?>(row["stu_Age"]); this._stu_Sex = DataUtils.ConvertValue<string>(row["stu_Sex"]); this._stu_phon = DataUtils.ConvertValue<string>(row["stu_phon"]); this._gr_id = DataUtils.ConvertValue<int>(row["gr_id"]); } #endregion #region _Field /// <summary> /// 字段信息 /// </summary> public class _ { /// <summary> /// * /// </summary> public readonly static Field All = new Field("*","Student"); /// <summary> /// /// </summary> public readonly static Field Stu_ID = new Field("Stu_ID","Student","Stu_ID"); /// <summary> /// /// </summary> public readonly static Field Stu_name = new Field("Stu_name","Student","Stu_name"); /// <summary> /// /// </summary> public readonly static Field stu_Age = new Field("stu_Age","Student","stu_Age"); /// <summary> /// /// </summary> public readonly static Field stu_Sex = new Field("stu_Sex","Student","stu_Sex"); /// <summary> /// /// </summary> public readonly static Field stu_phon = new Field("stu_phon","Student","stu_phon"); /// <summary> /// /// </summary> public readonly static Field gr_id = new Field("gr_id","Student","gr_id"); } #endregion } } //------------------------------------------------------------------------------ // <auto-generated> // 此代码由工具生成。 // 运行时版本:2.0.50727.5485 // Support: http://www.cnblogs.com/huxj // 对此文件的更改可能会导致不正确的行为,并且如果 // 重新生成代码,这些更改将会丢失。 // </auto-generated> //------------------------------------------------------------------------------ using System; using System.Data; using System.Data.Common; using Hxj.Data; using Hxj.Data.Common; namespace cn.School { /// <summary> /// 实体类Gread 。(属性说明自动提取数据库字段的描述信息) /// </summary> [Serializable] public class Gread : Entity { public Gread():base("Gread") {} #region Model private int _gr_id; private string _gr_name; /// <summary> /// /// </summary> public int gr_id { get{ return _gr_id; } set { this.OnPropertyValueChange(_.gr_id,_gr_id,value); this._gr_id=value; } } /// <summary> /// /// </summary> public string gr_name { get{ return _gr_name; } set { this.OnPropertyValueChange(_.gr_name,_gr_name,value); this._gr_name=value; } } #endregion #region Method /// <summary> /// 获取实体中的标识列 /// </summary> public override Field GetIdentityField() { return _.gr_id; } /// <summary> /// 获取实体中的主键列 /// </summary> public override Field[] GetPrimaryKeyFields() { return new Field[] { _.gr_id}; } /// <summary> /// 获取列信息 /// </summary> public override Field[] GetFields() { return new Field[] { _.gr_id, _.gr_name}; } /// <summary> /// 获取值信息 /// </summary> public override object[] GetValues() { return new object[] { this._gr_id, this._gr_name}; } /// <summary> /// 给当前实体赋值 /// </summary> public override void SetPropertyValues(IDataReader reader) { this._gr_id = DataUtils.ConvertValue<int>(reader["gr_id"]); this._gr_name = DataUtils.ConvertValue<string>(reader["gr_name"]); } /// <summary> /// 给当前实体赋值 /// </summary> public override void SetPropertyValues(DataRow row) { this._gr_id = DataUtils.ConvertValue<int>(row["gr_id"]); this._gr_name = DataUtils.ConvertValue<string>(row["gr_name"]); } #endregion #region _Field /// <summary> /// 字段信息 /// </summary> public class _ { /// <summary> /// * /// </summary> public readonly static Field All = new Field("*","Gread"); /// <summary> /// /// </summary> public readonly static Field gr_id = new Field("gr_id","Gread","gr_id"); /// <summary> /// /// </summary> public readonly static Field gr_name = new Field("gr_name","Gread","gr_name"); } #endregion } }
一叶乘风自飘流,飘零四海散忧愁!