如何设计ORM架构及Bee源码分析

203 篇文章 0 订阅
165 篇文章 3 订阅

如何设计ORM架构及Bee源码分析

教你从0开始设计一个ORM框架,让你从码农进阶为软件设计高手!

1. 什么是ORM,ORM能为我们做什么

ORM是对象关系映射(Object Relational Mapping)的简称,是面向对象和关系数据库之间的一种映射,目的是为了使用面向对象的方式操作关系型的数据库,将面向对象语言程序中的对象自动持久化到关系数据库中。
 在Java平台,操作数据库是通过JDBC接口,JDBC具体的实现,由各数据库厂商负责。下面我们来看下,在没有ORM工具时,是如何用JDBC直接写代码来访问数据库的。

 try {
      Class.forName("com.mysql.jdbc.Driver").newInstance();
      Connection con = DriverManager.getConnection(dbURL, userName, userPwd);
      String sql="select * from users where name=? and pw=?";
      PreparedStatement stmt = con.prepareStatement(sql);
      stmt.setString(1, "Bee'  or '1'='1'");//防止SQL注入攻击
      stmt.setString(2,"aaa");
      ResultSet rs = stmt.executeQuery();
      while(rs.next()){
              //在此处获取结果. 手动封装成Javabean
        System.out.println(rs.getString(2));
        }
      System.out.println("");
      }catch(SQLException e){
        System.out.println("have exception"+e.getMessage());
      }

直接使用JDBC,存在的工作量或问题,主要有:

  • 需要开发人员自己维护Connection数据库连接。

  • 事务需要自己实现。

  • 需要手动写sql语句,工作量大,繁琐;难于调试,经常会出现sql多一个或少一个单引号等引发的sql语法问题;且不同的sql语句需要重新调试。

  • 手动编写代码设置参数,如:stmt.setString(2,"aaa");。

  • 手动将查询结果拼装成Javabean对象返回。spring的JdbcTemplate也存在这个问题。

  • 针对每个实体写一份dao操作文件,n个实体就要写n份。

    因为存在这些问题,所以我们需要一个中间件或叫框架去完成这些类似重复、烦琐的工作。而ORM工具,正是为了满足这种需求而诞生的。

2. Bee架构(ORM框架) 目标

Bee简单易用:单表操作、多表关联操作,可以不用写sql,极少语句就可以完成SQL操作;10分钟即可学会使用。

Bee功能强大:复杂查询也支持向对象方式,分页查询性能更高,一级缓存即可支持个性化优化。高级需求,还可以方便自定义SQL语句。

名词解释:

Suid :对数据库的SQL命令查询、更新、插入与删除(select、update、insert、delete)四种操作的简称(Suid为四种操作首字母)。

编码复杂度: 为了讨论编码效率问题,采用编码复杂度来衡量。编码复杂度用于描述编码量与所解决问题的规模的关系。可以用《数据结构》里的时间复杂度和空间复杂度作类比来感受下编码复杂度。

主要设计目标

1)编码复杂度为C(n)=O(1),即不管数据库里有多少张表,都不需要写额外的Dao代码。

2)Bee设计与编码风格:Bee 是一个具有人工智能(AI)特性,省时/优雅、简易、自动( AiTea: Timesaving/Tasteful, Easy, Automatic)风格的ORM框架。

3)所有的Suid()操作都是用同样的Bee接口,不用再定义任何新的dao接口,更不用实现dao接口。

4)用户/开发者只需要关注Bee接口如何调用即可。

5)动态/任意组合查询条件,不需要提前准备dao接口,有新的查询需求也不用添加和修改接口。

6)约定优于配置:Javabean没有注解,没有xml,只是纯的Javabean即可(为什么要给Javabean那么重的负担呢??!!!)。

7)自动映射表的列与Javabean的字段。

8)支持只查询一部分字段。

9)使用PreparedStatement防止SQL注入攻击。

10)自动过滤null和空字符串(作为默认实现)。可以很方便地只插入非空的部分字段和只更新部分字段。

11)存储过程支持;批处理操作支持;自动事务支持;SQL中排序,分页。

输入图片说明

旧的ORM工具,一般都使用一个xml文件来记录Java对象(O)与关系数据库表(R)的对应关系,后来又流行采用注解的方式,直接在Javabean文件里标注。而Bee希望只用标准的Javabean文件直接与表建立映射,采用约定优于配置的原则,DB命名与Java命名默认转换。

输入图片说明

3. Bee架构(ORM框架) 设计

模块划分,Bee框架至少包括四个模块:面向对象方式Suid接口模块,对象转sql语句模块,底层接口操作DB及自动装配返回结果模块和上下文模块。如图1所示。

输入图片说明

                      图1  Bee框架模块图 

将Javabean实体对象传入Suid操作接口-->Bee ORM框架根据实体对象解析得到sql语句-->调用DB底层接口执行sql语句-->处理结果,若是更新操作返回int数据;若是查询操作,将结果集封装成实体对象相同类型的Javabean再返回。如图2所示。

输入图片说明

                  图2  Bee操作DB流程图

