一、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实现类)