Getting Started

一、 引入Loogn.OrmLite

    PM> Install-Package Loogn.OrmLite

二、引入名称空间

    using Loogn.OrmLite;

三、开始使用

   using (var db = new SqlConnection("server=.;uid=sa;pwd=sa;database=test"))
   {
       var flag = db.Insert(new Person { Id = 23 });
       if (flag > 0)
       {
           var person = db.SingleById<Person>(23);
       }
   }

一般可以把连接对象的创建封装起来:

    public static class DB
    {
        public static IDbConnection Open()
        {
            return new SqlConnection("server=.;uid=sa;pwd=sa;database=test");
        }

        //public static IDbConnection OpenOther()
        //{
        //    return new SqlConnection("server=.;uid=sa;pwd=sa;database=other");
        //}
    }

使用起来就更简单了:

    using (var db = DB.Open())
    {
        // do something with db
    }

Model

一个纯净的Model


   public class Person
   {
       public int Id { get; set; }
       public string Name { get; set; }
       public DateTime UpdateTime { get; set; }
       public DateTime AddTime { get; set; }
   }

一个带有Attribute的Model

    //指定表明
    [OrmLiteTable("t_person")]
    public class Person
    {
        //整体修改时使用主键,如果自增可以使用InsertIgnore指定插入时忽略
        [OrmLiteField(IsPrimaryKey = true, InsertIgnore = true)]
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime UpdateTime { get; set; }

        //整体修改时忽略
        [OrmLiteField(UpdateIgnore = true)]
        public DateTime AddTime { get; set; }

        //整体修改,添加时忽略
        [OrmLiteField(Ignore = true)]
        public List<string> SomeAttrs { get; set; }
    }

插入

  • 使用model插入,返回影响行数
    var person = new Person { Name = "loogn" };
    var flag = db.Insert(person);
  • 使用model插入,返回自增列值(long)
    var person = new Person { Name = "loogn" };
    var autoId = db.Insert(person,true);
  • 使用匿名对象插入,返回影响行数
    var flag = db.Insert("Person",new { Name="loogn" });
  • 使用匿名对象插入,返回自增列值(long)
    var autoId = db.Insert("Person",new { Name="loogn" },true);
  • 使用字典插入,返回影响行数
    var flag = db.Insert("Person",DictBuilder.Assign("Name","loogn").Assign("Age",23));
  • 使用字典插入,返回自增列值(long)
    var autoId = db.Insert("Person",DictBuilder.Assign("Name","loogn").Assign("Age",23),true);

DictBuilder生成的是 Dictionary<string, object>的子类

  • 使用模型批量插入
    var list = new List<Person>()
    {
         new Person{ Name="p1"},
         new Person{ Name="p2"}
    };
    var boolFlag = db.InsertAll(list);
  • 使用匿名对象批量插入
    var list = new List<object>()
    {
            new { Name="p1"},
            new { Name="p2"}
    };
    var boolFlag = db.InsertAll("Person",list);

修改

  • 根据主键修改model,返回影响行数
    var person = new Person { Id = 23, Name = "update name", Age = 28 };
    var flag = db.Update(person);
    //or 指定修改列
    var flag = db.Update(person,"Name","Age");
  • 根据条件修改指定列
    var fields = DictBuilder.Assign("name", "updateName").Assign("$age", "age+1");
    var ps = DictBuilder.Assign("id", 23);
    var flag = db.Update<Person>(fields, "id=@id", ps);
    //or
    var flag = db.Update("person",fields, "id=@id", ps);

