配置文件

首先需要在WebConfig中配置连接字符串和数据库类型。providerName是一个枚举类型:Access,MySql,Oracle,SQLite,SqlServer。如果忽略该属性,框架会默认使用SqlServer数据库。

<connectionStrings>
  <add name="default" connectionString="Data Source=192.168.0.101;Database=DB_Demo;uid=sa;pwd=123" providerName="SqlServer"/>
</connectionStrings>

实体继承

实体类需要继承EntityBase基类。属性,外键以及构造函数如示例。通常情况下,实体类由代码生成工具进行维护。GetProperty和SetProperty是基类中的方法。这样可以避免使用反射影响效率。

public class RolesEntity : EntityBase
{
    public RolesEntity(){ }

    public RolesEntity(EntityBase fkObject)
        : base(fkObject)
    { }

    public string RoleId
    {
        get { return GetProperty<string>("RoleId"); }
        set { SetProperty("RoleId", value); }
    }

    public string RoleName
    {
        get { return GetProperty<string>("RoleName"); }
        set { SetProperty("RoleName", value); }
    }
}

public class PersonsEntity : EntityBase
{
    public PersonsEntity()
    {
        this.RolesModel = new RolesEntity(this);
    }

    public PersonsEntity(EntityBase fkObject)
        : base(fkObject)
    { }

    public string Id
    {
        get { return GetProperty<string>("Id"); }
        set { SetProperty("Id", value); }
    }

    public string Name
    {
        get { return GetProperty<string>("Name"); }
        set { SetProperty("Name", value); }
    }

    public string Sex
    {
        get { return GetProperty<string>("Sex"); }
        set { SetProperty("Sex", value); }
    }

    public int Age
    {
        get { return GetProperty<int>("Age"); }
        set { SetProperty("Age", value); }
    }

    public string RoleId
    {
        get { return GetProperty<string>("RoleId"); }
        set { SetProperty("RoleId", value); }
    }

    public RolesEntity RolesModel { get; set; }
}

增改删查询操作

1.添加记录。使用SQL类构建一条INSERT语句。参数可以使用格式化参数方式,也可以使用重载方法自己构建DataParameter对象。使用SqlMap类执行该SQL对象。

/// <summary>
/// 添加一条记录
/// </summary>
/// <param name="entity">待添加的实体对象</param>
/// <returns>true:添加成功 false:添加失败</returns>
public bool Add(RolesEntity entity)
{
    SQL sql = SQL.Build("INSERT INTO Roles(RoleId,RoleName) VALUES(?,?)", entity.RoleId, entity.RoleName);
    return SqlMap<RolesEntity>.ParseSql(sql).Execute() > 0;
}

2.更新记录。使用SQL类构建一条UPDATE语句。参数可以使用格式化参数方式,也可以使用重载方法自己构建DataParameter对象。使用SqlMap类执行该SQL对象。

/// <summary>
/// 更新一条记录
/// </summary>
/// <param name="entity">待更新的实体对象</param>
/// <returns>true:更新成功 false:更新失败</returns>
public bool Update(RolesEntity entity)
{
    SQL sql = SQL.Build("UPDATE Roles SET RoleName=? WHERE RoleId=?", entity.RoleName, entity.RoleId);
    return SqlMap<RolesEntity>.ParseSql(sql).Execute() > 0;
}

3.删除记录。使用SQL类构建一条DELETE语句。参数可以使用格式化参数方式,也可以使用重载方法自己构建DataParameter对象。使用SqlMap类执行该SQL对象。

/// <summary>
/// 删除一条记录
/// </summary>
/// <param name="roleId">角色编号</param>
/// <returns>true:删除成功 false:删除失败</returns>
public bool Delete(string roleId)
{
    SQL sql = SQL.Build("DELETE FROM Roles WHERE RoleId=?", roleId);
    return SqlMap<RolesEntity>.ParseSql(sql).Execute() > 0;
}

4.批量操作。SqlMap支持批量SQL的执行(内部事务)。也可以手动使用事务批量执行方法。

/// <summary>
/// 批量添加记录
/// </summary>
/// <param name="list">待添加的实体对象列表</param>
/// <returns>true:添加成功 false:添加失败</returns>
public bool Add(List<RolesEntity> list)
{
    List<SQL> sqlList = new List<SQL>();
    foreach (RolesEntity entity in list)
    {
        SQL sql = SQL.Build("INSERT INTO Roles(RoleId,RoleName) VALUES(?,?)", entity.RoleId, entity.RoleName);
        sqlList.Add(sql);
    }
    return SqlMap<RolesEntity>.ParseSql(sqlList).Execute() > 0;
}

