重复造轮子(4) — 手写orm框架Ibernate(上)

简介: 重复造轮子(4) — 手写orm框架Ibernate(上)

最近周边有许多朋友都来问我写框架不知道该如何开始下手,没有头绪,哈哈哈其实我一开始也是这样子慢慢熬过来的。所以今晚的这篇文章主要是讲解一些常规的orm框架的底层原理是如何实现的思路,同时也开源一套自己编写的orm框架。


常规的hibernate框架,mybatis框架而言,他们都有着自己的一些特点,就是将jdbc封装地特别方便,供开发者来引用。如果读者们有耐心,可以去看看hibernate的源码或者mybatis的源码,当然,仅仅只是学会看源码还是不够大。倘若能够自己实践一遍,就更加能够深入有所体会了。


常规的hibernate可以自动化生成相应的sql代码,但是对于性能优化方面需要开发人员学习hql语法,特别繁琐。而且Hibernate对于session生命周期管理也太过于复杂,配置也过于繁琐。现今比较流行的mybatis需要开发人员自己手动写sql来进行数据库操作,这种步骤较为灵活,但是对于一些简单的增删改查操作不能自动生成,例如一个插入语句,如果相应的表有1000个字段,那么这段sql语句将会特别冗长,不利于后期的维护。


Ibernate结合了Hibernate和Mybatis两者的好处,简单的sql语句可以自动生成,复杂的sql语句可以自己编写。


本框架开发时长为1星期,由于目前已经大三了,7月份的时候需要找实习工作,所以只好最近抽时间来进行相应的优化。最近几天进行了版本的更新,如果各位感兴趣,可以到我的gitee上边去查看更加详细的内容:


gitee.com/IdeaHome_ad…


关于框架源码部分主要分为以下几点:


数据库连接池,自动创建接口实例,如何通过反射和注解构建数据库和实体类的映射,代理和asm字节码技术,缓存机制……


这些东西可能你在使用常规的spring,springmvc,mybatis,springdata,hibernate里面全部都有遇到过,也都有用到过它们的接口Api内容。但是这一次,我们通过自己手写来实现它。


是的,自己手写来实现这些,只要懂得javase即可。


使用的流程如下所示:



首先我们需要编写相应的properties配置文件:


给某个类标识好注解之后,做好映射工作。



然后便是设计dao的部分了:



最后通过junit进行测试:




关于本orm框架的设计:


1.数据库连接池


这个类主要是在org.lh.ibernate.config包里面,包里设置了以下几个类:



DBConfig类会自动去读取properties文件里面的内容:



是的,这个类的设计主要是用于存储一些静态常量,并没有其他的功能。


关于数据链接是采用了java.sql.Connection 这个类。


但是每个如果只是这样引用的话是不够的,还需要添加一个标识符用于表示这个链接是否是处于繁忙状态中。所以我单独构造了一个链接对象出来:



而相应的连接池对象主要就是用来创建一些列的链接,然后供外界去调用:


这个类实现了IDbPool接口,这样设计的好处,在于灵活,假若后期需要链接Oracle的话,在接口那边修改一下就好了。





最后就是一个连接池工厂了:



工厂的好处就在于,开发者不需要知道内部的具体细节,直接调用即可,非常方便。


2.自定义注解和常规配置类


1.3版本用到的注解还是比较少的,主要为以下几个:



关于注解的反射引用比较简单,这里面就直接跳过。


关于公用配置类在org.lh.ibernate.common里面,点开看看就懂了,这个比较简单。




目录
相关文章
|
4月前
|
XML 缓存 Java
手写Spring源码(简化版)
Spring包下的类、手写@ComponentScan注解、@Component注解、@Autowired注解、@Scope注解、手写BeanDefinition、BeanNameAware、InitializingBean、BeanPostProcessor 、手写AnnotationConfigApplicationContext
手写Spring源码(简化版)
|
Oracle Java 关系型数据库
想要造轮子,你知道反射机制吗?
平时写代码的过程中,我们使用不同的工具框架来提升开发效率,除了基础框架之外,我们自己也想造轮子,封装各种业务平台功能; 一旦需造轮子的时候,那么就需要使用Java造轮子利器:反射; 一些项目中常见的反射应用场景: • 泛化调用: 提前不知道目标RPC的接口和方法,而是开发在后台输入值,根据输入的配置动态请求。 这也是提升效率的一部分,因为不可能所以得RPC接口都要亲自对接的,总要有一部分可以灵活的调用不同接口。
62 0
|
数据库
Basedao工具类:数据库操作利器,让你事半功倍!挥别繁琐,轻松驾驭数据世界!
Basedao工具类:数据库操作利器,让你事半功倍!挥别繁琐,轻松驾驭数据世界!
88 0
|
Java 数据库连接 数据库
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤(下)
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤
124 1
|
Java 数据库连接 数据库
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤(上)
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤
148 1
|
SQL Java 关系型数据库
项目实战21—理由Mybatis动态SQL实现复用
项目实战21—理由Mybatis动态SQL实现复用
160 0
|
Java Spring
再也不用重复造轮子了 一个Spring注解轻松解决
再也不用重复造轮子了 一个Spring注解轻松解决
75 0
|
Java 数据库连接 数据库
返璞归真,学了那么多技术栈,那些 [Mybatis-plus] 之 CRUD操作你还熟悉吗
返璞归真,学了那么多技术栈,那些 [Mybatis-plus] 之 CRUD操作你还熟悉吗
92 0
|
Java 数据库连接 数据库
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤
199 0
高效掌握JDBC技术(三)| 三层架构理念 | 书写符合事务特性的工具类 | JUnit测试框架 | JDBC项目开发步骤
|
SQL 设计模式 存储
Mybatis 使用的 9 种设计模式,真是太有用了(二)
Mybatis 使用的 9 种设计模式,真是太有用了(二)
Mybatis 使用的 9 种设计模式,真是太有用了(二)