fields中 $age列表示不参数化,直接使用后面的值,如上会生成 update person set name=@name,age=age+1 where id=23

  • 根据主键修改指定列
    var fields = DictBuilder.Assign("name", "updateName").Assign("$age", "age+1");
    var flag = db.UpdateById<Person>(fields, 23);
    //or
    var flag = db.UpdateById("person", fields, 23);
  • 根据某列修改指定列
    var fields = DictBuilder.Assign("name", "updateName").Assign("$age", "age+1");
    var flag = db.UpdateById<Person>(fields,"loogn", "Name");
    //or
    var flag = db.UpdateById("person", fields, "loogn", "Name");
  • 根据主键修改某一列
    var flag = db.UpdateFieldById<Person>("name","update name",1);
    //update person set name=@name where id=1; @name='update name'
  • 根据某列修改某一列
    var flag = db.UpdateFieldById<Person>("name","update name",23,"age");
    //update person set name=@name where age=23; @name='update name'
  • 匿名对象修改,表和匿名对象要包含ID列
    var flag = db.UpdateAnonymous("person", new {Name="new name",Id=2});
    //or
    var flag = db.UpdateAnonymous<Person>(new {Name="new name",Id=2});
    //update person set Name=@name where Id=2 ; @name ="new name"
  • 批量修改model
    var list = new List<Person>()
    {
          new Person{ Id=1, Name="new name1"},
          new Person{ Id=2, Name="new name2"}
    };
    var flag = db.UpdateAll(list);

查询

  • 根据id查询一条数据
    var person=db.SingleById<Person>(1);
    //or
    var person=db.SingleById<Person>(1,"_id");
  • 根据条件查询一条数据
    var person=db.Single<Person>("age>10 and sex=1");
    //select * from person where age>10 and sex=1

    var person=db.Single<Person>("age>10 and Name=@name", DictBuilder.Assign("name", "abc"));
    //select * from person where age>10 and Name=@name; @name='abc'

    var person=db.Single<Person>("select ID,Name from Person where age>10 and sex=1");
    //原始sql
    var person=db.Single<Person>("select ID,Name from Person where age>10 and name=@name", DictBuilder.Assign("name", "abc"));
    //原始sql带参数
  • 参数化查询语句
    var person=db.SingleFmt<Person>("select ID,Name from Person where age>{0} and sex={1}",10,1);
  • 根据单个查询条件查询单条数据
    var person= db.SingleWhere<Person>("id",23);
  • 使用字典条件查询单条数据
    var person= db.SingleWhere<Person>(DictBuilder.Assign("name","loogn").Assign("age",23));
  • 使用匿名对象作为条件查询单条数据
    var person= db.SingleWhere<Person>(new{ Name = "loogn", Age=23});
  • 查询全部
    var list=db.Select<Person>();
  • in查询
    var list=db.SelectByIds<Person>(new int[] { 1, 2, 3 });
    //select * from person where id in (1,2,3);
    var list=db.SelectByIds<Person>(new string[] { "1", "2", "3" },"userId");
    //select * from person where userId in ("1","2","3");
    var list=db.SelectByIds<Person>(new string[] { "1", "2", "3" },"userId","id,name");
    //select id,name from person where userId in ("1","2","3");
  • 返回多个结果集
    var cmds = new MutipleCmd[] {
            new MutipleCmd{ CmdText="select * from person"},
            new MutipleCmd{ CmdText="select count(0) from person where id=@id",Params=DictBuilder.Assign("id",23)},
            new MutipleCmd{ CmdText="select top 1 * from User where age>23"},
    };
    using (var fetcher = db.SelectMutipleResult(cmds))
    {
        var personList = fetcher.FetchList<Person>();   //对应第一个命令
        var personCount = fetcher.FetchScalar<int>();   //对应第二个命令
        var user = fetcher.FetchObject<User>();         //对应第三个命令
    }

其他Select和上面Single方法类似

  • 分页查询
    var pageResult = db.SelectPage<Person>(new OrmLitePageFactor
    {
        Conditions = "id>2 and age=@age",
        Fields = "ID,Name",
        OrderBy = "ID desc",
        PageIndex = 1,
        PageSize = 10,
        Params = DictBuilder.Assign("age", 23)
    });
    //也可以连接查询
    var pageResult = db.SelectPage<Person>(new OrmLitePageFactor
    {
        Conditions = "p.id>2 and p.age=@age",
        Fields = "p.*,t.Name as TypeName",
        OrderBy = "p.ID desc",
        PageIndex = 1,
        PageSize = 10,
        Params = DictBuilder.Assign("age", 23),
        TableName="Person p inner join Type t on p.Typeid=t.id"
    });