/// <summary>
/// 批量添加记录
/// </summary>
/// <param name="list">待添加的实体对象列表</param>
/// <returns>true:添加成功 false:添加失败</returns>
public bool Add(List<RolesEntity> list)
{
    try
    {
        DBHelper.BeginTransaction();
        foreach (RolesEntity entity in list)
        {
            this.Add(entity);
        }
        DBHelper.Commit();
        return true;
    }
    catch
    {
        DBHelper.Rollback();
        return false;
    }
}

5.获取对象。使用SQL类构建一条SELECT语句。使用SqlMap的ToObject方法即可返回该对象。

/// <summary>
/// 根据主键获取实体对象
/// </summary>
/// <param name="roleId">角色编号</param>
/// <returns>实体对象</returns>
public RolesEntity GetModel(string roleId)
{
    SQL sql = SQL.Build("SELECT * FROM Roles WHERE RoleId=?", roleId);
    return SqlMap<RolesEntity>.ParseSql(sql).ToObject();
}

6.获取对象列表。使用SQL类构建一条SELECT语句。使用SqlMap的ToList方法即可返回该对象。

/// <summary>
/// 获取对象列表
/// </summary>
/// <returns>对象列表</returns>
public List<RolesEntity> GetList()
{
    SQL sql = SQL.Build("SELECT * FROM Roles");
    return SqlMap<RolesEntity>.ParseSql(sql).ToList();
}

7.获取Json对象和列表。

/// <summary>
/// 根据主键获取Json对象
/// </summary>
/// <param name="roleId">角色编号</param>
/// <returns>Json对象</returns>
public string GetJsonModel(string roleId)
{
    SQL sql = SQL.Build("SELECT * FROM Roles WHERE RoleId=?", roleId);
    return SqlMap<RolesEntity>.ParseSql(sql).ToJsonObject();
}

/// <summary>
/// 获取Json对象列表
/// </summary>
/// <returns>Json对象列表</returns>
public string GetJsonList()
{
    SQL sql = SQL.Build("SELECT * FROM Roles");
    return SqlMap<RolesEntity>.ParseSql(sql).ToJsonList();
}

外键级联操作

1.增改删的级联。开启事务操作后,先调用外键表的删除方法,再调用主键表的删除方法即可。更新,添加操作类似注意表的顺序即可。

/// <summary>
/// 级联删除
/// </summary>
/// <param name="entity">待删除的实体对象</param>
/// <returns>true:删除成功 false:删除失败</returns>
public bool Delete_FK(PersonsEntity entity)
{
    try
    {
        DBHelper.BeginTransaction();
        this.Delete(entity);
        new RolesBiz().Delete(entity.RolesModel);
        DBHelper.Commit();
        return true;
    }
    catch
    {
        DBHelper.Rollback();
        return false;
    }
}

2.多表连接查询,填充两张表的结果。查询时使用JOIN语句即可。数据绑定时只需使用:Eval("RolesModel.RoleName")。

/// <summary>
/// 获取对象列表
/// </summary>
/// <returns>对象列表</returns>
public List<PersonsEntity> GetList_FK()
{
    SQL sql = SQL.Build("SELECT * FROM Persons INNER JOIN Roles ON Persons.RoleId=Roles.RoleId");
    return SqlMap<PersonsEntity>.ParseSql(sql).ToList();
}

<asp:GridView ID="gvPersonList" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="Id" HeaderText="编号" />
        <asp:BoundField DataField="Name" HeaderText="姓名" />
        <asp:BoundField DataField="Sex" HeaderText="性别" />
        <asp:BoundField DataField="Age" HeaderText="年龄" />
        <asp:BoundField DataField="RoleId" HeaderText="角色编号" />
        <asp:TemplateField HeaderText="角色名称">
            <ItemTemplate>
                <%# Eval("RolesModel.RoleName")%>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

分页处理

分页处理只需使用SQL对象的Limit方法即可实现。SQL对象的RecordCount属性返回总记录条数。

/// <summary>
/// 获取分页后对象列表
/// </summary>
/// <param name="pageSize">每页显示的记录条数</param>
/// <param name="pageNumber">当前页索引</param>
/// <param name="recordCount">总记录条数</param>
/// <returns>分页后对象列表</returns>
public List<RolesEntity> GetList(int pageSize, int pageNumber, out int recordCount)
{
    SQL sql = SQL.Build("SELECT * FROM Roles").Limit(pageSize, pageNumber);
    recordCount = sql.RecordCount;
    return SqlMap<RolesEntity>.ParseSql(sql).ToList();
}

事务处理

SqlMap对象的批量操作方法框架内部已经实现事务处理。如需手动事务处理需要使用DBHelper中的事务处理方法。

public bool TranDemo()
{
    try
    {
        DBHelper.BeginTransaction();
        //需要事务处理的逻辑
        DBHelper.Commit();
        return true;
    }
    catch
    {
        DBHelper.Rollback();
        return false;
    }
}