上一教程只是成功的使用了SqlSuagr去和数据库做些操作
生产SqlSugar客户端的时候不知道大家有没有注意这个
和服务器数据库连接的地方 很显然是可以配置的
官网给了这么配置的选项 我们才用了四个
看一下这个类 是不是如出一辙 以后配置可以使用更多的选项了
嘎嘎嘎
开始讲一下实体配置哦
实体就是我们在数据库里面的映射
每一个表对应一个实体对象 就像我们最简单示例里面的Student类
配置实体
当我们数据库插入和更新的时候,ORM需要知道主键和自增列,我们有2种方式获取,一种直接从数据库表中读取,还有一种从实体特性中读取。一般我们建议从特性读取,因为这样不需要考虑一些特殊情况(例如一些库的特殊设置读不到)
实体在我们的开发中叫Dto(Data Transfer Object)
数据传输对象 使用它和数据库进行一一对应就是ORM框架的核心
那么我们就可以开始给我的项目分层了
实体类在Dto里面去建立
从特性方式(推荐)
[SugarTable("dbstudent")]//当和数据库名称不一样可以设置别名
public class Student
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//通过特性设置主键和自增列
public int Id { get; set; }
public int? SchoolId { get; set; }
[SugarColumn(ColumnName ="StudentName")]//数据库列名取自定义
public string Name { get; set; }
}
以后就这么写就完事了
全部特性
自定义特性
该功能非常强大远不止这点用法,可以统一处理一些特性逻辑
但是直到有就行了 暂时是用不到滴
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = Config.ConnectionString,
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute,
ConfigureExternalServices = new ConfigureExternalServices()
{
EntityService = (property, column) =>
{
var attributes = property.GetCustomAttributes(true);//get all attributes
if (attributes.Any(it => it is KeyAttribute))// by attribute set primarykey
{
column.IsPrimarykey = true;
}
},
EntityNameService = (type, entity) =>
{
var attributes = type.GetCustomAttributes(true);
if (attributes.Any(it => it is TableAttribute))
{
entity.DbTableName = (attributes.First(it => it is TableAttribute) as TableAttribute).Name;
}
}
}
});
[Table("student")]
//[SugarTable("student")]
public class MyStudent
{
[Key]
//[SugarColumn(IsPrimaryKey =true)]
public string Id { get; set; }
public string Name { get; set; }
}
了解下事务
事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);
事务的四大特性:
1 、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
原生jdbc对事务的处理如下:
try{
connection.setAutoCommit( false);
数据库操作...
connection.commit();
}catch(Exception ex){
connection.rollback();
}finally{
connection.setAutoCommit( true);
}
简单来讲 就是在数据库进行增删查改的过程中出现了问题
我们需要进行回滚等操作来处理事务
来看看SqlSugar怎么处理事务
单库事务
事务有3种实现方式,你可以根据你的喜爱实现事务
需要注意db必须是同一个对象,如果db不是同一个对象事务将失效, mysql需要注意表的格式是否支持事务
没有返回值的事务
var result = db.Ado.UseTran(() =>
{
var beginCount = db.Queryable<Student>().ToList();
db.Ado.ExecuteCommand("delete student");
var endCount = db.Queryable<Student>().Count();
throw new Exception("error haha");
});
if(result.IsSuccess)
{
//result.ErrorMessage
}
有返回值的事务
var result = db.Ado.UseTran(() =>
{
var beginCount = db.Queryable<Student>().ToList();
db.Ado.ExecuteCommand("delete student");
var endCount = db.Queryable<Student>().Count();
throw new Exception("error haha");
});
if(result.IsSuccess)
{
//result.ErrorMessage
}
使用try的方式实现事务
try
{
db.Ado.BeginTran();
db.Ado.CommitTran();
}
catch (Exception)
{
db.Ado.RollbackTran();
throw;
}
可想而知 try catch 最好用 以后就决定是它了
多库事务
SqlSugarClient db = new SqlSugarClient(new List<ConnectionConfig>()
{
new ConnectionConfig(){ ConfigId="1", DbType=DbType.SqlServer,
ConnectionString=Config.ConnectionString,InitKeyType=InitKeyType.Attribute,IsAutoCloseConnection=true },
new ConnectionConfig(){ ConfigId="2", DbType=DbType.MySql,
ConnectionString=Config.ConnectionString4 ,InitKeyType=InitKeyType.Attribute ,IsAutoCloseConnection=true}
});
//库1
try
{
db.BeginTran();
db.Deleteable<Order>().ExecuteCommand();
db.ChangeDatabase("2");//使用库2
db.Deleteable<Order>().ExecuteCommand();
db.CommitTran();
}
catch
{
db.RollbackTran();
}
当然 事务基本上是用在增删改的
查询是可以没有事务的 下一教程先增删改 再说查