查询2

  • 查询数量
    long count = db.Count<Person>();
    // select count(0) from Person;
    long count = db.Count<Person>("id>@id", DictBuilder.Assign("id", 1));
    long count = db.Count<Person>("id>@id", new { id=1});
    // select count(0) from person where id=@id; @id=1

    long count = db.CountWhere<Person>("age", 1);
    // select count(0) from Person where age=@age ; @age=1

    long count = db.CountWhere<Person>(DictBuilder.Assign("age", 23).Assign("name", "loogn"));
    long count = db.CountWhere<Person>(new { age=23, name="loogn" });
    // select count(0) from person where age=@age and name=@name; @age=23,@name="loogn";
  • 查询最大值
    long maxid= db.MaxID<long>("person");
    // select max(id) from person 

    string maxid= db.MaxID<string>("person","userid");
    // select max(userid) from person 
  • 查询首行首列Scalar
    int id= db.Scalar<int>("select id from Person where id=23")
    string name= db.Scalar<string>("select name from Person where age>@age",new { age=23})
  • 查询单列值(主要是返回值)
    List<string> nameList = db.Column<string>("select name from person where age>@age", DictBuilder.Assign("age", 23));
    HashSet<string> nameSet = db.ColumnDistinct<string>("select distinct(name) from person");
  • 查询字典值(主要是返回值)
    Dictionary<int,string> typeDict = db.Dictionary<int,string>("select id,name from Type");
    // id 和 name 一一对应的时候可以使用
  • 查询一对多值(主要是返回值)
    Dictionary<int, List<string>> lookUp = db.Lookup<int, string>("select userid,tagName from userTag");
    // 一个userid对应多个tagName

删除

  • 根据id删除
    var flag = db.DeleteById<Person>(2);
    // delete from person where id=2;
    var flag = db.DeleteById<Person>("123", "userId");
    // delete from person where userid='123';
    var flag = db.DeleteByIds<Person>(new int[] { 1, 2, 3 });
    // delete from person where id in (1,2,3);
    var flag = db.DeleteByIds<Person>(new string[] { "111", "222", "333" }, "userId");
    //delete from person where userId in ("111", "222", "333")
  • 根据字段删除
    var flag = db.DeleteWhere<Person>("name","loogn");
    // delete from person where name=@name; @name="loogn"

    var flag = db.DeleteWhere<Person>(DictBuilder.Assign("age",23).Assign("name","loogn"));
    var flag = db.DeleteWhere<Person>(new { age=23, name="loogn"});
    // delete from person where age=@age and name=@name; @age=23, @name="loogn";
  • 根据条件删除
    var flag = db.Delete("delete from person where id=@id",DictBuilder.Assign("id",23));
    var flag = db.Delete<Person>();
    // delete from person;

其他

  • 执行存储过程
    db.Proc("sp_name", DictBuilder.Assign("p1", 21).Assign("p2", "p2 value"),true);
    //直接执行

    var cmd = db.Proc("sp_name", DictBuilder.Assign("p1", 21).Assign("p2", "p2 value"));
    //返回cmd,自己处理后续结果,如果有输出参数,可以在这里添加到cmd中
    using (var reader = cmd.ExecuteReader())
    {
        var list = TransformForDataReader.ReaderToObjectList<Person>(reader);
        //TransformForDataReader类中提供了许多从reader读取数据的方法
    }
  • 事务模板
    using (var db = DB.Open())
    {
        db.EnsureOpen();
        var trans = db.BeginTransaction();
        try
        {
            var flag1 = trans.Update(new Person { Id = 1, Name = "loogn2" });
            var flag2 = trans.Insert(new Person { Id = 2, Name = "loogn1" });
            if (flag1 > 0 && flag2 > 0)
            {
                trans.Commit();
            }
            else
            {
                trans.Rollback();
            }
        }
        catch (Exception exp)
        {
            trans.Rollback();
        }
    }

