尝试模拟实现持久化层(一)

准备:

为模拟的需要,本次采用c3p0数据库连接池以及Spring的JdbcTemplate。

自定义三个注解:@Table、@Column、@ID

目标:

对JDBC进行封装,将POJO与数据库表建立映射关系,尝试模拟实现持久化层(Hibernate)简单的操作如save、list、get等等。

大体思路:

1.首先完成最简单的get,参数是POJO的class和id。

要完成该方法,我们需要创建一个用来调用该方法的类(就叫Record吧)。该类中提供数据源和JdbcTemplate成员以便get等方法中使用。

2.接着我选择去完成扫描工作。

扫描的目的:将带有相应注解的POJO保存起来。我的想法是保存在一个hashMap(就叫recordMap吧)中。键是类名,值是一个类(就叫RecordDefinition吧), 这个类描述了类(POJO)、类(POJO)对应的表名、泛型是一个 描述POJO成员和列名的类(就叫FieldDefinition) 的list、和唯一标识key(也是FieldDefinition类型)。

扫描的过程:使用包扫描工具,每次扫描到一个类,首先判断是否带有@table,有则new一个RecordDefinition,调用其中的setClass(Class<?> klass)方法,这个方法中给RecordDefinition的成员(类、表名、list、key)设置值。设置完成之后将扫描到的类的名称作为键,RecordDefinition对象为值加入recordMap中。

扫描的结果:这下把数据库表和相关联的POJO联系起来了,对我们之后拼接SQL语句有重大作用。

3.再回到我们最终使用的Record类中来,我们需要在get方法中开始拼接SQL语句。于是我们利用刚才扫描得到的hashMap取得的列名,表面,主键来拼接成SQL语句。

4.拼接好了之后,这时候我们的JdbcTemplate开始派上用场了,我们拼接好的SQL语句便可以在JdbcTemplate的方法中使用了。

但是好像还缺少RowMapper。

5.仔细想想这个RowMapper做的事情,实际上它是把查询结果集中的数据设置到POJO的成员再返回该POJO,所以,我们可以让之前的RecordDefinition实现RowMapper接口,因为其中有我们需要的POJO类和POJO成员列表,所所以我们在实现RowMapper接口的的方法中就可以根据POJO类创建实例,然后遍历POJO成员列表给实例的成员赋值,最后返回实例。

猜你喜欢

转载自blog.csdn.net/gary0917/article/details/83548963