FoxOne---一個快速高效的BS框架--數據訪問(Dao)

FoxOne---一個快速高效的BS框架--(1)html

FoxOne---一個快速高效的BS框架--(2)git

FoxOne---一個快速高效的BS框架--(3)github

FoxOne---一個快速高效的BS框架--(4)sql

FoxOne---一個快速高效的BS框架--WEB控件屬性編輯器數據庫

FoxOne---一個快速高效的BS框架--數據訪問(Dao)數組

FoxOne---一個快速高效的BS框架--生成增刪改查框架

 

數據訪問組件並不是本人原創,本人是在前人的代碼的基礎之上稍加改良。編輯器

一切都從一個Blog類開始:post

先簡單介紹一下上述類中各Attribute的意義ui

 1.Table("BL_Blog")是代表該實體對應的數據表爲BL_Blog,若是表名與實體名一致,則能夠不用聲明;

 2.[PrimaryKey]特徵代表該屬性爲主健;

 3.[Column(DataType="varchar",Length="300")]特徵聲明當前屬性在建立數據庫字段時對應的類型和長度;

 4.[Column(Update=false)]聲明當前屬性在更新時不用更新該屬性;

下面咱們就開始在代碼中使用定義好的Blog類

------------------------------------------------------------------------------

根據實體建立表結構的代碼爲:

FoxOne.Data.Dao.Get().CreateTable<Blog>();

插入Blog數據的代碼爲:

                FoxOne.Data.Dao.Get().Insert(new Blog()
                {
                    Id = Guid.NewGuid().ToString(),
                    BrowseCount = 0,
                    Content = "world",
                    Title = "hello",
                    CreateTime = DateTime.Now,
                    CreatorId = Security.Sec.User.Id,
                    LastUpdateTime = DateTime.Now
                });

根據ID更新Blog數據的代碼爲:

                FoxOne.Data.Dao.Get().Update<Blog>(new Blog()
                {
                    Id = id,
                    LastUpdateTime = DateTime.Now,
                    Title = "hello1"
                });

根據當前用戶ID批量更新Blog的代碼爲:

                FoxOne.Data.Dao.Get().BatchUpdate<Blog>(new { CreatorId = Security.Sec.User.Id }, new 
                {
                    LastUpdateTime = DateTime.Now,
                    Title = "hello1"
                });

 刪除單條Blog數據:

FoxOne.Data.Dao.Get().Delete<Blog>(id);

批量刪除Blog數據的代碼爲:

FoxOne.Data.Dao.Get().BatchDelete<Blog>(new { CreatorId=Security.Sec.User.Id});

獲取單條Blog數據的代碼爲:

var blog = FoxOne.Data.Dao.Get().Get<Blog>(id)

 獲取所有Blog數據的代碼爲:

var blogs = FoxOne.Data.Dao.Get().Select<Blog>();

 獲取當前登錄用戶建立的全部Blog數據的代碼爲:

var blogs = FoxOne.Data.Dao.Get().Select<Blog>(new { CreatorId = Security.Sec.User.Id });

代碼中出現的Security.Sec.User是當前登錄用戶的IUser對象,裏面有Id,Name,Roles,Department等豐富的上下文信息可使用。

固然傳的參數也能是數組,生成的語句也變相應的變成IN

var blogs = FoxOne.Data.Dao.Get().Select<Blog>(new { BrowseCount = new int[] { 10, 20, 30 } });

自定義SQL語句查詢批量Blog數據的代碼爲:

1.首先在配置文件中增長自定義的SQL語句

  <command key="foxone.business.blog.selectByCondition">
    <![CDATA[
        SELECT * FROM BL_Blog WHERE BrowseCount>100 AND CreatorId=#CreatorId#     
    ]]>
  </command>

2.在代碼中使用定義好的語句

