今天在学习jdbc的时候,发现java中定义的sql语句有时候会有些引号上的问题
所以进行研究。
package com.nd.jdbc;
import java.sql.*;
import java.util.Scanner;
public class biji {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hardgo","root","77625");//gets the databese connection object
String sql = "select * from ?";
ps = conn.prepareStatement(sql);
ps.setString(1,"smith");
rs = ps.executeQuery();
while(rs.next()){
System.out.println("eno:" + rs.getString("empno") + " ename:" + rs.getString("ename"));
}
} catch (Exception exception) {
exception.printStackTrace();
}finally {
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
原本是想如果有需要查询某个数据库里面的表的数据,那么可以通过用户输入表名进行查询吗?
但是通过ps.setString(int index,String x) 这个方法来给定一个表名的时候,查询语句就变成了 select * from 'emp'; 由于调用的是setString方法,所以传进去的是一个带引号的字符串,这样的话这条sql语句就出问题了。报错查询不到结果
然后我就想通过Scanner用户输入的方式能不能解决这个问题
做一下修改:(不用setString()方法)
System.out.println("please enter the database names");
Scanner s = new Scanner(System.in);
String shuru = s.nextLine();
String sql = “select * from '"+ shuru +"'”;
然后发现还是一样的错误
sql依旧是等于 select * from 'emp'
那么到底要怎么样才能在sql这个字符串里把不想要的引号去掉呢?
我思来想去,突然灵光一闪
我想到在java里两个String字符串拼接的时候,就可以直接拼接在一起,没有任何的引号,所以我依然在以上修改的基础上,把String sql又作修改:
String sql = "select * from " + shuru;
但从java字符串拼接的角度去看这个语句,比如我输入的表名是 emp,那么这条语句就是 select * from emp
然后运行程序就终于成功!!
结合改进,我的程序最终是这样:(也通过字符串拼接的方式,来测试了尽管这条sql语句是拼接起来的,也可以使用setString方法!)
package com.nd.jdbc;
import java.sql.*;
import java.util.Scanner;
public class jdbctest422 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
System.out.println("please enter the database names");
Scanner s = new Scanner(System.in);
String shuru = s.nextLine();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hardgo","root","77625");//gets the databese connection object
String sql = "select * from " + shuru + " where ename = ? ";//select * from 'emp';
ps = conn.prepareStatement(sql);
ps.setString(1,"smith");
rs = ps.executeQuery();
while(rs.next()){
System.out.println("eno:" + rs.getString("empno") + " ename:" + rs.getString("ename"));
}
} catch (Exception exception) {
exception.printStackTrace();
}finally {
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps != null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
但是需要注意得是:
在进行字符串拼接的时候 比如:
String table = "emp";
String sql = "select * from" + table;
那么这样的话是不行的,因为没有加空格,这条语句就是 select * fromemp,
emp和from之间没有空格,就导致sql语句错误!,所以应该在字符串里适当添加空格,比如:
String sql = "select * from " + table;