利用PreparedStatement对sql语句的?赋值后,出现奇怪的结果。请大家帮忙解决,谢谢。

时间:2022-07-27 01:02:07
当sql为 select stuId from stu; 时,结果是1;
当 sql 为 select ? from from stu; 然后利用PreparedStatement把字符串"stuId"传给sql时,结果是 stuId;
还尝试或把"'stuId'"传给sql,结果仍然不对,提示Column 'stuId' not found.;
求解。


补充一下,mysql是5.5.37,jdbc驱动是5.1.26;
之前mysql是5.0.96,jdbc驱动是5.1.26、5.1.7都用过;
全部都出现这个问题。

8 个解决方案

#1


代码如下:
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.BaseDao;

public class SqlTest extends BaseDao {
public void met() {
List<Object> params = new ArrayList<Object>();
String sql="select ? from  stu";


params.add("dsm2_stuId");
rs = executeQuery(sql, params);

try {

while (rs.next()) {
String stuId = rs.getString("stuId");
System.out.println("stuId:"+stuId);

}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public static void main(String[] args) {
SqlTest sqlTest=new SqlTest();
sqlTest.met();
}
}

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import util.ConfigManager;

public class BaseDao {
protected Connection conn;
protected PreparedStatement ps;
protected ResultSet rs;

/**
 * @param 无
 * @return boolean 是否和数据库连接成功。
 * 获得数据库连接
 */
public boolean getConnection() {
ConfigManager configManager=ConfigManager.getInstance();
//String driverClass=configManager.getString("jdbc.driver_class");
String url=configManager.getString("jdbc.connection.url");
String userName=configManager.getString("jdbc.connection.username");
String password=configManager.getString("jdbc.connection.password");

try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(url, userName, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
}

return true;
}


/**
 * @param sql sql语句;
 * @param params 参数列表;
 * @return rs 查询的结果集;
 * 查询的基本操作
 */
public ResultSet executeQuery(String sql,List<Object> params) {
getConnection();
rs=null;

try {
ps=conn.prepareStatement(sql);
for (int i=0; i<params.size(); i++) {
ps.setObject(i+1, params.get(i));
}
rs=ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}

return rs;
}

/**
 * @param 无
 * @return boolean 是否成功关闭所有资源。
 * 释放资源
 */
public boolean closeResource() {
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
if (ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
return true;
}

}

jdbc.driver_class=com.mysql.jdbc.Driver
jdbc.connection.url=jdbc:mysql://localhost:3306/dsm2?useUnicode=true&characterEncoding=utf-8
jdbc.connection.username=root
jdbc.connection.password=

#2


还有一个工具类:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/*
 * 读取配置文件的工具类;
 */
public class ConfigManager {
private static ConfigManager configManager;
private Properties properties;

private ConfigManager() {
String configFile="database.properties";
properties=new Properties();
InputStream is=ConfigManager.class.getClassLoader().getResourceAsStream(configFile);

try {
properties.load(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}

public static ConfigManager getInstance() {
if (configManager==null) {
configManager=new ConfigManager();
}

return configManager;
}

public String getString(String key) {
String value=properties.getProperty(key);

return value;
}
}

#3


用字符串累加的方法吧,参数一般是用在WHERE中的

#4


 String sql="select ? from  stu";
 params.add("dsm2_stuId");

换成
String  params ="stuId";

String sql="select"+ params+"  from  stu";

#5


之前都是用oracle,这是第一次用MySQL。
字符串累加是可以的,因为开发经验少,所以很多知识不是很了解,例如?的使用。
碰到这奇怪问题真是醉了。

#6


没遇过这种问题,如果不想太纠结还是字符串拼接吧~

#7


prepare 中不支持把字段名,表名做为参数传入。直接进行字符串拼接就行了。

#8


谢谢各位的解答。
自己基础知识有盲点,所以会遇到一些觉得很奇怪的问题,要继续加强。

#1


代码如下:
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.BaseDao;

public class SqlTest extends BaseDao {
public void met() {
List<Object> params = new ArrayList<Object>();
String sql="select ? from  stu";


params.add("dsm2_stuId");
rs = executeQuery(sql, params);

try {

while (rs.next()) {
String stuId = rs.getString("stuId");
System.out.println("stuId:"+stuId);

}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public static void main(String[] args) {
SqlTest sqlTest=new SqlTest();
sqlTest.met();
}
}

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import util.ConfigManager;

public class BaseDao {
protected Connection conn;
protected PreparedStatement ps;
protected ResultSet rs;

/**
 * @param 无
 * @return boolean 是否和数据库连接成功。
 * 获得数据库连接
 */
public boolean getConnection() {
ConfigManager configManager=ConfigManager.getInstance();
//String driverClass=configManager.getString("jdbc.driver_class");
String url=configManager.getString("jdbc.connection.url");
String userName=configManager.getString("jdbc.connection.username");
String password=configManager.getString("jdbc.connection.password");

try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection(url, userName, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
}

return true;
}


/**
 * @param sql sql语句;
 * @param params 参数列表;
 * @return rs 查询的结果集;
 * 查询的基本操作
 */
public ResultSet executeQuery(String sql,List<Object> params) {
getConnection();
rs=null;

try {
ps=conn.prepareStatement(sql);
for (int i=0; i<params.size(); i++) {
ps.setObject(i+1, params.get(i));
}
rs=ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}

return rs;
}

/**
 * @param 无
 * @return boolean 是否成功关闭所有资源。
 * 释放资源
 */
public boolean closeResource() {
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
if (ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
return true;
}

}

jdbc.driver_class=com.mysql.jdbc.Driver
jdbc.connection.url=jdbc:mysql://localhost:3306/dsm2?useUnicode=true&characterEncoding=utf-8
jdbc.connection.username=root
jdbc.connection.password=

#2


还有一个工具类:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/*
 * 读取配置文件的工具类;
 */
public class ConfigManager {
private static ConfigManager configManager;
private Properties properties;

private ConfigManager() {
String configFile="database.properties";
properties=new Properties();
InputStream is=ConfigManager.class.getClassLoader().getResourceAsStream(configFile);

try {
properties.load(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}

public static ConfigManager getInstance() {
if (configManager==null) {
configManager=new ConfigManager();
}

return configManager;
}

public String getString(String key) {
String value=properties.getProperty(key);

return value;
}
}

#3


用字符串累加的方法吧,参数一般是用在WHERE中的

#4


 String sql="select ? from  stu";
 params.add("dsm2_stuId");

换成
String  params ="stuId";

String sql="select"+ params+"  from  stu";

#5


之前都是用oracle,这是第一次用MySQL。
字符串累加是可以的,因为开发经验少,所以很多知识不是很了解,例如?的使用。
碰到这奇怪问题真是醉了。

#6


没遇过这种问题,如果不想太纠结还是字符串拼接吧~

#7


prepare 中不支持把字段名,表名做为参数传入。直接进行字符串拼接就行了。

#8


谢谢各位的解答。
自己基础知识有盲点,所以会遇到一些觉得很奇怪的问题,要继续加强。