[英]Java MySQL check if value exists in database
我试图检查,如果我的数据库中已存在特定值。 我使用JDBC从java独立应用程序访问数据库(查询将记录插入数据库工作,所以我的设置和连接都可以)。
String queryCheck = "SELECT * from messages WHERE msgid = " + msgid;
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(queryCheck); // execute the query, and get a java resultset
// if this ID already exists, we quit
if(rs.absolute(1)) {
conn.close();
return;
}
我收到此错误(我的SQL语法显然有问题):
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'd-f05708071f8f' at line 1
但是,如果我尝试在MySQL命令行中执行此命令,它可以工作! 你能告诉我,我的陈述有什么不对吗? 谢谢你的任何提示!
你需要在MySQL中用引号包装一个String
,所以查询需要
SELECT * from messages WHERE msgid = 'd-f05708071f8f';
不
SELECT * from messages WHERE msgid = d-f05708071f8f;
所以代码应该读
String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";
我建议使用PreparedStatement
来避免这些问题以及SQL注入的任何风险:
final String queryCheck = "SELECT * from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();
使用字符串连接进行查询构建被认为是非常糟糕的做法。 已经很久了。
此外,我建议使用select count(*)
而不是完整select *
因为这会返回更少的数据(想想ResultSet
的大小),MySQL也可以优化它。
final String queryCheck = "SELECT count(*) from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();
if(resultSet.next()) {
final int count = resultSet.getInt(1);
}
您需要使用绑定变量。
PreparedStatement st = conn.prepareStatement(
"SELECT * from messages WHERE msgid = ?");
st.setString(1, msgid);
ResultSet rs = st.executeQuery(queryCheck);
或者进入手动报价,但这是有风险的。
除了防止SQL注入之外,如果重复运行相同的查询,预准备语句也应该提高性能。
由于msgid是一个varchar,你需要用where引号括起where子句中的值。
String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";
但是不建议动态生成SQL字符串,因为它可以将应用程序暴露给sql注入。
而是使用PreparedStatement
:
String queryCheck = "SELECT * from messages WHERE msgid = ?";
PreparedStatement st = conn.prepareStatement(queryCheck);
st.setString(1, msgid);
ResultSet rs = st.executeQuery();
你可以试试这个:
String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";
你错过了msgid的引用。 (我假设msgid是String
而不是Integer
值。)
您需要使用单引号
SELECT * from messages WHERE msgid = 'd-f05708071f8f';
String sql1 ="SELECT Time FROM monday_wednesday WHERE Time ='"+time.getSelectedItem()+"'";
pst=con.prepareStatement(sql1);
rs=pst.executeQuery();
if(rs.next()) {
if(rs.getString("Time").equals(time.getSelectedItem())) {
JOptionPane.showMessageDialog(null,"Time is already taken","",JOptionPane.INFORMATION_MESSAGE);
}
} else {
String sql="INSERT INTO monday_wednesday(pfname,pmname,plname,Birthdate,Gender,Address,City,Contact,Contactperson,Time,Date)\n" + "VALUES ('"+txtFirstName1.getText()+"','"+txtMiddleName1.getText()+"','"+txtLastName1.getText()+"','"+d+"','"+gender.getSelectedItem()+"','"+ txtAddress.getText()+"','"+txtCity.getText()+"','"+txtContact.getText()+"','"+txtContactPerson1.getText()+"','"+time.getSelectedItem()+"','"+dateFormat.format(date)+"')";
}
只是一个简单的重复输入算法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.