ORM框架设计原理与定制

一、ORM框架顶层设计原理
1、java原生的一套jdbc操作数据库接口,有如下几个步骤:
(1)获得数据库驱动
具体的驱动程序由各数据库厂商提供,java负责提供实现接口

Class.forName("com.mysql.jdbc.Driver")

(2)建立连接

Connection conn = DriverManager.getConnection()

(3)创建语句集

PreparedStatement pstm =  con.prepareStatement(sql); 

(4)执行语句集

ResultSet rs = pstm.executeQuery();

(5)获得结果集

while (rs.next()){
	Member instance = new Member();
	instance.setId(rs.getLong("id"));
	instance.setName(rs.getString("name"));
	instance.setAge(rs.getInt("age"));
	instance.setAddr(rs.getString("addr"));
}

(6)关闭结果集、语句集、连接

2、对原生jdbc接口实现步骤,有几个优化点
(1)如何对不同结果集到java对象映射灵活适配。
(2)动态语句拼接。
(3)对各种dao操作的适配。
(4)数据库字段与类字段的统一。当类字段与数据库表列不一致,如何兼容。

3、初步优化:
(1)通过Map集合,存储类字段名称和表列名称的对应关系
(2)遍历类的fields,将有值的字段拼接到sql语句中
(3)通过结果集获取表格元数据信息,利用class生成类实例,根据表元数据信息,获取到类对应字段field,通过反射注入类字段值。

二、ORM框架二次开发(在spring-jdbc包操作数据库基础上,做一层包装,去适配当前的业务)
了解作者设计的这些类的作用,类如何关联,并应用到原有流程上

1、搭建基础架构

Page,定义分页基本参数。每页数据量pageSize,页码pageNo,起始位置start
QueryRule/Rule,查询规则。type查询类型(数据库关键字)
ResultMsg,查询结果。状态status,状态码解释msg,结果result
Order,排序规则。升序降序isAsc,需要排序的字段propertyName
BaseDao,基础dao层操作接口

2、业务功能实现

类概览
ClassMapping
EntityOperation、PropertyMapping
QueryRuleSqlBuilder
BaseDaoSupport

(1)ClassMappings
类字段的公共set和get方法的获取,给PropertyMapping类提供封装set/get方法的方法

(2)EntityOperation
Map<String, PropertyMapping> mappings,存储类字段对应数据库表列名,及其操作字段的set/get方法(封装在PropertyMapper中),便于后续为字段设值和获取字段值

RowMapper rowMapper字段,用于二次开发中,jdbcTemplate类操作时,传入RowMapper参数,泛型T,适配各种类型对象的dao操作。作用:将结果集映射到对应的类

String allColumn,将类所有字段对应数据库表列属性,用“,”拼接起来,便于后续dao操作

(3)BaseDaoSupport(重难点)
二次开发类,对jdbcTemplate的dao操作做包装改造以适配当前业务场景

(4)QueryRuleSqlBuilder
查询规则拼接,适配各种查询rule,服务于BaseDaoSupport类

三、知识点整理
基础知识
1、泛型定义?,T灵活使用
例如:Map<String, ?>与Map<String, Object>区别

2、类反射和field反射灵活使用

spring-jdbc包中重要类
1、返回主键
KeyHolder
GeneratedKeyHolder
PreparedStatementCreator

2、RowMapper把查询结果映射到java对象
传递行映射器给查询API,例:

String query = "SELECT * FROM EMPLOYEE WHERE ID = ?";
List<Employee> employees = jdbcTemplate.queryForObject(
query, new Object[] { id }, new EmployeeRowMapper());

3、jdbcTemplate主要方法
query()
queryForObject()
queryForMap()
queryForList()
execute()
update()
batchUpdate()

4、其他重要类
NamedParameterJdbcTemplate
BeanPropertySqlParameterSource
BeanPropertyRowMapper(RowMapper实现类)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值