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

ss_999 2014-10-10 11:45:22
当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都用过;
全部都出现这个问题。
...全文
279 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ss_999 2014-10-11
  • 打赏
  • 举报
回复
谢谢各位的解答。 自己基础知识有盲点,所以会遇到一些觉得很奇怪的问题,要继续加强。
ss_999 2014-10-10
  • 打赏
  • 举报
回复
还有一个工具类:
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;
	}
}
ss_999 2014-10-10
  • 打赏
  • 举报
回复
代码如下:
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=
ACMAIN_CHM 2014-10-10
  • 打赏
  • 举报
回复
prepare 中不支持把字段名,表名做为参数传入。直接进行字符串拼接就行了。
  • 打赏
  • 举报
回复
没遇过这种问题,如果不想太纠结还是字符串拼接吧~
ss_999 2014-10-10
  • 打赏
  • 举报
回复
之前都是用oracle,这是第一次用MySQL。 字符串累加是可以的,因为开发经验少,所以很多知识不是很了解,例如?的使用。 碰到这奇怪问题真是醉了。
HeiBoyYang 2014-10-10
  • 打赏
  • 举报
回复
String sql="select ? from stu"; params.add("dsm2_stuId"); 换成 String params ="stuId"; String sql="select"+ params+" from stu";
wwwwb 2014-10-10
  • 打赏
  • 举报
回复
用字符串累加的方法吧,参数一般是用在WHERE中的

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