抽取DQL
抽取之前的代码
抽取之后代码
遗留问题
查询的时候,只能查询学生
可以使用泛型解决
处理结果集的时候
每一个都封装成了student对象, 这写死了
原因
知道封装成什么类型的对象
就不应该处理结果集
解决办法
把处理结果集的行为交给每个DAO
为了规范每个DAO的处理结果集,大家都叫同样的名字,这样在模板中就可以调用同一个名称
定义一个处理结果集的接口
代码实现:
1.定义一个接口
声明一个处理结果集方法
2.在具体DAO当中实现接口
实现处理结果集方法
3.创建一个接口实现对象传给查询方法
4.在查询方法当中调用处理结果集方法
总流程图
处理结果集泛型
1.直接定义为T
处理所有结果集都必须得要返回List
有的时候没有必要返回List,想要查询的仅仅是一个结果整数,此时还必须得要从List当中出来
2.有调用者自己来决定返回什么内容
统一规定返回类型为T类型,调用者使用时去决定是什么类型
3.实现类当中实现接口时,要指定返回什么类型
4.声明方法时,声明返回值为一个泛型类型,具体是什么类型,有参数来指定
整体示意图
获取总人数
结果集处理器
存在的问题
该类只能将结果集中的一行数据封装成一个Student对象
我们如果有多个domain,就得提供多个结果集处理器
想法
自动的把一行行数据封装成对象,自动设置属性,结果集处理器
处理不同表时,干的事都一样
1.给我一个要封装的类
2.自动设置属性
规定
1.表中的列名必须和对象中的属性名相同
2.规定表中的类型必须和Java中的类型匹配
想要完成此项工作,就要使用内省机制
编写
1.创建一个类实现结果集处理器
实现的时候也不知道是什么类型,所以也可以指定为一个泛型
2.提供一个字段,表示要封装成对象的类型
3.提供一个构造器,在创建时,就指定是什么类型
4.在实现方法当中,通过内省机制获取所有属性名称,做为列名
5.通过传入的类字节码创建对象
6. 通过内省获取字节码中所有的信息
7.获取所有的属性描述器
8.遍历属性描述器,获取对象的属性名称 ,规定的属性名和列名相同
9.通过列名获取结果集中的值
10.调用属性的set方法把属性的值设置进去