使用开源框架Sqlsugar结合mysql开发一个小demo
一、Sqlsugar简介
1.性能上有很大优势
sqlsugar是性能最好的ORM之一,具有超越Dapper的性能 ,走的是EMIT够构中间语言动态编译到程序集,完成高性能的实体绑定,达到原生水平。
2.功能非常强大
除了EF以外可以说的是功能最大的ORM框架
支持 DbFirst、CodeFirst、数据库维护、链式查询、链式更新、链式删除、链式插入、实体属性、复杂模型的查询、ADO.NET。特别是批量等功能都是货真价实的并非循环操作。
SqlSugar 4.0版本 6月底支持SqlSever的Core版 ,预计7月份支持多库,8月分开始分布式ORM的开发。 (3.x版本已经支持了4种数据库,相对稳定功能简单)
3.语法简单
完美的语法,可以秒杀现有所有ORM框架
详细语法请看孙凯旋博客园 http://www.codeisbug.com/Doc/8
二、主要介绍的是如何使用结合mysql数据库使用Sqlsugar
1.新建解决方案,自定义解决方案名称和保存路径
2.此时我们需要添加三个包,首先找到工具 =》NuGet包管理器 =>管理解决方案的NuGet程序包

3.依次添加以下三个程序包
Newtonsoft.Json:要注意最好添加较高版本的,否则会有兼容性问题

Sqlsugar:这个版本要根据你的.Net Framework的版本选择你合适的版本,这里我用的是.Net Framework4.5所以我安装的是sqlsugar5.0.0.8

MySql.Data

