当 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";
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";
params.add("dsm2_stuId");
换成
String params ="stuId";
String sql="select"+ params+" from stu";
#5
之前都是用oracle,这是第一次用MySQL。
字符串累加是可以的,因为开发经验少,所以很多知识不是很了解,例如?的使用。
碰到这奇怪问题真是醉了。
字符串累加是可以的,因为开发经验少,所以很多知识不是很了解,例如?的使用。
碰到这奇怪问题真是醉了。
#6
没遇过这种问题,如果不想太纠结还是字符串拼接吧~
#7
prepare 中不支持把字段名,表名做为参数传入。直接进行字符串拼接就行了。
#8
谢谢各位的解答。
自己基础知识有盲点,所以会遇到一些觉得很奇怪的问题,要继续加强。
自己基础知识有盲点,所以会遇到一些觉得很奇怪的问题,要继续加强。