zoukankan      html  css  js  c++  java
  • 轻量级ORMPetaPoco及改进

          PetaPoco描述

          PetaPoco是一个微小的,快速的,单个文件的微型ORM,可以运行在.NET和Mono平台上。相对于NHibernate与Entity Framework,PetaPoco有以下几点非常吸引我:

    1.           1. 轻量级,高性能;
    2.           2. 可同时运行在.net与mono平台上;
    3.           3. 支持多种数据库,且按其提供的规范编写组装SQL,切换数据库时,基本上不需要修改代码;
    4.           4. SqlBuilder高效快捷方便;
    5.      PetaPoco地址:http://www.toptensoftware.com/petapoco/
    6.      如何使用PetaPoco,PetaPoco有非常详细的使用指南,园子里面也有同学翻译了:传送门
    7.      下面,主要分享一下我对它的一些小改造
    8.    

       PetaPocoRepository 仓储基类 

    1.       PetaPocoRepository主要通过一个泛型仓储基类来封装PetaPoco的大多数数据操作。简化业务对象仓储操作类的开发。
    2.       主要有以下操作:

                 Add,Delete,Update,Save,FirstOrDefault(获取一条),Query(获取列表),PagedList(获取分页)等。

    1.       代码片段:      image
    2.      在相对较为复杂的业务系统中,可能存在多个数据库,例如:UserDB,ProductDB,OrderDB等。且存在UserDB数据量较大,需要上Oracle数据库,而其他数据库有可能是SqlServer或MySql;
    3.      即一个业务系统中,存在多个数据库,多种数据库。
    4.      面对这样的业务系统时,我们需要对数据层进行较好地封装,而PetaPoco的Sql Builder无缝兼容多种数据库能很好地解决异构数据库的问题。因此,我们只需要解决多个数据库带来的编码困难。

    SingleRepository 单个数据库模式的仓储基类

         系统中存在多个数据库时,如果我们使用SqlHelper类似的组件来进行编码时,可能不是很优雅,类似于:      image

        其实,我们可以通过封装一个基类,通过某个特性来说明此业务对象仓储操作类对应的是哪个数据库。它有以下需求:

          1. 最好能继承PetaPocoRepository,得到其所有通用性的数据操作方法;

          2. 特性来描述该对象操作的是哪个数据库;

        OK,直接上图:

        SingleDbFactoryimage

          SingleRepository<T>image

       使用

         示例环境:

            1. 存在2个数据库:TestDB(SqlServer),Test(MySql);

            2. TestDB(SqlServer)中存在2个表UserInfo,ProductId,Test(MySql)中存在表UserInfo

            3. 数据库连接字符串      

    <add name="SqlServerDB" connectionString="Server=.\SqlExpress;Database=TestDB;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
            <
    add name="MySqlDB" connectionString="Server=127.0.0.1;Database=Test;Uid=root;Pwd=123456;" providerName="MySql.Data.MySqlClient"/>

           4. 仓储类      imageimage

          5. 类图

    image

         通过SingleDbFactory特性的描述,即可较为优雅地实现数据操作类对应不同数据库。

    MySql / SqlServer 多种数据库的支持

        上面的示例中,TestDB(SqlServer)及Test(MySql)中都存在表UserInfo。当我们从SqlServer切换至MySql时,只需要UserInfoRepository中的SQL语句使用SqlBuilder类来进行规范的组装,完全可以无缝兼容。(只需要修改SingleDbFactory即可,在本文最后会附上示例代码。)

    image

    需要探讨的问题

        1. 当某个业务对象在一个数据库内进行表水平拆分时,组件需要如何应对。这个想了很久,最开始,我也想通过一个SingleSharddingRepository来实现。碰到了一些困难,如:

                        Shardding时的规则多样化,怎样通过代码注入的方式来定义规则;         

                        大量使用反射或AOP时,性能会不会有影响;

        2. 当某个业务对象进行数据库级别的水平拆分时,组件需要如何应对。  

        非常希望园子里的高手给出较好的建议

    DEMO下载地址:https://files.cnblogs.com/bagegejin/PetaPocoDemo.rar

  • 相关阅读:
    基于密度的optics聚类算法
    unicode编码和utf-8编码详解
    聚类分析之k-prototype算法解析
    python学习笔记之正则表达式1
    聚类分析之模糊C均值算法核心思想
    Matlab编程笔记之GUI程序转exe
    Matlab学习笔记之安装教程
    SVPWM原理分析-基于STM32 MC SDK 5.0
    Allego Quick Reports
    SVPWM-实战
  • 原文地址:https://www.cnblogs.com/bagegejin/p/3041777.html
Copyright © 2011-2022 走看看