var blogs = FoxOne.Data.Dao.Get().QueryEntities<Blog>("foxone.business.blog.selectByCondition", new { CreatorId = Security.Sec.User.Id });

 Dao有自動從環境變量中求解值的功能,因此上面的語句又能夠簡化爲

  <command key="foxone.business.blog.selectByCondition">
    <![CDATA[
        SELECT * FROM BL_Blog WHERE BrowseCount>100 AND CreatorId=#Env:User.Id#     
    ]]>
  </command>

 這樣的代碼中調用此SQL時就不用再傳遞CreatorId

var blogs = FoxOne.Data.Dao.Get().QueryEntities<Blog>("foxone.business.blog.selectByCondition");

 上述SQL中出現的Env環境變量是經過Unity註冊進去的

ObjectHelper.RegisterType<ISqlParameters, EnvParameters>("Env");

 EnvParameters的代碼以下:

    public class EnvParameters : ISqlParameters
    {
        public const string Prefix = "Env:";
        private static readonly int PrefixLength = Prefix.Length;
        public object Resolve(string name)
        {
            object value;
            return TryResolve(name, out value) ? value : null;
        }

        public bool TryResolve(string name, out object value)
        {
            if (name.ToUpper().StartsWith(Prefix.ToUpper()))
            {
                string varName = name.Substring(PrefixLength);
                return Env.TryResolve(varName, out value);
            }
            value = null;
            return false;
        }
    }

若是須要擴展更加豐富的環境變量支持,只須要實現以下接口:

namespace FoxOne.Data
{
    public interface ISqlParameters
    {
        object Resolve(string name);

