demo代码地址:https://gitee.com/chenheze90/l08_SqlSugar
ORM
ORM的英文翻译是Object-relational mapping,对象-关系的映射。是一种关系型数据库的信息映射成代码内部实体类,将软件内部数据持久化到数据库的技术框架。
ORM解决的问题
软件开发过程中。数据库软件及其保存的数据是和开发的软件完全分开的,开发的软件需要通过特殊的代码或者数据库自身提供的接口进行访问。但是每种数据库的访问访问方式都是不同的,这就增加了代码维护的工作量。
ORM优缺点
优点:
提高了开发效率,封装的工具节省了大量的开发工作。
可以自动对实体Entity对象与数据库中的Table进行字段与属性的映射,确保了代码的可靠性和稳定性;
不用直接SQL编码,能够像操作对象一样从数据库中获取数据,减少学习成本和代码出错的风险。
缺点:
程序的执行效率降低。从系统结构上来看,采用orm的系统多是多层系统的,系统的层次太多,效率就会降低;
思维模式固定;
常用的底层ORM-SqlSugar
sqlsugar简介
sqlsugar是国内自主开发的,性能优越的一款轻量级的ORM,是众多.NET框架中比较容易上手和易用的框架。
它的特点:
1.高性能。跟EF比起来,性能更优越。特别是在批量操作和一对多查询上。
2.高扩展性。支持拉姆达表达式、扩展数据类型等;
3.技术支持强大,维护更新及时。
4.功能全面。
5.开源、免费。
6.国内开发者开发、维护;
7.支持.NET Core;
8.支持主流数据库,如:SQL Server,MySql,Oracle,Sqlite等;
代码实例
新建一个wpf应用,也可以是控制台、winform等等。
添加nuget引用
找到SqlSugar,如下图所示。并安装
我们这里以mysql数据库为例,所以还要下载一个mysql。
注意,mysql的安装,以及它的操作软件SQLyog的安装使用,请参阅其他的博客
前端的代码如下,添加几个按钮,分别用于增删改查
<StackPanel>
<StackPanel.Resources>
<Style TargetType="Button">
<Setter Property="Width" Value="100"></Setter>
<Setter Property="Height" Value="25"></Setter>
</Style>
</StackPanel.Resources>
<Button x:Name="btnAdd" Content="增" Click="btnAdd_Click"></Button>
<Button x:Name="btnDel" Content="删" Click="btnDel_Click"></Button>
<Button x:Name="btnUpd" Content="改" Click="btnUpd_Click"></Button>
<Button x:Name="btnSec" Content="查" Click="btnSec_Click"></Button>
</StackPanel>
创建一个实体类person
[SugarTable("Person")]
public class Person
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public string Name { get; set; }
}
首先实例化连接
db = new SqlSugarClient(
new ConnectionConfig()
{
ConnectionString = "server=localhost;uid=root;pwd=root;database=mysql",
DbType = DbType.MySql,//设置数据库类型
IsAutoCloseConnection = true,//自动释放数据务
InitKeyType = InitKeyType.Attribute //从实体特性中读取主键自增列信息
});
然后初始化数据库表Person
db.CodeFirst.SetStringDefaultLength(200/*设置varchar默认长度为200*/).InitTables(typeof(Person));//建立表
可以看下原本没有person表
执行之后生成表person
插入数据的方法
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
/*插入*/
var insertObj = new Person() { Name = "csdn" };
//Insert reutrn Insert Count
var t2 = db.Insertable(insertObj).ExecuteCommand();
//Insert reutrn Identity Value
var t3 = db.Insertable(insertObj).ExecuteReturnIdentity();
//Only insert Name
var t4 = db.Insertable(insertObj).InsertColumns(it => new { it.Name, it.Id }).ExecuteReturnIdentity();
//Ignore TestId
var t5 = db.Insertable(insertObj).IgnoreColumns(it => new { it.Name, it.Id }).ExecuteReturnIdentity();
//Insert List<T>
var s9 = db.Insertable(new List<Person>() { insertObj }).InsertColumns(it => new { it.Name }).ExecuteCommand();
}
删除数据的方法
private void btnDel_Click(object sender, RoutedEventArgs e)
{
/*删除*/
db.Deleteable<Person>(1).ExecuteCommand();
//by entity
db.Deleteable<Person>().Where(new Person() { Id = 1 }).ExecuteCommand();
//by primary key
db.Deleteable<Person>().In(1).ExecuteCommand();
//by primary key array
db.Deleteable<Person>().In(new int[] { 1, 2 }).ExecuteCommand();
//by expression
db.Deleteable<Person>().Where(it => it.Id == 1).ExecuteCommand();
}
更新数据的方法
private void btnUpd_Click(object sender, RoutedEventArgs e)
{
/*更新*/
var updateObj = new Person() { Id = 1, Name = "csdn2" };
//update reutrn Update Count
var t1 = db.Updateable(updateObj).ExecuteCommand();
//Only update Name
var t3 = db.Updateable(updateObj).UpdateColumns(it => new { it.Name }).ExecuteCommand();
//Ignore Name and TestId
var t4 = db.Updateable(updateObj).IgnoreColumns(it => new { it.Name, it.Id }).ExecuteCommand();
//update List<T>
var t7 = db.Updateable(new List<Person>() { updateObj }).ExecuteCommand();
}
查询数据的方法
private void btnSec_Click(object sender, RoutedEventArgs e)
{
/*查询*/
var getById = db.Queryable<Person>().InSingle(1);//根据主键查询
var total = 0;
var getPage = db.Queryable<Person>().Where(it => it.Id == 1).ToPageList(1, 2, ref total);//根据分页查询
var getAll = db.Queryable<Person>().ToList();
var getAllNoLock = db.Queryable<Person>().With(SqlWith.NoLock).ToList();
var getByPrimaryKey = db.Queryable<Person>().InSingle(2);
var sum = db.Queryable<Person>().Sum(it => it.Id);
var isAny = db.Queryable<Person>().Where(it => it.Id == -1).Any();
var isAny2 = db.Queryable<Person>().Any(it => it.Id == -1);
var getByWhere = db.Queryable<Person>().Where(it => it.Id == 1 || it.Name == "a").ToList();
var getByFuns = db.Queryable<Person>().Where(it => SqlFunc.IsNullOrEmpty(it.Name)).ToList();
var group = db.Queryable<Person>().GroupBy(it => it.Id).Select(it => new { id = SqlFunc.AggregateCount(it.Id) }).ToList();
int pageIndex = 0, pageSize = 20, totalCount = 0;
var page = db.Queryable<Person>().ToPageList(pageIndex, pageSize, ref totalCount);
var top5 = db.Queryable<Person>().Take(5).ToList();
}