Java SQL结果在Servlet中显示不相同
全部。Java SQL结果在Servlet中显示不相同,java,sql,oracle,web,servlets,Java,Sql,Oracle,Web,Servlets,全部。 我得到了一个SQL查询,它对query.xml文件中的给定数据进行排序。 当我在SQLD(Oracle)上测试时,它会按预期返回已排序的数据 <entry key="ascUserList"> SELECT CLASS , ID , NAME , USER_NICK , EMAIL , PHONE
我得到了一个SQL查询,它对query.xml文件中的给定数据进行排序。
当我在SQLD(Oracle)上测试时,它会按预期返回已排序的数据
<entry key="ascUserList">
SELECT
CLASS
, ID
, NAME
, USER_NICK
, EMAIL
, PHONE
, AREA_NAME
, USER_GRADE
, USER_POINT
, GRADE_START
, GRADE_END
FROM
COM_INFO
JOIN
USER_INFO ON (ID = USER_ID)
JOIN
AREA USING(USER_AREA)
WHERE
CLASS LIKE '%' || '일반' || '%'
AND USER_SIGNUP LIKE '%' || 'Y' || '%'
ORDER BY ? ASC
</entry>
挑选
阶级
身份证件
名称
,USER_NICK
,电邮
,电话
,地区名称
,用户等级
,用户点
,二年级开始
,二级
从…起
COM_信息
参加
用户信息(ID=用户ID)
参加
区域使用(用户\区域)
哪里
类“%”| |”일반' || '%'
和用户注册,如“%”| |“Y”| |“%”
点菜吗?ASC
然后这个Servlet从上述代码中获取排序后的数据。
我希望在ArrayList中添加已排序的数据,但是,返回的结果是未排序的数据
public ArrayList<UserInfo> ascUserList(Connection conn, String sort) {
ArrayList<UserInfo> list = new ArrayList<>();
PreparedStatement pstmt = null;
ResultSet rset = null;
String sql = prop.getProperty("ascUserList");
System.out.println(sort.equals("이름"));
try {
pstmt = conn.prepareStatement(sql);
switch(sort) {
case "정렬기준": pstmt.setString(1, "ID"); break;
case "아이디": pstmt.setString(1, "ID"); break;
case "이름": pstmt.setString(1, "NAME"); break;
case "닉네임": pstmt.setString(1, "USER_NICK"); break;
case "지역": pstmt.setString(1, "AREA_NAME"); break;
case "등급": pstmt.setString(1, "USER_GRADE"); break;
}
rset = pstmt.executeQuery();
while(rset.next()) {
list.add(new UserInfo(rset.getString(2),
rset.getString(1),
rset.getString(5),
rset.getString(3),
rset.getString(6),
rset.getString(4),
rset.getString(7),
rset.getString(8),
rset.getDate(10),
rset.getDate(11),
Integer.parseInt(rset.getString(9))));
System.out.println(list);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rset);
close(pstmt);
}
return list;
}
public ArrayList ascUserList(连接连接,字符串排序){
ArrayList=新建ArrayList();
PreparedStatement pstmt=null;
ResultSet-rset=null;
字符串sql=prop.getProperty(“ascUserList”);
System.out.println(sort.equals(“이름"));
试一试{
pstmt=conn.prepareStatement(sql);
开关(分拣){
案例”정렬기준“:pstmt.setString(1,“ID”);中断;
案例”아이디“:pstmt.setString(1,“ID”);中断;
案例”이름“:pstmt.setString(1,“名称”);中断;
案例”닉네임“:pstmt.setString(1,“用户缺口”);中断;
案例”지역“:pstmt.设置字符串(1,“区域名称”);中断;
案例”등급:pstmt.setString(1,“用户等级”);中断;
}
rset=pstmt.executeQuery();
while(rset.next()){
添加新的用户信息(rset.getString(2),
rset.getString(1),
rset.getString(5),
rset.getString(3),
rset.getString(6),
rset.getString(4),
rset.getString(7),
rset.getString(8),
注册日期(10),
注册日期(11),
Integer.parseInt(rset.getString(9));
系统输出打印项次(列表);
}
}捕获(SQLE异常){
e、 printStackTrace();
}最后{
关闭(rset);
关闭(pstmt);
}
退货清单;
}
非常感谢您的建议!这是因为
?
指定了一个占位符值,所以您总是按常量排序
Oracle区分常量int(通过?
传递)和列的整数位置,当您执行选择*from…order by 1
时,列的整数位置将被放置。对于后者,1是语法的一部分,其作用类似于标识符。您可以使用下面的代码对此进行检查
如您所见,第一个查询将1视为列位置并按第一列排序,而第二个查询实际按第二列排序
或者更灵活的方式-在应用程序端编写动态SQL查询并将其传递给数据库。但是要注意SQL注入,使用元数据按照应用程序代码排序,而不是从某些用户输入(如输入字段)。或者根据DBMS字典检查输入,例如:
with a as (
select
'A' as COL1_VARCHAR,
'B' as COL2_VARCHAR,
sysdate as COL3_DATE,
sysdate as COL4_DATE,
1 as COL5_NUMBER,
2 as COL6_NUMBER,
3 as COL7_NUMBER
from dual
)
select *
from a
order by
/*varchar*/
decode(?,
1, COL1_VARCHAR,
2, COL2_VARCHAR
) asc,
/*date*/
decode(?,
3, COL3_DATE,
4, COL4_DATE
) asc,
/*number*/
decode(?,
5, COL5_NUMBER,
6, COL6_NUMBER,
7, COL7_NUMBER
) asc
select count(1)
from all_tab_cols
where table_name = 'YOUR_TABLE_NAME_IN_FROM'
and column_name = ? --user input with column name
?
指定一个占位符值,因此您总是按常量排序。如果我不能排除?
占位符怎么办?用户输入是排序的标准,因此我需要将排序标准设置为占位符。静态SQL无法做到这一点,只有动态SQL才能做到。或者可能是一些使静态SQL像动态SQL一样工作的复杂代码。这是一个这是一个很好的例子,说明了SQL@100我已经更新了答案谢谢你的解释!我想我需要更多的实践SQL的概念。再次感谢你!:)
with a as (
select 1 as s1, 10 as s2 from dual union all
select 3, 20 from dual union all
select 2, 30 from dual
)
select *
from a
order by cast('1' as number), 2
S1 | S2
-: | -:
1 | 10
3 | 20
2 | 30
with a as (
select
'A' as COL1_VARCHAR,
'B' as COL2_VARCHAR,
sysdate as COL3_DATE,
sysdate as COL4_DATE,
1 as COL5_NUMBER,
2 as COL6_NUMBER,
3 as COL7_NUMBER
from dual
)
select *
from a
order by
/*varchar*/
decode(?,
1, COL1_VARCHAR,
2, COL2_VARCHAR
) asc,
/*date*/
decode(?,
3, COL3_DATE,
4, COL4_DATE
) asc,
/*number*/
decode(?,
5, COL5_NUMBER,
6, COL6_NUMBER,
7, COL7_NUMBER
) asc
select count(1)
from all_tab_cols
where table_name = 'YOUR_TABLE_NAME_IN_FROM'
and column_name = ? --user input with column name