sqlsugar

摘要:
下载地址:https://github.com/sunkaixuan/SqlSugarSqlSugar是.NET版本,SqlSugarCore是.NETCORE版本,根据你的项目选择你的引用dll优点:  很多人都会问您这款ORM有哪些特点,有什么竞争力,我归纳出以上几点供你参考高性能,不夸张的说,去掉Sql在数据库执行的时间,SqlSugar是EF数倍性能,另外在批量操作和一对多查询上也有不错的

下载地址:https://github.com/sunkaixuan/SqlSugar

SqlSugar是.NET版本,SqlSugarCore是.NET CORE版本,根据你的项目选择你的引用dll

优点:

  很多人都会问您这款ORM有哪些特点,有什么竞争力,我归纳出以上几点供你参考

  • 高性能 ,不夸张的说,去掉Sql在数据库执行的时间,SqlSugar是EF数倍性能,另外在批量操作和一对多查询上也有不错的SQL优化
  • 高扩展性 ,支持自定义拉姆达函数解析、扩展数据类型、支持自定义实体特性,外部缓存等
  • 稳定性和技术支持, 虽然不是官方ORM, 但在稳定性上也是有着数年用户积累,如果遇到问题可以在GITHUB提出来,会根据紧急度定期解决
  • 功能全面,虽然SqlSugar小巧可功能并不逊色于EF框架
  • 创新、持续更新 ,向下兼容
SqlSugarClient db = newSqlSugarClient(
    newConnectionConfig()
    {
        ConnectionString = "server=.;uid=sa;pwd=@jhl85661501;database=SqlSugar4XTest",
        DbType = DbType.SqlServer,//设置数据库类型
        IsAutoCloseConnection = true,//自动释放数据务,如果存在事务,在事务结束后释放
        InitKeyType = InitKeyType.Attribute //从实体特性中读取主键自增列信息
});

