精华内容
下载资源
问答
  • Django的ORM框架是在Python创建类...根据这一原理,可自主开发ORM框架,我们开发一个类似Django的ORM框架 # 模型字段的基本类 class Field(object): def __init__(self, name, column_type): self.name = name ...

    Django的ORM框架是在Python创建类对象的原则上,通过继承并重写元类type的属性和方法来实现。根据这一原理,可自主开发ORM框架,我们开发一个类似Django的ORM框架

    # 模型字段的基本类
    class Field(object):
        def __init__(self, name, column_type):
            self.name = name
            self.column_type = column_type
        def __str__(self):
            return '<%s:%s>' % (self.__class__.__name__, self.name)
    
    # 模型字段的字符类型
    class StringField(Field):
        def __init__(self, name):
            super().__init__(name, 'varchar(100)')
    
    # 模型字段的整数类型
    class IntegerField(Field):
        def __init__(self, name):
            super().__init__(name, 'bigint')
    
    # 定义元类ModelMetaclass
    class ModelMetaclass(type):
        def __new__(cls, name, bases, attrs):
            mappings = dict()
            for k, v in attrs.items():
                if isinstance(v, Field):
                    print('Found mapping: %s==>%s' % (k, v))
                    mappings[k] = v
            for k in mappings.keys():
                attrs.pop(k)
            attrs['__table__'] = name.lower()
            attrs['__mappings__'] = mappings
            return super().__new__(cls, name, bases, attrs)
    
    # 定义Model类
    class Model(metaclass=ModelMetaclass):
        def __init__(self, *args, **kwargs):
            self.kwargs = kwargs
            super().__init__()
    
        def save(self):
            fields, params = [], []
            for k, v in self.__mappings__.items():
                fields.append(v.name)
                params.append(str(self.kwargs[k]))
            sql = 'insert into %s (%s) values (%s)'
            sql = sql % (self.__table__, ','.join(fields), ','.join(params))
            print('SQL: %s' % sql)
    
    
    # 定义模型User
    class User(Model):
        id = IntegerField('id')
        name = StringField('username')
        email = StringField('email')
        password = StringField('password')
    
    u = User(id=123, name='Dj', email='Dj@dd.gg', password='111')
    u.save()
    

    运行结果如图所示。
    在这里插入图片描述
    从图上看到,只要在ORM框架里实现数据库连接,并将SQL语句执行即可数据库操作。

    展开全文
  • 现有ORM框架ORM相关框架存在的问题,主要参考Hibernate和Mybatis。 1) 对于每个实体,需要写一个dao接口文件。编码复杂度C(n)=O(n),即会随实体的增长,编码量呈线性增长。当n较大时,会增加许多人力物力消耗。 2)...

    现有ORM 框架或ORM 相关框架主要有Hibernate,
    Mybatis。这两个框架本来是为了解决直接用JDBC 操
    作数据库带来的烦锁重复工作, 但它们却引起了其他的问题。
    有人报怨Mybatis,很简单的操作,都要写sql语句(虽然国内出了些第三方插件,但要整合到mybatis也不是简单的事.);
    有人报怨当用户要用自定义sql的方式时Hibernate是如何的难用,要想熟悉Hibernate是如何的困难。
    而Mybatis的流行,也印证了贴近原生sql的方式很受欢迎(即使最近几年NOSQL产品很火爆)。
    除此之外, 还有些问题, 是它们二者都具有的, 如编码复杂度为O(n)。

    现有ORM框架或ORM相关框架存在的问题,主要参考Hibernate和Mybatis。
    1)    对于每个实体,需要写一个dao接口文件。编码复杂度C(n)=O(n),即会随实体的增长,编码量呈线性增长。当n较大时,会增加许多人力物力消耗。
    2)    实体Javabean与DB表的map映射文件太多;或者,实体Javabean文件注解用得太泛滥,太多注解难以记忆,增加开发人员负担。Mybatis中实体对应的mapper文件,代码太多,虽然可以自动生成,但阅读性太差。编写和调试sql语句需要大量时间,降低开发效率。
    3)    实体操作默认的条件,一般以id作为条件,但开发时,一般不会提前知道id;若用其它条件作为查询等,需要在接口文件新定义方法。如一个实体有10个字段,2个字段组合一个查询方法,则有 =45个查询方法;若算上3个字段,4个字段的组合,则更多。
    4)    接口文件定义好后,若后期发现定义的方法不能满足需求,需要定义新的方法,又要修改接口文件;若是系统已经上线,还要需要重新开发、测试、发布等。
    5)    当一个表新增一个字段,删除一个字段,或修改一个字段时,Mybatis需要修改mapper映射文件,几乎其中的每个方法都要修改。修改字段,Mybatis在编译期不能自动发现错误。Hibernate通过xml文件或有注解的Javabean文件,同步DB的表结构时,也不能实现删除和更新。更新时,它是忽略原来的字段,然后新增一个字段,除非删除了表,重新再建一次。要是DB的表已保存了数据,不能删除,还是要手动去更改数据库。
    6)    Hibernate想让ORM框架做完DB所有的事情,反而使框架变得太复杂,不易于使用。Hibernate的ORM模型不能查询一部分数据,即使用户没有使用到,也会将所有关联的数据都查询出来。
    7)    Hibernate的概念太复杂,学习成本高,更新会先查询再更新,n+1问题。Mybatis即使进行单表的Suid操作也需要人工写sql或生成sql文件,需要维护的sql太多。
    8)    需要写很多的判断字段是否为空(null) ,是否是空字符串的语句;开发人员需要承担太多类似的重复,乏味的编程工作。
    9)    对于一些复杂的操作,Criteria类查询风格与SQL原来的语法风格相差甚远,相当于要学一门新的SQL操作语言。

     

    软件开发中, 对数据库的访问操作, 约80%的工作
    可以由简单的面向对象操作方式完成, 只有约20%的工
    作才需要复杂的SQL 语句完成。当一个ORM 框架为了
    使这20%的工作量也可以用面向对象的方式实现时, 这
    个ORM 框架的复杂度就会随着完成这20%的比例而急
    剧上升, 但还是避免不了用户用自定义SQL 语句操作
    数据库的情况发生。也就是说, 即使一个ORM 框架可
    以100%的实现面向对象方式操作数据库, 它还是需要
    提供直接用原生SQL 语句操作数据库的接口。毕竟,
    有时用户为了提高性能, 需要这样操作( 有Hibernate,
    但Mybatis还是存在,就说明了自定义SQL是有需求的)。
    另外, 面向切面编程AOP 被视为面向对象编程OOP 的补充,
    也说明面向对象不能做完所有的事情。

     

    Bee与Hibernate,Mybatis的区别,参考以下文章,进行对比:

    Bee框架,一个十分钟即可学会的ORM框架--Bee

    https://blog.csdn.net/abckingaa/article/details/81176524

     

    Mybatis那些坑

    https://blog.csdn.net/abckingaa/article/details/108393731

     

    Mybatis在生产环境,是否应该开启缓存功能

    https://blog.csdn.net/abckingaa/article/details/106460719

    展开全文
  • 本文将为大家介绍一款Android ORM应用开发框架KJFrameForAndroid,很多时候我们也叫它KJLibrary。 KJFrameForAndroid简介 KJFrameForAndroid是一款基于Android的ORM和 IOC应用开发框架,封装了很多Android...

    本文将为大家介绍一款Android ORM应用开发框架KJFrameForAndroid,很多时候我们也叫它KJLibrary。

    KJFrameForAndroid简介

    KJFrameForAndroid是一款基于Android的ORM和 IOC应用开发框架,封装了很多Android开发中常用的功能,包括Android中对Bitmap的操作类库。KJFrameForAndroid的设计非常精简,利用KJFrameForAndroid,我们可以用最少的代码完成很多丰富的Android功能应用,为Android开发者节省许多不必要的开发时间。

    KJFrameForAndroid总共分为五大模块:UILibrary,UtilsLibrary,HttpLibrary,BitmapLibrary,DBLibrary。

    KJFrameForAndroid使用方法

    KJFrameForAndroid的使用方法也是十分简单,首先复制KJLibrary工程中bin目录下的kjlibrary.jar文件至自己项目的libs文件夹中,然后在AndroidManifest.xml文件中添加以下权限规则:

    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    这样就可以在Android项目中使用KJFrameForAndroid的所有功能了。

    下面是利用KJFrameForAndroid实现的一些例子:

    UILibrary

    下面的代码实现了一个Android Tab小工具

    public class TabExample extends KJActivity {
                @BindView(id = R.id.bottombar_content1, click = true)
                public RadioButton mRbtn1;
                @BindView(id = R.id.bottombar_content2, click = true)
                private RadioButton mRbtn2;
    
                @Override
                public void setRootView() {
                    setContentView(R.layout.aty_tab_example);
                }
    
                @Override
                protected void initWidget() {
                    super.initWidget();
                    mRbtn1.setText("widget clicked listener");
                }
    
                @Override
                public void widgetClick(View v) {
                    super.widgetClick(v);
                    switch (v.getId()) {
                    case R.id.bottombar_content1:
                    ViewInject.toast("clicked mRbtn1");
                        break;
                    case R.id.bottombar_content2:
                    ViewInject.toast("clicked mRbtn2");
                        break;
                    }
                }
            }

    BitmapLibrary

    下面的代码实现了对Bitmap图片的处理:

    KJBitmap kjb = KJBitmap.create();
        /**
         * url can be local sdcard path or internet url;
         * view can whichever View set image(for ImageView set src;for View set background).
         */
        // local sdcard image
        kjb.display(imageView, "file:///storage/sdcard0/1.jpg"); 
        // internet url
        kjb.display(textView, http://www.xxx.com/xxx.jpg); 
        //自定义图片显示大小
        kjb.display(view, http://www.xxx.com/xxx.jpg, 80, 80); //width=80,height=80

    HttpLibrary

    下面的代码实现了远程获取JSON的功能:

    // get
            kjh.get("http://www.oschina.net/", new HttpCallBack();//like post, so just one example
    
            // post
            KJHttp kjh = new KJHttp();
            HttpParams params = new HttpParams();
            params.put("id", "1");
            params.put("name", "kymjs");
            kjh.post("http://192.168.1.149/post.php", params, new HttpCallBack() {
                @Override
                public void onPreStart() {
                    super.onPreStart();
                    KJLoger.debug("before start");
                }
                @Override
                public void onSuccess(String t) {
                    super.onSuccess(t);
                    ViewInject.longToast("request success");
                    KJLoger.debug("log:" + t.toString());
                }
                @Override
                public void onFailure(Throwable t, int errorNo, String strMsg) {
                    super.onFailure(t, errorNo, strMsg);
                    KJLoger.debug("exception:" + strMsg);
                }
                @Override
                public void onFinish() {
                    super.onFinish();
                    KJLoger.debug("request finish. Regardless of success or failure.");
                }
            });

    DBLibrary

    下面的代码实现了对数据库的操作:

    // data file
        KJDB db = KJDB.create(this);
        User ugc = new User(); //warn: The ugc must have id field or @ID annotate
        ugc.setEmail("kymjs123@gmail.com");
        ugc.setName("kymjs");
        db.save(ugc);
        //one - many
        public class Parent{  //JavaBean
            private int id;
            @OneToMany(manyColumn = "parentId")
            private OneToManyLazyLoader<Parent ,Child> children;
            /*....*/
        }
    
        public class Child{ //JavaBean
            private int id;
            private String text;
            @ManyToOne(column = "parentId")
            private  Parent  parent;
            /*....*/
        }
    
        List<Parent> all = db.findAll(Parent.class);
                for( Parent  item : all){
                    if(item.getChildren ().getList().size()>0)
                        Toast.makeText(this,item.getText() + item.getChildren().getList().get(0).getText(),Toast.LENGTH_LONG).show();
                }

    当然这些只是一些最简单的例子,如果你熟悉Android开发,也可以去KJFrameForAndroid的官方网站上学习更多关于KJFrameForAndroid的高级用法。
    展开全文
  • CRL是一个面向对象的轻便型ORM业务框架 数据处理使用了对象/数据映射,条件查询采用Lambda表达式来表示,增加了可编程性和可靠性,出错机率低,同时也能用原生的SQL实现查询或操作 数据连接以编程方式进行配置,支持多...
  • ORM框架

    2016-09-13 19:35:00
    我的开发框架ORM框架 今天我想分享一下我自己的ORM框架,虽然谈不是很好,但我个人认为还是蛮好用的,跟大家分享交流一下。 首先说说我对现在主流的ORM框架的一些看法: 优点: 让程序员不再关注数据库细节...
  • ORM框架如何选型——各大ORM框架比较
  • Dappe轻量级ORM框架学习 dapper介绍 Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的,可以实现数据到对象的ORM操作,体积小速度快(性能不错),使用ORM的...
  • Android 数据库ORM开源框架之greenDAO

    千次阅读 2016-05-03 14:52:31
    我相信,在平时的开发...所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。而今天的主角便是 greenDAO,下面,我将详解地介绍如何在 A
  • orm框架

    2018-09-26 22:22:22
    orm框架是能够屏蔽底层数据库细节,提供统一的数据访问接口的数据库操作框架,另外能够支持客户端主从,分库,分表等特性。 Mybaties:最流行的orm框架; jdbctemplate:spring orm提供,对于主从分离,分表需要...
  • Bee框架是一个适合大学生入门的ORM框架,也适合企业级开发ORM框架. 像Java语言一样,大学生在学,企业也在用。Bee是一个可以快速入门的ORM框架,说十分钟即可入六也不算夸张; 同时Bee也具有企业级应用的特性,...
  • 我记得曾经有一篇博客是介绍的litepal的使用,在这篇博客中我提到过:本来以为android本身提供的API已经封装的够好了,根本不需要什么ORM框架了,但是在使用了litepal后,我感觉使用ORM框架还是很有必要的,下面是我...
  • Android ORM数据库框架对比

    千次阅读 2015-08-06 19:24:30
    开发Android应用时,保存数据有这么几个...对于第一种方式,即本地数据存储,如嵌入式SQLLite,你可以选择直接使用SQL语句、Content Provider 或 ORM(对象关系数据映射)。 对于 Android 应用的开发,主要是使用
  • ORM框架工作原理

    千次阅读 2019-08-28 17:32:12
    接上文我们测试了各个ORM框架的性能,大家可以很直观的看到各个ORM框架与原生的ADO.NET在境删改查的性能差异。这里和大家分享下我对ORM框架的理解及一些使用经验。 ORM框架工作原理 所有的ORM框架的工作原理都离不...
  • spring整合ORM框架

    2015-11-18 14:59:01
    也正因为已经有这么多优秀的ORM框架,Spring团队并没有自己开发一套ORM框架,而是对这些框架都进行了支持,让这些框架在Spring环境下可以得到完全的应用。 通常,在Spring环境下使用这些ORM框架时,都会通过一个...
  • Web框架中的ORM框架

    2019-10-17 23:16:05
    Web框架中的ORM框架 在 Python 实现的 Web 框架中,通过 API 接口来访问后端的视图函数,视图函数对数据库中的数据进行处理然后返回给前端。在这个过程中,视图函数不是直接通过 SQL 来操作数据库,而是通过模型类...
  • [XDesigner.ORM开源框架]简介

    千次阅读 2012-05-23 09:23:42
     本教程介绍了作者自行设计和开发的XDesigner.ORM应用程序框架,预计的读者是C#的中级或者高级开发人员。  C#初级和中级开发人员可以从中学习到如何在C#应用程序开发中使用XDesigner.ORM框架来方便快捷的实现...
  • 封装ORM框架

    2018-11-19 17:44:23
    使用JDBC封装ORM框架 只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal...
  • Bee框架,一个ORM框架

    万次阅读 2018-07-24 21:35:30
    分享一个十分钟即可学会的ORM框架--BeeBee是一个具有省时/优雅、简易、自动(Tea:Timesaving/Tasteful, Easy, Automatic) 风格的ORM框架。 编码复杂度为O(1),即用了Bee,你可以不用另外写dao代码。 github上的地址...
  • 首先,我们了解一下ORM是什么? ORM指对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序...其次,我们需要了解.NET领域ORM框架有哪些? 在.NET平台下,关于数据持久层框
  • Orm框架介绍和常见的Android Orm框架

    千次阅读 2017-02-06 10:58:41
    ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。 先介绍一下ORM的概念,以前也一直听说,不过没详细了解啥意思。其全称...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,257
精华内容 40,902
关键字:

属于orm开发框架