赞
踩
SqlSugar ORM是一个国产的,提供对象/关系映射(ORM)的库。
(ORM 是 Object Relational Mapping 的缩写,译为“对象关系映射”。
它解决了对象和关系型数据库之间的数据交互问题。
使用面向对象编程时,数据很多时候都存储在对象里面,具体来说是存储在对象的各个属性(也称成员变量)中。 例如有一个 User 类,它的 id、username、password、email 属性都可以用来记录用户信息。
当我们需要把对象中的数据存储到数据库时,按照传统思路,就得手动编写 SQL 语句,将对象的属性值提取到 SQL 语句中,然后再调用相关方法执行 SQL 语句。
而有了 ORM 技术以后,只要提前配置好对象和数据库之间的映射关系,ORM 就可以自动生成 SQL 语句,并将对象中的数据自动存储到数据库中,整个过程不需要人工干预。)
除了拥有媲美原生的性能 另外还有满足各种需求的功能,简单好用一分钟就能够轻松上手。
功能: 批量操作、CodeFirst、DbFirst、二级分布式缓存、AOP、读写分离、自定义Sql函数的扩展、动态表别名列别名,属性表别名列别名,拉姆达子查询,JOIN,UNIONALL,插入支持了默认值,更新支持了指定列排除列等常用功能
优点: 性能、语法简单、功能强大和持续更新维护
下载地址:(也可以在 visual studio里程序安装包下载)
https://github.com/sunkaixuan/SqlSugar
Nuget:
.net 4.0及以上版本: Install-Package sqlSugar
.net core 2.0 版本:Install-Package sqlSugarCore
SqlSugar是通过SqlSugarClient来进行数据库的操作,而创建SqlSugarClient我们需要ConnectionConfig这个类对象
1.ConnectionString(必填):连接字符串
- SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() {
- ConnectionString = Config.ConnectionString, //必填
2.DataType(必填): 数据库类型
DbType = DbType.SqlServer, //必填,数据库类型为sqlserver
3.IsAutoCloseConnection:(默认false)是否自动释放数据库,设为true我们不需要close或者Using的操作,比较推荐
IsAutoCloseConnection = true}); //是否自动释放数据库。默认InitKey=SystemTable
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是:SqlSugar在操作的时候需要一个Client,用来管理数据库连接,并操作数据库。
(插入用法、新增数据 ,添加数据 - SqlSugar 5x - .NET果糖网 (donet5.com))
db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现
- db.Deleteable<StudentModel>(1).ExecuteCommand();/*删除*/
- db.Deleteable<Student>().Where(it => it.Id == 1).ExecuteCommand();//根据表达式删除
-
- db.Deleteable<Student>()
- .Where(p => SqlFunc.Subqueryable<School>().Where(s => s.Id == p.SchoolId).Any())
- .ExecuteCommand()
- //子查询删除
- //Where(s => s.Id == p.SchoolId) s和p的关联条件不能少,不然就全删了
-
- db.DbMaintenance.TruncateTable<T>()//初始化表
-
- db.Updateable(updateObj).ExecuteCommand();//更新
- //更新添加条件
- db.Updateable(updateObj).Where(it=>it.Id==1).ExecuteCommand()
- //如果是集合操作请更新到5.0.4版本之前版本禁止使用, 并且只有部分库支持
-
- //只更新修改字段 5.1.1-preview11 新功能
- db.Tracking(updateObj);//创建跟踪
- updateObj.Name = "a1" + Guid.NewGuid();//只改修改了name那么只会更新name
- db.Updateable(updateObj).ExecuteCommand();//跟踪批量操作不会生效,原因:默认最佳性能(跟踪批量性能差,自已循环)
- //可以清空跟踪db.TempItems = null;
-
- var result=db.Updateable(updateObj).IgnoreColumns(it => new {
- it.CreateTime,it.TestId }).ExecuteCommand()//不更新某列
-
- var result=db.Updateable(updateObj).UpdateColumns(it => new {
- it.Name,it.CreateTime }).ExecuteCommand();
- //只更新某列
- //UpdateColumnsIF 不能叠加,建议用表达式方式更新的SetColumnsIF
查询所有
- List<Student> list=db.Queryable<Student>().ToList()
- //select * from Student
查询总数
- int count=db.Queryable<Student>().Count()
- //select count(1) from Student
按条件查询
- db.Queryable<Student>().Where(it=>it.Id==1).ToList()
- //select * from Student where id=1
-
- db.Queryable<Student>().Where(it=>it.name !=null).ToList()//不是null
- //select * from Student where name is not null
-
- db.Queryable<Student>().Where(it=>it.name ==null).ToList()//是null
- //select * from Student where name is null
-
- db.Queryable<Student>().Where(it=>it.name !="").ToList()//不是空 ,不为空
- //select * from Student where name <> ''
多条件查询
- db.Queryable<Student>().Where(it=>it.Id>10&&it.Name=="a").ToList()
- //select * from Student where id>10 and name='a'
- db.Queryable<Student>().Where(it=>it.Id>10).Where(it=>it.Name=="a").ToList()
- //select * from Student where id>10 and name='a'
- //如果是或者关系可以用 ||
模糊查询
- db.Queryable<Student>().Where(it =>it.Name.Contains("jack")).ToList();
- //select * from Student where name like %jack%
根据主键查询
(susgar中的single等同于EF中的SingleOrDefault)
- /*单主键查询*/
- db.Queryable<Student>().InSingle(2) //通过主键查询 SingleById
- db.Queryable<Student>().Single(it=>it.Id==2) //根据ID查询
- //select * from Student where id=2
-
-
- /*多主键查询*/
- var getAll=db.Queryable<Order>().WhereClassByPrimaryKey(new Order(){Pk1=1,Pk2=xx}).ToList(); //单个实体
- vargetAll=db.Queryable<Order>().WhereClassByPrimaryKey(List<Order>).ToList(); //支持集合
查询第一条,第一行
(.First() 等同于C#中的 FirstOrDefault , 没有值返回 null)
- db.Queryable<Student>().First(it=>it.Id==1) //没有返回Null
- //select top 1 * from Student where id=1
查询最后一条
(First() 等同于C#中的 FirstOrDefault , 没有值返回 null)
- db.Queryable<Student>()
- .OrderBy(it=>it.Id,OrderByType.Desc ) 倒序
- .First(it=>it.Id==1) //没有返回Null
- //select top 1 * from Student order by id desc where id=1
查询前几条
- db.Queryable<Student>().Take(10).ToList()
- //select top 10 * from Student
- //例1:更新表名
- db.Queryable<School>().AS("Student").ToList();
- //生成的SQL SELECT [ID],[NAME] FROM Student
- //动态表名 表别名 指定表明
-
-
- //例2:给表名添加前缀
- db.Queryable<School>().AS("dbo.School").ToList();
- //生成的SQL SELECT [ID],[NAME] FROM dbo.School
-
-
- //如果不用AS也可以在特性中设置别名,看文档:实体本置
查询一列
db.Queryable<Student>().Select(it=>it.Name).ToList() //单值 查询列 查询单独列
查询单条
- db.Queryable<Student>().Single(it=>it.Id==1) //没有返回Null,如果结果大于1条会抛出错误
- //select * from Student where id=1 // 查询id等于1的单条记录
获取最大值
- db.Queryable<Order>().Max(it=>it.Id);//同步
- db.Queryable<Order>().MaxAsync(it=>it.Id);//异步
- //也可以用函数 SqlFunc.AggregateMax
获取最小值
- db.Queryable<Order>().Min(it=>it.Id);//同步
- db.Queryable<Order>().MinAsync(it=>it.Id);//异步
- //也可以用函数 SqlFunc.AggregateMin
求和
- db.Queryable<Order>().Sum(it=>it.Id);//同步
- db.Queryable<Order>().SumAsync(it=>it.Id);//异步
- //也可以用函数 SqlFunc.AggregateSum
文件写入
- SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() {
- ConnectionString = Config.ConnectionString, //必填
- DbType = DbType.SqlServer, //必填,数据库类型为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();//删除<br>//db.Aop功能<br>//db.Ado功能<br>//...
-
- //实用技巧1:获取数据库时间我们可以用
- var dbTime = db.GetDate();
- //实用技巧2: 强制设置表名(默认表名来自实体)
- db.Insertable(insertObj).AS("table01").ExecuteCommand();
1. DbType 数据库类型
2. ConnectionString 连接字符串
3. ConfigId 多租户唯一标识
除以上外,其它都可以使用过程中修改
你可以使用 SqlSugarClient 或者 SqlSugarScope 对数据库进行增、删、查、改等功能
SqlSugarClient | 优点:性能比SqlSugarScope有5%左右提升 缺点: db不能跨上下文使用,需要new出一个新对象(和Dapper一样), 偶发错误难排查适合有经验用户 模式:不能单例 |
SqlSugarScope (5.0.3.4) 特色功能 | 如果没有.NET 开发经验的推荐使用 SqlSugarScope 不用考虑任何线程问题,无脑使用,简单省事,较强性能, 支持同一个上下文共享事务 模式: 单例模式 SqlSugarScope一直new会内存泄露 一定要用单例 |
新建项目:新建一个C#的桌面应用程序,起名为SqlSugarTest
引用sqlsugar
- SqlSugarClient db = new SqlSugarClient(
- new ConnectionConfig()
- {
- ConnectionString = "server=.;uid=sa;pwd=123456;database=test";
- DbType = DbType.SqlServer;//设置数据库类型,这里为sqlserver
- IsAutoCloseConnection = true;//是否自动释放数据库,如果存在事务,在事务结束后释放
- InitKeyType = InitKeyType.Attribute //从实体特性中读取主键自增列信息
- });
-
-
-
- /*查询*/
- 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);//根据分页查询
- //多表查询用法 http://www.codeisbug.com/Doc/8/1124
-
- /*插入*/
- var data = new Student() { Name = "jack" };
- db.Insertable(data).ExecuteCommand();
- //更多插入用法 http://www.codeisbug.com/Doc/8/1130
-
- /*更新*/
- var data2 = new Student() { Id =1, Name = "jack" };
- db.Updateable(data2).ExecuteCommand();
- //更多更新用法 http://www.codeisbug.com/Doc/8/1129
-
- /*删除*/
- db.Deleteable<StudentModel>(1).ExecuteCommand();
-
- //实用技巧1:获取数据库时间我们可以用
- var dbTime = db.GetDate();
- //实用技巧2: 强制设置表名(默认表名来自实体)
- db.Insertable(insertObj).AS("table01").ExecuteCommand();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。