背景
SqlSugar是一款国产ORM,除了拥有媲美原生的性能 另外还有满足各种需求的功能,简单好用一分钟就能够轻松上手。
2.x版本正式在自已公司内部项目使用
3.x版本得到了更多公司的喜欢不过也会抱怨有很多不足
4.x版本17年5月发布后得到的评价超出了我的预期, 刚发布的时候做了大量的单元测试,不过还是有不少BUG,经过大量的用户反馈8月份左右成型和稳定,并且大量的项目得到交付,也得到了使用者的好评,现在我认为是一个较出色的版本所以我才开始写这篇文章介绍它
5.x版本 预计今年的5月份发布试用版本会完美兼4.X版本,随着几年对emit和拉姆达解析的深入理解,5.x版本将会有颠覆ORM的改变,具体什么样的功能暂时保密。
介绍
支持:Oracle、mysql、Sqlite、SqlSever四种数据库,Postgresql年后也将支持已经在开发中了,支持的字段数据类型也是相当齐全
功能: 批量操作、CodeFirst、DbFirst、二级分布式缓存、AOP、读写分离、自定义Sql函数的扩展、动态表别名列别名,属性表别名列别名,拉姆达子查询,JOIN,UNIONALL,插入支持了默认值,更新支持了指定列排除列等常用功能
优点: 性能、语法简单、功能强大和持续更新维护
安装下载
下载地址:
https://github.com/sunkaixuan/SqlSugar
Nuget:
.net 4.0及以上版本: Install-Package sqlSugar
.net core 2.0 版本:Install-Package sqlSugarCore
连接数据库
SqlSugar是通过SqlSugarClient来进行数据库的操作,而创建SqlSugarClient我们需要ConnectionConfig这个类对象
ConnectionConfig有6个属性分别是:
1.ConnectionString(必填):连接字符串
2.DataType(必填): 数据库类型
3.IsAutoCloseConnection:(默认false)是否自动释放数据库,设为true我们不需要close或者Using的操作,比较推荐
4.InitKeyType:(默认SystemTable)初始化主键和自增列信息的方式(注意:如果是数据库权限受管理限制或者找不到主键一定要设成attribute)
InitKeyType.SystemTable表示自动从数据库读取主键自增列的信息(适合SA等高权限的账户)
如果是这种模式实体类就普通的实体类便可以,不需要加任何东西
InitKeyType.Attribute 表示从实体类的属性中读取 主键和自增列的信息(适合有独立的运维组的用户没有系统表操作权限)
如果是这种模式实体类需要有所改变
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)] //如果是主键并且是自增列就加上2个属性
[SugarColumn(IsPrimaryKey=true)]//如果只是主键只能加一个
5.MoreSettings
用于一些全局设置
MoreSettings .IsAutoRemoveDataCache 为true表示可以自动删除二级缓存
MoreSettings .IsWithNoLockQuery 为true表式查询的时候默认会加上.With(SqlWith.NoLock),可以用With(SqlWith.Null)让全局的失效
6.ConfigureExternalServices
可以扩展你想要的序列化方式和缓存方式等服务
实现一个简单的增、删、查和改
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.ConnectionString, //必填 DbType = DbType.SqlServer, //必填 IsAutoCloseConnection = true}); //默认InitKey=SystemTable var list=db.Queryable<Student>().ToList();//查询所有(使用SqlSugarClient查询所有到LIST) var list2 = db.Queryable<Student, School, Student, Student, Student>((st, sc, st2, st3, st4) => new object[] { JoinType.Left,st.SchoolId==sc.Id, JoinType.Left,st.Id==st2.Id, JoinType.Left,st.Id==st3.Id, JoinType.Left,st.Id==st4.Id }) .Where((st,sc)=>sc.Id==1) .Select((st, sc, st2,st3,st4) => new { id= st.Id ,name=st.Name,st4=st4}).ToList();//5表查询 db.Insertable(insertObj).ExecuteCommand();//插入 db.Updateable(updateObj).ExecuteCommand();//更新 db.Deleteable<Student>(1).ExecuteCommand();//删除
//db.Aop功能
//db.Ado功能
//...
SqlSugarClient对象可以完成非常复杂的数据库操,这些功能会在后面介绍
简化增、删、查和改
SqlSugarClient对象虽然强大但是大多数用户还是会在我的基础上在封装一层仓储然后简化增删查改,复杂的功能在用SqlSugarClient实现
所以我就集成了SimpleClient这个类让你不用在去写额外代码。
你可以建一个类继承SimpleClient或者直接使用SimpleClient
//我们就来扩展一个SimpleClient取名叫DbSet public class DbSet<T>:SimpleClient<T> where T : class, new() { public DbSet(SqlSugarClient context):base(context) { } //SimpleClient中的方法满足不了你,你可以扩展自已的方法 public List<T> GetByIds(dynamic [] ids) { return Context.Queryable<T>().In(ids).ToList(); ; } }
我们来创建一个DbContext类,里面包含了Db、StudentDb和SchoolDb
//创建一个DbContext类,使用DbSet(或者SimpleClient) public class DbContext { public DbContext() { Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "xx", DbType = DbType.SqlServer, IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了 //InitKey默认SystemTable }); } public SqlSugarClient Db;//用来处理事务多表查询和复杂的操作 public DbSet<Student> StudentDb { get { return new DbSet<Student>(db); } }//用来处理Student表的常用操作 public DbSet<School> SchoolDb { get { return new DbSet<School>(db); } }//用来处理School表的常用操作 }
我们只要继承DbContext就可以方便的操作数据库了
使用 DbSet 对象实现增删查和改 StudentDb.GetList( StudentDb.GetById StudentDb.Delete StudentDb.Update StudentDb.Insert StudentDb.GetPageList 使用SqlSugarClient对象 Db.Ado.UseTran(()=>{ 操用 })//事务操作 Db.Ado.Queryable<T,T2> //实现复杂查询
通过本篇相信你已经可以方便的用SqlSugar ORM实现简单的增、删、查和改了
注意:我上面的例子使用的是默认InitKey方式实现的,如果用InitKey.Attribute需要在实体的属性上添加主键标记,在本篇的连接数据库中有详细介绍。
如果还不明白的话可以下载 https://github.com/sunkaixuan/SqlSugar 里面有详细的DEMO和建库脚本
下一篇预告
介绍SimpleClient具体函数和使用场景
结合主流js插件 bootstrap-table 实现动态询功能