撩课-JavaWeb之抽取DQL

抽取DQL

抽取之前的代码

撩课-JavaWeb之抽取DQL

抽取之后代码

撩课-JavaWeb之抽取DQL

遗留问题
查询的时候,只能查询学生
 可以使用泛型解决
处理结果集的时候
 每一个都封装成了student对象, 这写死了
 原因
	 知道封装成什么类型的对象
	 就不应该处理结果集
 解决办法
	 把处理结果集的行为交给每个DAO
	 为了规范每个DAO的处理结果集,大家都叫同样的名字,这样在模板中就可以调用同一个名称
	 定义一个处理结果集的接口
代码实现:

1.定义一个接口

 声明一个处理结果集方法

撩课-JavaWeb之抽取DQL

2.在具体DAO当中实现接口

实现处理结果集方法

撩课-JavaWeb之抽取DQL

3.创建一个接口实现对象传给查询方法
撩课-JavaWeb之抽取DQL

4.在查询方法当中调用处理结果集方法
撩课-JavaWeb之抽取DQL

总流程图

撩课-JavaWeb之抽取DQL

处理结果集泛型

1.直接定义为T

 处理所有结果集都必须得要返回List
 有的时候没有必要返回List,想要查询的仅仅是一个结果整数,此时还必须得要从List当中出来

2.有调用者自己来决定返回什么内容

 统一规定返回类型为T类型,调用者使用时去决定是什么类型

撩课-JavaWeb之抽取DQL

3.实现类当中实现接口时,要指定返回什么类型
撩课-JavaWeb之抽取DQL

4.声明方法时,声明返回值为一个泛型类型,具体是什么类型,有参数来指定
撩课-JavaWeb之抽取DQL

整体示意图

撩课-JavaWeb之抽取DQL

获取总人数

撩课-JavaWeb之抽取DQL

结果集处理器
 存在的问题
	 该类只能将结果集中的一行数据封装成一个Student对象
	 我们如果有多个domain,就得提供多个结果集处理器
 想法
	 自动的把一行行数据封装成对象,自动设置属性,结果集处理器
	 处理不同表时,干的事都一样
		   1.给我一个要封装的类
		   2.自动设置属性
规定
 1.表中的列名必须和对象中的属性名相同
 2.规定表中的类型必须和Java中的类型匹配
想要完成此项工作,就要使用内省机制
编写
 1.创建一个类实现结果集处理器
	 实现的时候也不知道是什么类型,所以也可以指定为一个泛型
 2.提供一个字段,表示要封装成对象的类型
 3.提供一个构造器,在创建时,就指定是什么类型
 4.在实现方法当中,通过内省机制获取所有属性名称,做为列名
 5.通过传入的类字节码创建对象
 6. 通过内省获取字节码中所有的信息
 7.获取所有的属性描述器
 8.遍历属性描述器,获取对象的属性名称 ,规定的属性名和列名相同
 9.通过列名获取结果集中的值
 10.调用属性的set方法把属性的值设置进去