开发者学堂课程【DAO 开发实战业务分析:OR-Mapping 设计改进(查询全部改进)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/399/detail/5182
OR-Mapping 设计改进(查询全部改进)
内容介绍:
一、简要说明
二、具体内容
一、简要说明
查询全部的操作处理和根据 ID 单个查询的形式是类似的。
· 所有的查询语句通过子类进行传输;
· 有的是需要进行分页控制的;
· 有的是需要进行模糊查询控制的。
所以下面也是进行一些功能类的扩充。
二、具体内容
1、在AbstractDAO 父类之中追加有一个新的功能:
全部功能涉及到一个问题,分页查询于查询全部的区别是多了几个字段。将实现DAO的实现子类找到,找到 FindAll(),在考虑三种情况的基础上,运用可变参数进行操作,如下:
/**
* 这个方法将负责查询全部以及模糊或者是分页查询的整体控制
* @
param
sql
要执行的S
QL
语句
* @param args
表示参数
* @
return
*/
public
<
T> list<T> findAll
S
upport(String sql,Class<T> cls, String column,Object …args)
throws
E
xception
{
if(args.length
= = 0
)
{
/
/
此处不需要设置任何的参数
this.pstmt = this.conn.preparedStatement(sql) ;
}
else
{
/
/
如果有参数则需要设置参数
FindSupport support = new FindSupport() ;
for
(int
x
= 0
;x
<
args.
length ; x++)
{
System.out.println(args[x].getClass().getName()); System.out.println(args[x].getClass().getName());
}
}
return
ResultSetToVOUtil.convert (this,pstmt,cls)
;
}
如果是分页查询,则将含有两个参数,sql 中则会含有两个问号。根据参数的顺序往问号里进行追加。对于 findAll(),如果调用,SELECT 是需要的,这时将代码删掉,直接写入return super.findAllSupport(sql,args);,将 sql 传入,但没有参数,这时就要对参数进行判断,即写入System.out.println(args);,找到 List 进行执行测试。这时 if(args.length = = 0){,则此处不需要设置任何的参数。
如果有参数则需要设置参数,根据参数的内容向上传,这时要换为 convert ,变成List<T>来进行循环,跟上List<T> all = new Array List<T>() ;来负责整体操作,再将 if 改为 while,跟上 all.add(t) ;,就实现了批量转换。
2、在ResultSetToVOUtil类里面追加有一个批量转换处理,如下:
public
static
<T> T
convert
(
PreparedStatement pstmt,Class<T> cls) {
R
esult
S
et
M
eta
D
ata
rsmd
=
pstmt.
getMetaData ;
R
esult
S
et
rs = pstmt.executeQuery() ; //
发出查询命令
T
t
=
cls
.newInstance() ;
while
(rs
.
next())
{
/
/
有数据
for (int x = 1; x < rsmd.getColumnCount() ; x ++) {
F
ield
field
=
cls.
getDeclaredField(rsmd.getColumnLabel
(x).
toLowerCase());
String type = field.fetType().getSimpleName() ;
if(“String”.equals(type)) {
BeanValueUtils.setValue(t,rsmd.getColumnLabel(x).toLowerCase(),rs.getString(rsmd.getColumnLabel(x)));
}
else
if(“int“.
equals(type) ||
“in
teger
“.
equals(type))
{
BeanValueUtils.setValue(t,rsmd.getColumnLabel(x).toLowerCase(),rs.getInt(rsmd.getColumnLabel(x)));
}
else
if(“
double
“.
equals(type) ||
“
Double
“.
equals(type))
{
BeanValueUtils.setValue(t,rsmd.getColumnLabel(x).toLowerCase(),rs.getDouble(rsmd.getColumnLabel(x)));
}
else
if(“
Date
“.
equals(type) ||
“in
teger
“.
equals(type))
{
BeanValueUtils.setValue(t,rsmd.getColumnLabel(x).toLowerCase(),rs.getDate(rsmd.getColumnLabel(x)));
all.add(
t)
}
return null ;
}
}
}
3、在 FindSupport 程序类之中继续追加新的功能,以满足查询要求。
将位找到,跟上 public void setPreparedStatement
(PreparedStatement pstmt,V value),之前的操作 Object 数组,所以这也接收Object 数组,
即
public
void
setPrepared
S
tatement(Prepared
S
tatement
pstmt,
O
bject
…arg
)
{,后面的操作过程由for
(int
x
= 0
;x
<
args.
length ; x++)
{以及
System.out.println(args[x].getClass().getName());
转化为
support.
set
Prepared
S
tatement
(this.pstmt,args)
来进行,先进行循环,即 for(int
x
= 0
;
x
<
args.length ; x++)
{,再取出位型,即String
type
=
args[
x]
.
getClass().getSimpleName()
;,再跟上if
(“
S
tring“.
equals(type))
{
,
则
pstmt
.setString(x + 1,
args
[x]
.
toString
()
);
,其它的则表示为}
else
if
(
”int”.equals(type)
|| ”integer”.equals(type))
{,那么内容设置为pstmt
.setI
nt
(x + 1,I
nteger
.
parseInt
(args
[x]
.
toString
()
)
);
,如果为double则表示为}
else
if
(
”
double
”.equals(type)
|| ”
D
ouble
”.equals(type)){
,内容设置为pstmt
.setD
ouble
(x + 1, D
ouble
.
parse
D
ouble(args
[x]
.
toString
()
)
);
,
如果为Date,则表示为}
else
if
(
”
date
”.equals(type) {
,内容设置为
pstmt
.setD
ate
(x + 1,new java.sql.Date(
date.
getTime())
);。
跟上Date
date
=
(Date) args[
x]
;,
如下:
public
class
F
ind
S
upport
{
public
<
V> void
set
Prepared
S
tatement
(
Prepared
S
tatement
,pstmt,V value)
;
String
type
=
args[
x]
.
getClass().getSimpleName();
if
(“
S
tring“.
equals(type))
{
,
pstmt
.setString(x + 1,
args
[x]
.
toString
()
);
}
else
if
(
”int”.equals(type)
|| ”integer”.equals(type)){
pstmt
.setI
nt
(x + 1,I
nteger
.
parseInt(args
[x]
.
toString
()
)
){
}
else
if(
”
double
”.equals(type)
|| ”
D
ouble
”.equals(type))
{
pst
m
t
.setD
ouble
(x+1,D
ouble
.
parse
D
ouble(args
[x]
.
toString
()
)
);
}
else
if
(
”
date
”.equals(type) {
Date
date
=
(Date) args[
x]
;
pstmt
.setD
ate
(x+1, newjava.sql.Date(
date.
getTime())
);
回到抽象位中,值设置完成后要进行取出,执行后反应空指向,即没进行实例化,将其改为大于零即可,再进行执行,还有rn的问题,如果出异常则表示某个实例不存在,直接忽略就可以,再次执行表示通过。
4、在 AbstractDAO 里面添加有相应的方法支持:
public
<
T> list<T> findAll
S
upport(String sql,Class<T> cls, String column,Object …args)
throws
E
xception
{
this.pstmt = this.conn.preparedStatement(sql) ;
if(args.length
= = 0
)
{
/
/
此处不需要设置任何的参数
FindSupport support = new FindSupport() ;
support.
set
Prepared
S
tatement
(this.pstmt,args)
}
return
ResultSetToVOUtil.convert (this,pstmt,cls)
;
}
在查询里面参数“?“和内容一定是需要匹配的。