Code Bye

大家看看这个sql应该怎么实现

 

我现在要用java连接数据库查询这样一个sql
select * from tablename where id=list.get(0) or id=list.get(1) … or id=list.get(list.length()-1) ;
这ResultSet里面应该怎么写

select * from tablename where id in (list.get(0),list.get(1)…..)

改成这样可以吧

引用 1 楼 weightman2008 的回复:

select * from tablename where id in (list.get(0),list.get(1)…..)

改成这样可以吧

可以,用or也可以,我不是问这个关键字,我是想问括号里这个应该怎么写,不可能像这样写….

string strsql = “select * from tablename where id in (?)”;  
preparedstatement pstmt = conn.preparestatement(strsql);
string param=””;
for(int i:list){
param+=i+”,”;

param=param.substring(0,param.length()-1);
pstmt.setstring(1,param);  
resultset rs = pstmt.executequery();
引用 4 楼 u014038116 的回复:

string strsql = “select * from tablename where id in (?)”;  
preparedstatement pstmt = conn.preparestatement(strsql);
string param=””;
for(int i:list){
param+=i+”,”;

param=param.substring(0,param.length()-1);
pstmt.setstring(1,param);  
resultset rs = pstmt.executequery();

但是我list中的元素是Integer类型的,而且表中的id也是bigint,这种方法也是可以的吗

循环拼sql 语句。
楼主是不会写ResultSet里的数据解析吗。
引用 7 楼 baohuan_love 的回复:

楼主是不会写ResultSet里的数据解析吗。

那是什么东西

引用 6 楼 rui888 的回复:

循环拼sql 语句。

我也想到该用循环,但是不知道该怎么弄,因为数据类型不统一

 你先写的试试看, 
20分
引用 5 楼 snakec0047 的回复:
Quote: 引用 4 楼 u014038116 的回复:

string strsql = “select * from tablename where id in (?)”;  
preparedstatement pstmt = conn.preparestatement(strsql);
string param=””;
for(int i:list){
param+=i+”,”;

param=param.substring(0,param.length()-1);
pstmt.setstring(1,param);  
resultset rs = pstmt.executequery();

但是我list中的元素是Integer类型的,而且表中的id也是bigint,这种方法也是可以的吗

既然你能成功用Integer类型取到bigint类型的id,应该就没溢出,这样应该可以,试试咯

是的吧地方以后
 for循环 拼接 in后面的SQL。


应该输出3个才对,怎么只有一个1

找不出原因啊,为什么没输出完
如果是拼接字符串呢,应该怎么处理?
引用 15 楼 snakec0047 的回复:

找不出原因啊,为什么没输出完

一直用框架写sql,很久没有这么写了,不敢贸然说,
这个问题刚上网替你查了一下,大概原因可能就是preparedstatement 预处理后,填入的参数中如果有字符会被转义。
不过既然你也能检索出一条,所以我猜测可能是数据被当作数组处理了,且对于一个问号只设定数组的第一条数据。你可以试试看验证下,如果1和2的位置对调,是不是就会输出2了。
解决方法我这里有2个,
1,按网上的说法,把?也循环,有多少个数据就有多少?号,例如select * from tablename where id in (?,?,?……)
2,就是不用预处理了,直接把数据拼到sql文里面去。select * from tablename where id in (list.get(0),list.get(1)…..)
你看看哪种比较理想吧。

楼主,你可以debug一下看看你拼接的sql语句是否有问题,我模拟了一下你的代码
class ConnectJDBC{
	public void connectMySql(){
		String url="jdbc:mysql://localhost:3306/test";
		String username="root";
		String password="root";

		try {

			Class.forName("com.mysql.jdbc.Driver");
			Connection con=DriverManager.getConnection(url,username,password);
			PreparedStatement pstmt=con.prepareStatement("select * from userdata where id in(?)");
			String param="1,2,3";
			pstmt.setString(1,param);
			ResultSet rs=pstmt.executeQuery();
			while(rs.next()){
				System.out.println(rs.getInt("id"));
			}

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

得到的拼接结果是:select * from userdata where id in(“”1,2,3″”);
正确的sql应该是:select * from userdata where id in(1,2,3);或者select * from userdata where id in(‘1’,‘2’,‘3’);
原因出在拼接上pstmt.setString会在输入的变量上添加上两个单引号;

20分
楼主 ,你要循环读取list数据拼接sql的话,办法是很多的,我就写了个最容易想到的给你
class ConnectJDBC{
	public void connectMySql(){

		List<Integer> list=new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);

		String str1="select * from userdata where id in(";
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<list.size();i++){
			sb.append(list.get(i)+",");
		}
		String str2=sb.toString();

		str2=str2.substring(0,str2.length()-1);
		String str3=")";
		String sql=str1+str2+str3;

		String url="jdbc:mysql://localhost:3306/test";
		String username="root";
		String password="root";

		try {

			Class.forName("com.mysql.jdbc.Driver");
			Connection con=DriverManager.getConnection(url,username,password);
			Statement stmt=con.createStatement();
			ResultSet rs=stmt.executeQuery(sql);
			while(rs.next()){
				System.out.println(rs.getInt("id"));
			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
先定义一个String 字符串写sql语句。后者差不多可以调用

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明大家看看这个sql应该怎么实现