//用来打印Sql方便你调式    
db.Aop.OnLogExecuting = (sql, pars) =>{
                Console.WriteLine(sql + "
" +db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it =>it.Value)));
                Console.WriteLine();
            };  

/*查询*/

var list = db.Queryable<StudentModel>().ToList();//查询所有

var getById = db.Queryable<StudentModel>().InSingle(1);//根据主键查询

var getByWhere = db.Queryable<StudentModel>().Where(it=>it.Id==1).ToList();//根据条件查询

var total = 0;

var getPage = db.Queryable<StudentModel>().Where(it => it.Id == 1).ToPageList(1,2,ref total);//根据分页查询

/*插入*/
var data = new Student() { Name = "jack"};
db.Insertable(data).ExecuteCommand();
 
/*更新*/
var data2 = new Student() { Id =1, Name = "jack"};
db.Updateable(data2).ExecuteCommand();
 
/*删除*/db.Deleteable<StudentModel>(1).ExecuteCommand();

实体类

//如果实体类名称和表名不一致可以加上SugarTable特性指定表名
[SugarTable("Student")]
public classStudentModel
{
    //指定主键和自增列,当然数据库中也要设置主键和自增列才会有效
    [SugarColumn(IsPrimaryKey=true,IsIdentity =true)]
    public int Id { get; set; }
    public string Name { get; set; }
}
//当然也支持自定义特性, 这里就不细讲了

根据实体创建表

db.CodeFirst.SetStringDefaultLength(200/*设置varchar默认长度为200*/).InitTables(typeof(StudentModel));//执行完数据库就有这个表了

使用SimpleClient优化你的代码

我们之前学会了用SqlSugarClient对象来操作数据库了,但是对于一些喜欢泛型的人来说,还不够精简,我们就来学习一下SimpleClient

使用DbContext完成增删查改,注意使用 DemoMangar需要new出来使用,保证他的上级或者上上级不能单例或者静态

public classDbContext
{
    publicDbContext()
    {
        Db = new SqlSugarClient(newConnectionConfig()
        {
            ConnectionString = "server=.;uid=sa;pwd=@jhl85661501;database=SqlSugar4XTest",
            DbType =DbType.SqlServer,
            InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
            IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了
});
        //调式代码 用来打印SQL 
        Db.Aop.OnLogExecuting = (sql, pars) =>{
            Console.WriteLine(sql + "
" +Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it =>it.Value)));
            Console.WriteLine();
        };
 
    }
    //注意:不能写成静态的,不能写成静态的
    public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作
    public SimpleClient<Student> StudentDb { get { return new SimpleClient<Student>(Db); } }//用来处理Student表的常用操作
    public SimpleClient<School> SchoolDb { get { return new SimpleClient<School>(Db); } }//用来处理School表的常用操作
}
public class DemoManager : DbContext//继承DbContext
{
 
 
    //SimpleClient实现查询例子
    public voidSearchDemo()
    {
 
        var data1 = StudentDb.GetById(1);//根据ID查询
        var data2 = StudentDb.GetList();//查询所有
        var data3 = StudentDb.GetList(it => it.Id == 1);  //根据条件查询  
        var data4 = StudentDb.GetSingle(it => it.Id == 1);//根据条件查询一条
 
        var p = new PageModel() { PageIndex = 1, PageSize = 2 };//分页查询
        var data5 = StudentDb.GetPageList(it => it.Name == "xx", p);
        Console.Write(p.PageCount);//返回总数
 
 
        //分页查询加排序
        var data6 = StudentDb.GetPageList(it => it.Name == "xx", p, it =>it.Name, OrderByType.Asc);
        Console.Write(p.PageCount);//返回总数
 
 
        //组装条件查询作为条件实现 分页查询加排序
        List<IConditionalModel> conModels = new List<IConditionalModel>();
        conModels.Add(new ConditionalModel() { FieldName = "id", ConditionalType = ConditionalType.Equal, FieldValue = "1" });//id=1
        var data7 = StudentDb.GetPageList(conModels, p, it =>it.Name, OrderByType.Asc);
         
        //4.9.7.5支持了转换成queryable,我们可以用queryable实现复杂功能
         StudentDb.AsQueryable().Where(x => x.Id == 1).ToList();
    }
 
 
    //插入例子
    public voidInsertDemo()
    {
 
        var student = new Student() { Name = "jack"};
        var studentArray = newStudent[] { student };
 
        StudentDb.Insert(student);//插入
StudentDb.InsertRange(studentArray);//批量插入
 
        var id = StudentDb.InsertReturnIdentity(student);//插入返回自增列
         
        //4.9.7.5我们可以转成 Insertable实现复杂插入
StudentDb.AsInsertable(insertObj).ExecuteCommand();
    }
 
 
    //更新例子
    public voidUpdateDemo()
    {
        var student = new Student() { Id = 1, Name = "jack"};
        var studentArray = newStudent[] { student };
 
        StudentDb.Update(student);//根据实体更新
StudentDb.UpdateRange(studentArray);//批量更新
StudentDb.Update(it => new Student() { Name = "a", CreateTime = DateTime.Now }, it => it.Id == 1);//只更新Name列和CreateTime列,其它列不更新,条件id=1
     
        //支持StudentDb.AsUpdateable(student)
}
 
    //删除例子
    public voidDeleteDemo()
    {
        var student = new Student() { Id = 1, Name = "jack"};
 
        StudentDb.Delete(student);//根据实体删除
        StudentDb.DeleteById(1);//根据主键删除
        StudentDb.DeleteById(new int[] { 1,2});//根据主键数组删除
        StudentDb.Delete(it=>it.Id==1);//根据条件删除
         
        //支持StudentDb.AsDeleteable()
}
 
    //使用事务的例子
    public voidTranDemo()
    {
 
        var result = Db.Ado.UseTran(() =>{
            //这里写你的逻辑
});
        if(result.IsSuccess)
        {
            //成功
}
        else{
            Console.WriteLine(result.ErrorMessage);
        }
    }
 
}
//多表查询
public voidJoinDemo() {
 
        var list= Db.Queryable<Student, School>((st, sc) => new object[] {
            JoinType.Left,
            st.SchoolId==sc.Id
        }).Select<ViewModelStudent>().ToList();
}

让我们不用每次写增删改查

public class DbContext<T> where T: class,new()
{
    publicDbContext()
    {
        Db = new SqlSugarClient(newConnectionConfig()
        {
            ConnectionString = "server=.;uid=sa;pwd=@jhl85661501;database=SqlSugar4XTest",
            DbType =DbType.SqlServer,
            InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
            IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了
});
        //调式代码 用来打印SQL 
        Db.Aop.OnLogExecuting = (sql, pars) =>{
            Console.WriteLine(sql + "
" +Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it =>it.Value)));
            Console.WriteLine();
        };
 
    }
    //注意:不能写成静态的
    public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作

    public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用来处理T表的常用操作
 
    /// <summary>
    ///获取所有
    /// </summary>
    /// <returns></returns>
    public virtual List<T>GetList()
    {
        returnCurrentDb.GetList();
    }
 
    /// <summary>
    ///根据主键删除
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual bool Delete(dynamicid)
    {
        returnCurrentDb.Delete(id);
    }

    /// <summary>
    ///更新
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public virtual boolUpdate(T obj)
    {
        returnCurrentDb.Update(obj);
    }
}

免责声明:文章转载自《sqlsugar》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇itext生成pdf(附带页眉,页脚,页码)GRPC异步双向流处理的流程伪代码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Node.js中的模块接口module.exports浅析

在写node.js代码时,我们经常需要自己写模块(module)。同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容。实际上,node.js的模块接口有多种不同写法。这里作者对此做了个简单的总结。 返回一个JSON Object 如下代码是一个简单的示例。 1 var exp ={ 2 "version": "1.0.0", 3...

JQuery window.opener

$('#Save').click(function () {var parent = $(parent.document.body);$(parent).find('input#addr_address1').val(addone);$(parent).find('input#addr_address2').val(addtwo);$(parent).fi...

my.cnf配置文件实用优化

[client] 1.登陆过程自动化(这样做可以让你在命令行登陆的时候免去输入用户名和密码) host="mysql服务器地址" user="用户名" password=“密码” 2.自动切换数据库(这样做可以避免每次进入都要use 某数据库) database="你的数据库名字" [mysqld] auto-rehash 启用TAB键自动补齐 skip-...

在可编辑div中插入文字或图片的问题解决思路

最近在网上碰到一个人问了我一个问题,在可编辑div中插入文字或者图片。因为web在线编辑器我从来只是用,基本不会去研究源代码。后来正好一个在线聊天web项目中也要用到这个功能,我就特地看看了代码。 基本上编辑器或者在线聊天web页面,是不太可能用textarea在做输入框的,因为我们可能要插入图片或者超级链接,因此选择在iframe或者div作为输入框是必...

.NET 通用多条件动态参数查询方法 SqlSugar ORM

通用查询用途 一般我们Grid控件,会有很多条件传给后台,如果每个条件都写一个逻辑的话,那么工作量将非常大,所以通用查询功能是每个软件必备的, SqlSugar将通用查询封装到支持了树型条件,并且支持所有常用的操作,用SqlSugar或者不用SqlSugar的都可参参考一下 1、简单多条件多动参数 创建数据库对象 //创建数据库对象 SqlSugarCl...

sharding-jdbc

https://www.cnblogs.com/fengpinglangjingruma/p/14005759.html sharding-jdbc 提供了4种分片算法: 1、精确分片算法 精确分片算法(PreciseShardingAlgorithm)用于单个字段作为分片键,SQL中有 = 与 IN 等条件的分片,需要在标准分片策略(StandardSh...