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