4.准备工作已经做完了,现在可以开始正文了
先贴一段代码,这个是我封装的一个操作数据库的一个类,我采用的是单例模式,不过有个弊端就是不能使用高并发的情况
public class DBContext<T> where T : class, new()
{
public SqlSugarClient Db;
private static DBContext<T> mSingle = null;
public static DBContext<T> GetInstance()
{
if (mSingle == null)
mSingle = new DBContext<T>();
return mSingle;
}
protected DBContext()
{ //通过这个可以直接连接数据库
Db = new SqlSugarClient(new ConnectionConfig()
{
//可以在连接字符串中设置连接池pooling=true;表示开启连接池
//eg:min pool size=2;max poll size=4;表示最小连接池为2,最大连接池是4;默认是100
ConnectionString = "database='" + "BookShop" + "';Data Source = '" + "127.0.0.1" + "'; User Id = '" + "root" + "'; pwd='" + "" + "';charset='utf8';pooling=true",
DbType = SqlSugar.DbType.MySql,//我这里使用的是Mysql数据库
IsAutoCloseConnection = true,//自动关闭连接
InitKeyType = InitKeyType.Attribute
});
//调式代码 用来打印SQL
//Db.Aop.OnLogExecuting = (sql, pars) =>
//{
// Console.WriteLine(sql + "\r\n" +
// Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
// Console.WriteLine();
//};
}
public void Dispose()
{
if (Db != null)
{
Db.Dispose();
}
}
public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } } /// <summary>
/// 获取所有
/// </summary>
/// <returns></returns>
public virtual List<T> GetList()
{
return CurrentDb.GetList();
} /// <summary>
/// 根据表达式查询
/// </summary>
/// <returns></returns>
public virtual List<T> GetList(Expression<Func<T, bool>> whereExpression)
{
return CurrentDb.GetList(whereExpression);
} /// <summary>
/// 根据表达式查询分页
/// </summary>
/// <returns></returns>
public virtual List<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel pageModel)
{
return CurrentDb.GetPageList(whereExpression, pageModel);
} /// <summary>
/// 根据表达式查询分页并排序
/// </summary>
/// <param name="whereExpression">it</param>
/// <param name="pageModel"></param>
/// <param name="orderByExpression">it=>it.id或者it=>new{it.id,it.name}</param>
/// <param name="orderByType">OrderByType.Desc</param>
/// <returns></returns>
public virtual List<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel pageModel, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc)
{
return CurrentDb.GetPageList(whereExpression, pageModel, orderByExpression, orderByType);
} /// <summary>
/// 根据主键查询
/// </summary>
/// <returns></returns>
public virtual List<T> GetById(dynamic id)
{
return CurrentDb.GetById(id);
} /// <summary>
/// 根据主键删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual bool Delete(dynamic id)
{
if (string.IsNullOrEmpty(id.ObjToString))
{
Console.WriteLine(string.Format("要删除的主键id不能为空值!"));
}
return CurrentDb.Delete(id);
} /// <summary>
/// 根据实体删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual bool Delete(T data)
{
if (data == null)
{
Console.WriteLine(string.Format("要删除的实体对象不能为空值!"));
}
return CurrentDb.Delete(data);
} /// <summary>
/// 根据主键删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual bool Delete(dynamic[] ids)
{
if (ids.Count() <= )
{
Console.WriteLine(string.Format("要删除的主键ids不能为空值!"));
}
return CurrentDb.AsDeleteable().In(ids).ExecuteCommand() > ;
} /// <summary>
/// 根据表达式删除
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual bool Delete(Expression<Func<T, bool>> whereExpression)
{
return CurrentDb.Delete(whereExpression);
} /// <summary>
/// 根据实体更新,实体需要有主键
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual bool Update(T obj)
{
if (obj == null)
{
Console.WriteLine(string.Format("要更新的实体不能为空,必须带上主键!"));
}
return CurrentDb.Update(obj);
} /// <summary>
///批量更新
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual bool Update(List<T> objs)
{
if (objs.Count <= )
{
Console.WriteLine(string.Format("要批量更新的实体不能为空,必须带上主键!"));
}
return CurrentDb.UpdateRange(objs);
} /// <summary>
/// 插入
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual bool Insert(T obj)
{
return CurrentDb.Insert(obj);
} /// <summary>
/// 批量
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public virtual bool Insert(List<T> objs)
{
return CurrentDb.InsertRange(objs);
} //可以扩展更多方法
}
5.还有就是需要有model类,就是跟数据库中表对应的model类,比如我这里是book和booktype,附加一段代码做个参考
[SugarTable("Books")]//指定数据库中的表名,要对应数据库的表名,否则会出错
public class Books
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//指定主键和自动增长
public int Id { get; set; }
public int BId { get; set; }
public string BName { get; set; }
public int TypeId { get; set; }
}
6.开始操作数据库了
Books b = new Books() { BId = , BName = "西游记", TypeId = };
BookType bt = new BookType() { TId= , TName = "健康"};
if (DBContext<Books>.GetInstance().CurrentDb.Insert(b))
{
Console.WriteLine("books_添加成功!");
}
if (DBContext<BookType>.GetInstance().Db.Insertable(bt).ExecuteCommand() > )
{
Console.WriteLine("BookType_添加成功!");
}
其他操作数据库的例子参考孙凯旋的博客园吧,附链接 http://www.codeisbug.com/Doc/8/1123
例子到这里就结束了,分享一下,我在做这个过程中遇到的问题:
1.因为我原本项目中已经存在程序包Newtonsoft.Json,而它的版本较低,当时忽略了版本问题,导致版本不兼容问题。后面升级之后就可以了。
2.犹豫项目需要高并发处理数据,所以我上边写的单例模式其实存在一定的问题,所以做了一定的修改,代码贴一下
public class DBContext<T> where T : class, new()
{
public SqlSugarClient Db; /// <summary>
/// 修改后的代码
/// </summary>
/// <returns></returns>
public static DBContext<T> OpDB()
{
DBContext<T> dbcontext_t = new DBContext<T>();
dbcontext_t.Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "database='" + "bookshop" + "';Data Source = '" + "127.0.0.1" + "'; User Id = '" + "root" + "'; pwd='" + "" + "';charset='utf8';pooling=true",
DbType = SqlSugar.DbType.MySql,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
return dbcontext_t;
} protected DBContext()
{
Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "database='" + "bookshop" + "';Data Source = '" + "127.0.0.1" + "'; User Id = '" + "root" + "'; pwd='" + "" + "';charset='utf8';pooling=true",
DbType = SqlSugar.DbType.MySql,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
//调式代码 用来打印SQL
Db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql + "\r\n" +
Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
};
}
public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } } //可以扩展更多方法
}
ok,该demo的分享就到这了,如果有什么错误的地方欢迎指出,有不理解的也可以留言。
使用开源框架Sqlsugar结合mysql开发一个小demo的更多相关文章
- Spring boot + mybatis + dubbo + zookeeper + mysql + mybatis-generator 一个小demo
代码的链接地址:https://gitee.com/frostGG/springbooo_dubbo_demo.git 1.项目的目录经构: 介绍: 这一个项目,用的是阿里的dubbo,和zookee ...
- express框架+jade+bootstrap+mysql开发用户注册登录项目
完整的项目代码(github):https://github.com/suqinhui/express-demo express是基于Node.js平台的web应用开发框架,用express框架开发w ...
- Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)
Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer Advanced Installer :Free for 30 da ...
- 模仿京东顶部搜索条效果制作的一个小demo
最近模仿京东顶部搜索条效果制作的一个小demo,特贴到这里,今后如果有用到可以参考一下,代码如下 #define kScreenWidth [UIScreen mainScreen].bounds.s ...
- java线程间通信:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...
- 开发一个小的php扩展
今天试了一下在php添加扩展,看了挺多资料,细节上不一致,其他大体是差不多的. 我们来开发一个叫ccvita_string的函数,他的主要作用是返回一段字符,对应的php代码可能如此: functio ...
- java连接mysql的一个小例子
想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...
- Spring框架——事务管理方式搭建一个小的项目
学习Spring框架,通过事务管理的方式搭建一个小的项目,该项目可以查询对数据库中的图书库存数量进行修改. 首先,使用MVC分层的设计模式思想搭建项目目录结构. 此部分代码源码之中都有相关注释,所以尽 ...
- 一周一个小demo — 前端后台的交互实例
这一周呢,本K在大神的指导下,完成了一个利用ajax与php文件上传处理相结合的一个留言板功能的小实例,下面就让本K来带大家瞅瞅如何实现这一种功能. 一.界面概览 首先我们来看一下这个小demo的具体 ...
随机推荐
- 通通玩blend美工(3)——可爱的云
原文:通通玩blend美工(3)--可爱的云 好久没有写这个系列的博客了,这里给个电梯吧,照顾新来的同学~~ 通通玩blend美工(1)——荧光Button 通通玩blend美工(2)——时钟 目前我 ...
- github page的两种类型
1. 什么是Github ? Github 官方主页 简单说,Github是一个基于git的社会化代码分享社区. 你可以在Github上创建免费的远程仓库(remote repository),分享你 ...
- 一个让业务开发效率提高10倍的golang库
一个让业务开发效率提高10倍的golang库 此文除了是标题党,没有什么其他问题. 这篇文章推荐一个库,https://github.com/jianfengye/collection. 这个库是我在 ...
- SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database)
原文:SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database) 一.本文所涉及的内容(Contents) 本文所涉及的内容(C ...
- javascript的强制类型转换
1.toString (1)调用toString方法 Array是将数组中的每个元素字符串化,并使用逗号拼接起来 object返回的是内部属性[[Class]]的值,[object Object] n ...
- 十个 Web 开发者熟悉的经典开源项目和工具
摘要: 一个都不知道的算我输! 这篇文章主要列出了曾经乃至现在都十分受 Web 开发者欢迎的开源工具,相信使用开源工具的 Web 开发者会对它们感兴趣的,它们中有的甚至诞生十多年了,但仍然在发光发热. ...
- HUSTOJ的Windows版评判内核(限制内存使用)
HUSTOJ的Windows版评判内核(一) 作者:游蓝海 个人主页:http://blog.csdn.net/you_lan_hai 2013.4.9 注:最新版本项目地址:https://gith ...
- 线性回归模型(Linear Regression)及Python实现
线性回归模型(Linear Regression)及Python实现 http://www.cnblogs.com/sumai 1.模型 对于一份数据,它有两个变量,分别是Petal.Width和Se ...
- Qt编程中QDiaog的ESC建
最近使用QDialog时,按了下Esc键,导致QDialog被关闭,而后续的数据处理出现了问题.原来在QDialog中按下Esc键会默认调用reject()方法而不是closeEvent(QClose ...
- 《解读window核心编程》 之 进程
1. 进程是执行文件的运行时形态.包括两部分:内核数据(对应内核对象).地址空间(包括执行文件代码和栈堆等动态内存). 2. 把VC的“系统-子系统”值删除掉,即不指定 ...