添加缓存功能后的流程,如图3所示:

输入图片说明

                  图3  Bee有缓存功能的查询流程图

4. ORM框架在整个MVC软件系统中的位置

为什么要将ORM从MVC中分出来,分出ORM层有什么好处?

因特网的雏形ARPANET网络,使用分层原理设计,将庞大而复杂的问题,转化为若干较小的局部问题。而且在TCP/IP四层协议中,IP协议是网络层的通用协议,如图4所示,其它层的协议通过网络层时一般都是使用IP协议。软件系统访问数据库也应该使用分层原理进行设计。ORM犹如TCP/IP四层协议中运输层的TCP,应该设计成通用的组件,起复用和分用的作用,如图5所示。

输入图片说明

               图4  沙漏计时器形状的TCP/IP协议族

输入图片说明

               图5  软件开发分层设计图

5. Bee源码分析

Bee的部分模块的主要接口如下表所示:

输入图片说明

我们再来看下主要接口的方法源码:

Suid接口是我们开发使用操作数据库的。

Suid接口:

public interface Suid {
  public <T> List<T> select(T entity);
  public <T> int update(T entity);
  public <T> int insert(T entity);
  public <T> int delete(T entity);
}

ObjToSQL接口是Bee框架将Suid接口传来的对象解析成SQL语句用的。

ObjToSQL接口:

public interface ObjToSQL{
  public  <T> String toSelectSQL(T entity) ;
  public  <T> String toUpdateSQL(T entity) ;
  public  <T> String toInsertSQL(T entity) ;
  public  <T> String toDeleteSQL(T entity) ;
  }

BeeSql是Bee框架访问操作DB的接口。

BeeSql接口:

public interface BeeSql {
  public <T> List<T> select(String sql,T entity );
  public <T> List<T> selectSomeField(String sql,T entity ); 
  public List<String[]> select(String sql);
  public String selectJson(String sql);
  public int modify(String sql);
  public int[] batch(String []sqls,int batchSize);
  ...
  }

作为一般的使用者,我们只需要关注Suid,SuidRich接口的使用即可。如:

List list1 = suid.select(orders1); //select
到此, Bee架构(ORM框架) 设计及源码分析 的内容就全部讲完了。 简单易用,功能强大是我们不断追求的目标。有什么问题,欢迎咨询。

技术QQ群:992650213

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据您的要求,我将为您进行Django个人博客需求分析ORM代码设计。 需求分析: 个人博客系统需要实现以下基本功能: 1. 用户注册:用户可以通过注册页面注册账号,包括用户名、密码、邮箱等信息。 2. 用户登录:已注册的用户可以通过登录页面登录账号。 3. 博客管理:用户可以创建、修改、删除自己的博客。 4. 文章管理:用户可以在自己的博客中创建、修改、删除文章。 5. 文章分类:用户可以将自己的文章分为不同的分类。 6. 文章标签:用户可以为自己的文章添加标签,方便分类和检索。 7. 评论系统:用户可以在自己的文章中添加评论,其他用户可以查看和回复评论。 8. 搜索功能:用户可以通过关键词搜索其他用户的博客和文章。 ORM代码设计: 根据以上需求,我们设计如下的Django ORM代码: ```python from django.db import models from django.contrib.auth.models import User # 用户模型 class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) bio = models.TextField(blank=True) def __str__(self): return self.user.username # 博客模型 class Blog(models.Model): name = models.CharField(max_length=255) owner = models.ForeignKey(UserProfile, on_delete=models.CASCADE) description = models.TextField(blank=True) def __str__(self): return self.name # 文章分类模型 class Category(models.Model): name = models.CharField(max_length=50) blog = models.ForeignKey(Blog, on_delete=models.CASCADE) def __str__(self): return self.name # 文章标签模型 class Tag(models.Model): name = models.CharField(max_length=50) blog = models.ForeignKey(Blog, on_delete=models.CASCADE) def __str__(self): return self.name # 文章模型 class Post(models.Model): title = models.CharField(max_length=255) author = models.ForeignKey(UserProfile, on_delete=models.CASCADE) body = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) blog = models.ForeignKey(Blog, on_delete=models.CASCADE) category = models.ForeignKey(Category, on_delete=models.CASCADE) tags = models.ManyToManyField(Tag) def __str__(self): return self.title # 评论模型 class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE) author = models.ForeignKey(UserProfile, on_delete=models.CASCADE) body = models.TextField() created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.body ``` 在这个代码中,我们定义了6个模型: 1. 用户模型(UserProfile)用于存储用户信息。 2. 博客模型(Blog)用于存储博客信息。 3. 文章分类模型(Category)用于存储文章分类信息。 4. 文章标签模型(Tag)用于存储文章标签信息。 5. 文章模型(Post)用于存储文章信息,包括标题、作者、正文、创建时间、更新时间、所属博客、所属分类和标签等。 6. 评论模型(Comment)用于存储评论信息,包括评论的文章、作者、正文和创建时间等。 以上是一个简单的Django ORM代码设计,可以根据您的需求进行修改和扩展。希望能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值