使用连接对象的BeginTransaction获取事务对象,在事务对象上执行方法即可;
事务对象上有和连接对象相同发方法;

  • 使用mysql数据库(sqlite步骤一样)

    1. 引入 Loogn.OrmLite.MySql.dll
    PM> Install-Package Loogn.OrmLite.MySql
    1. 在程序启动时注册mysql命令提供程序
    OrmLite.RegisterProvider(MySqlCommandDialectProvider.Instance);
    1. 实例化MySqlConnection进行使用
    using (var db = new MySqlConnection("server=.;uid=root;pwd=root;database=test"))
    {
        // do what you like...
    }
  • 全局配置

OrmLite.DefaultKeyName属性配置默认主键名,默认是 "ID";

OrmLite.UpdateIgnoreFields属性全局配置整体修改时忽略的字段名,默认是:["AddTime","AddDate"],可根据项目增减

Loogn.OrmLite文档的更多相关文章

  1. ormlite 文档

    目录[-] A Fast, Simple, Typed ORM for .NET Download 8 flavours of OrmLite is on NuGet: Docs and Downlo ...

  2. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  3. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  4. ABP文档 - Javascript Api - AJAX

    本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...

  5. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  6. ABP文档 - SignalR 集成

    文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...

  7. ABP文档 - 通知系统

    文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...

  8. ABP文档 - Hangfire 集成

    文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...

  9. ABP文档 - 后台作业和工作者

    文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...

随机推荐

  1. MySQL复制框架

    一.复制框架 开始接触复制时,看到各种各样的复制,总想把不同类型对应起来,结果越理越乱~究其原因就是对比了不同维度的属性,不同维度得出的结果集之间必然存在交集,没有必要将不同维度的属性安插到成对的萝卜 ...

  2. while与for不能互换的地方

  3. SAX解析XML文档——(二)

    SAX从上向下解析,一行一行解析.节省内存,不适合CRUD. XML文档: <?xml version="1.0" encoding="UTF-8"?&g ...

  4. python cookbook 笔记一

    因为有些代码只有在python3里可以正常运行,所以最好配两个虚拟环境 安装虚拟环境: pip install virtualenv virtualenv -p /usr/bin/python3.5 ...

  5. jQuery中【width(),innerWidth(),outerWidth()】

    这个问题,已经别扭我多年了,今天终于彻底解决了,拿出来庆贺一下.jquery作为开源项目,无论从思路上,还是从严谨性上,让人崇敬. 随着时间的流逝,jquery的一些功能被逐渐挖掘出来.通过jQuer ...

  6. Linux: 介绍make menuconfig中的每个选项含义【转】

    转自:http://blog.csdn.net/gaoyuanlinkconcept/article/details/8810468 介绍make menuconfig中的每个选项含义 Linux 2 ...

  7. opencv 图像深度(depth)

    原文地址:http://blog.csdn.net/dingfc/article/details/7457984 图像深度是指存储每个像素所用的位数,也用于量度图像的色彩分辨率.图像深度确定彩色图像的 ...

  8. shell脚本中冒号

    格式:: your comment here 格式:# your comment here 写代码注释(单行注释). 例如: 格式:: 'comment line1 comment line2 mor ...

  9. 安装xcache3.0.3/3.2,为php加速

    安装xcache,为php加速 1.安装 # tar xf xcache-3.0.3.tar.bz2  # cd xcache-3.0.3 # /usr/local/php/bin/phpize # ...

  10. css之hover改变子元素和其他元素样式

    参考地址:链接 +表示下一级元素,>表示子元素 <!DOCTYPE html> <html> <head lang="en"> <m ...