Java 如何修复此数据库查询?
上面的代码是我现在正在处理的部分。我终于设法从我的Cassandra数据库中读取了数据,但这只是在我指定了某种条件时,例如Java 如何修复此数据库查询?,java,html,jsp,cassandra,cql,Java,Html,Jsp,Cassandra,Cql,上面的代码是我现在正在处理的部分。我终于设法从我的Cassandra数据库中读取了数据,但这只是在我指定了某种条件时,例如“从userprofiles中选择first\u name,其中login='shadowsurge'” 我正在尝试创建一个用户配置文件,显然上面的代码不适合,因为我需要查询来获取与登录用户相关的数据,而不仅仅是获取一个用户的数据,不管登录用户是谁 有人能帮忙吗?基本上,我希望查询获取与当前登录用户关联的名字,但我似乎无法实现这一点。您的查询中的登录名是什么? 您可以尝试将查
“从userprofiles中选择first\u name,其中login='shadowsurge'”
我正在尝试创建一个用户配置文件,显然上面的代码不适合,因为我需要查询来获取与登录用户相关的数据,而不仅仅是获取一个用户的数据,不管登录用户是谁
有人能帮忙吗?基本上,我希望查询获取与当前登录用户关联的
名字,但我似乎无法实现这一点。您的查询中的登录名是什么?
您可以尝试将查询更改为:
ResultSet results=sess.execute(“从userprofiles中选择first_name,其中login='+username+')代码>如果登录名与userprofiles表中的用户名相同。DataStax Cassandra Java驱动程序文档中有一个标题为“您一定要通读”的部分。在本文件中,关于准备好的报表的章节描述了使用这些报表的优点:
使用预先准备好的报表有多种好处。准备好的
语句在Cassandra节点上进行分析和准备,并准备就绪
以备将来执行。绑定参数时,只有这些(和
查询id)通过线路发送。这些性能提升在
重复使用相同的查询(使用不同的参数)
在任何情况下,为了使用Cassandra设置准备好的语句,您都需要稍微修改代码
// gets user details from jsp form
String username = request.getParameter("username");
String password = request.getParameter("password");
//String forename = request.getParameter("forename");
// sets new user
User us = new User();
us.setCluster( cluster );
//checks user is valid
boolean isValid = us.IsValidUser( username, password );
HttpSession session = request.getSession();
System.out.println("Session in servlet " + session);
// sets the user details so it can be displayed during session
session.setAttribute("userID", username);
sess = cluster.connect("instagrim");
ResultSet results = sess.execute ("SELECT first_name FROM userprofiles WHERE login = 'shadowsurge'" );
for (Row row : results)
{
String userName = (row.getString("first_name"));
request.setAttribute("name", userName);
}
因此,您从未尝试过朴素的版本“从userprofiles中选择first_name,其中login='“+username+””
?如果这行得通,那就用“”来代替。哇,这太明显了,我为什么不这么做呢。第一次使用Java、JSP、cassandra等。我想我已经考虑过一半了,但非常感谢!我可以问一下,这种方式和事先准备好的声明有什么区别吗?我假设使用预先准备好的语句有某种好处,或者只是养成一个更好的习惯?想想你的问题,如果我注册为"'; 删除表用户--代码>。一个预先准备好的语句可以避免SQL注入。对,这是一个公平的观点。就像我说的,对这一切都是全新的,不是我这一类的东西。因此,我认为最好不要将其放在JSP文件中,而是放在java类中?@Tom,您提出了一些OP肯定需要听到的好观点。但是CQL!=SQL,所以您提供的链接对与Cassandra合作的人没有多大帮助。很高兴知道这一点!我觉得与CQL相比,网络上有更多关于SQL的信息,或者我只是没有找到正确的地方。但是,是的,非常感谢,我一定会阅读你们提供的链接
sess = cluster.connect("instagrim");
//create a Prepared Statement from your session
PreparedStatement statement = sess.prepare("SELECT first_name FROM userprofiles WHERE login=?");
//create a Bound Statement from your above statement object
BoundStatement boundStatement = new BoundStatement(statement);
//pass your boundStatement to your sess.execute while binding username to it.
ResultSet results = sess.execute(boundStatement.bind(username));