        bool TryResolve(string name, out object value);
    }
}

 此外DAO支持動態SQL語句:

  <command key="foxone.business.blog.selectByCondition">
    <![CDATA[
        SELECT * FROM BL_Blog WHERE 1=1
        {? AND Title LIKE '%$Title$%'  }
        {? AND CreatorId=#CreatorId#   }
        {? AND BrowseCount>#Count# }
    ]]>
  </command>

 所謂的動態SQL,就是根據你在代碼中傳的參數來動態接拼SQL語句

當代碼中這樣調用時:

var blogs = FoxOne.Data.Dao.Get().QueryEntities<Blog>("foxone.business.blog.selectByCondition");

 則執行的SQL語句爲

SELECT * FROM BL_Blog WHERE 1=1

而當代碼中這樣調用時:

var blogs = FoxOne.Data.Dao.Get().QueryEntities<Blog>("foxone.business.blog.selectByCondition", new { Title="今天"});

 則執行的SQL語句爲:

SELECT * FROM BL_Blog WHERE 1=1 AND Title LIKE '%今天%'

 除此以外還能夠按頁獲取數據

                var blogs = FoxOne.Data.Dao.Get().PageQueryEntities<Blog>(
                    "foxone.business.blog.selectByCondition", 
                    1, 
                    10, 
                    "CreateTime DESC", 
                    new { Title = "今天" });

 全部DAO自動生成的SQL都會自動兼容不一樣的數據庫產品,自定義的SQL則能夠存在不一樣後綴名的config文件中,Blog.Oracle.Config文件中的SQL都是給Oracle環境下使用的,Blog.MySQL.config文件中的SQL都是在MYSQL環境下使用的。

 最後DAO還有查詢其它類型的結果的方法,以下:

        /// <summary>
        /// 查詢多條數據,並以IDataReader返回
        /// </summary>
        /// <param name="sql">select sql語句</param>
        /// <param name="parameters">普通Object或者IDictionary,分別經過屬性名和Key與sql中的參數名匹配</param>
        /// <returns>以IDataReader返回結果集</returns>
        public abstract IDataReader QueryReader(string sql, object parameters = null);

        /// <summary>
        /// 查詢多條數據,並以DataSet返回
        /// </summary>
        /// <param name="sql">select sql語句</param>
        /// <param name="parameters">普通Object或者IDictionary,分別經過屬性名和Key與sql中的參數名匹配</param>
        /// <returns>以DataSet返回結果集</returns>
        public abstract DataSet QueryDataSet(string sql, object parameters = null);

        /// <summary>
        /// 查詢多條數據,並以IDictionary爲元素的IList返回
        /// </summary>
        /// <param name="sql">select sql語句</param>
        /// <param name="parameters">普通Object或者IDictionary,分別經過屬性名和Key與sql中的參數名匹配</param>
        /// <returns>以IDictionary爲元素的IList返回結果集,數據不存在則返回空IList</returns>
        public abstract IList<IDictionary<string, object>> QueryDictionaries(string sql, object parameters = null);
        
        /// <summary>
        /// 查詢單條數據,並以IDictionary返回
        /// </summary>
        /// <param name="sql">查詢單條數據的select sql語句</param>
        /// <param name="parameters">普通Object或者IDictionary,分別經過屬性名和Key與sql中的參數名匹配</param>
        /// <returns>以IDictionary返回單條數據,數據不存在則返回Null</returns>
        public abstract IDictionary<string, object> QueryDictionary(string sql, object parameters = null);

        /// <summary>
        /// 查詢單條數據,並以實體類返回
        /// </summary>
        /// <typeparam name="T">實體類類型</typeparam>
        /// <param name="sql">查詢單條數據的select sql語句(字段名必須與實體類屬性名一致)</param>
        /// <param name="parameters">普通Object或者IDictionary,分別經過屬性名和Key與sql中的參數名匹配</param>
        /// <returns>以實體類返回單條數據,數據不存在則返回Null</returns>
        public abstract T QueryEntity<T>(string sql, object parameters = null) where T : class, new();

        /// <summary>
        /// 查詢單條數據,並以實體類返回
        /// </summary>
        /// <typeparam name="T">實體類類型</typeparam>
        /// <param name="type">實體類接口</param>
        /// <param name="sql">查詢單條數據的select sql語句(字段名必須與實體類屬性名一致)</param>
        /// <param name="parameters">普通Object或者IDictionary,分別經過屬性名和Key與sql中的參數名匹配</param>
        /// <returns>以實體類返回單條數據,數據不存在則返回Null</returns>
        public abstract T QueryEntity<T>(Type type, string sql, object parameters = null);

        /// <summary>
        /// 執行select sql語句,檢查是否有數據返回
        /// </summary>
        /// <param name="sql">select sql語句</param>
        /// <param name="parameters">普通Object或者IDictionary,分別經過屬性名和Key與sql中的參數名匹配</param>
        /// <returns>True有數據 false沒有數據</returns>
        public abstract bool Exists(string sql, object parameters = null);

        /// <summary>
        /// 查詢單條數據的單個字段
        /// </summary>
        /// <typeparam name="T">單個字段的返回類型</typeparam>
        /// <param name="sql">查詢單個字段的sql語句</param>
        /// <param name="parameters">普通Object或者IDictionary,分別經過屬性名和Key與sql中的參數名匹配</param>
        /// <returns>以指定的類型返回制定字段。在查詢出來字段值爲空的狀況時,若是指定以string或其餘類型返回,則返回null,若是以int等數值型類型返回,則返回0</returns>
        public abstract T QueryScalar<T>(string sql, object parameters = null);

        /// <summary>
        /// 查詢多條數據的單個字段
        /// </summary>
        /// <typeparam name="T">單個字段的返回類型</typeparam>
        /// <param name="sql">查詢多條數據單個字段的sql語句</param>
        /// <param name="parameters">普通Object或者IDictionary,分別經過屬性名和Key與sql中的參數名匹配</param>
        /// <returns>以制定元素的IList返回多條數據的單個字段,數據不存在在返回空IList</returns>
        public abstract IList<T> QueryScalarList<T>(string sql, object parameters = null);

 

github:https://github.com/gameking0124/FoxOne

相關文章
相關標籤/搜索