日期:2014-05-16  浏览次数:20521 次

Java/jdbc连接数据库预处理只能查询一条数据?

今天在写一个小项目的时候连接数据库读取数据生成栏目,开始写了个这样的方法:但是每次只能读取一行数据,明明有好几条数据,其代码如下:

public static List<Programa> getPrograma(int qx) throws SQLException{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<Programa> list = new ArrayList<Programa>();
		Programa programa = null;
		
		try {
			conn=connectionFactory.getConnection();
			
			String sql = "";
			if (qx == 1) {	//for admin
				sql="select pId,pName,pURL from programaTable where -1<?";	
			}
			else {	//for user :QX == 0
				sql="select pId,pName,pURL from programaTable where QX=?";
			}
			
			pstmt=conn.prepareStatement(sql);
			pstmt.setInt(1, qx);
			
			rs=pstmt.executeQuery();
						
			if(rs.next()){
				System.out.println("000000000");
				programa = new Programa();
				
				programa.setId(rs.getInt(1));
				programa.setName(rs.getString(2));
				programa.setUrl(rs.getString(3));
				
				list.add(programa);
			}
			
			rs.close();
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} 
		return list;
	}

 

我就纳闷了,以前也写过JDBC连数据库的,我开始还以为是MYSQL的问题,后来我写过了一个方法,能把数据全部正确的读出来:代码如下:

public static List<Programa> getPrograma2(int qx) throws SQLException{
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		List<Programa> list = new ArrayList<Programa>();
		Programa programa = null;

		try {
			con = connectionFactory.getConnection();
			String sql = "select pId,pName,pURL from programaTable";

			stmt = con.createStatement();
			rs = stmt.executeQuery(sql);

			while (rs.next()) {
				int col1 = rs.getInt(1);
				String col2 = rs.getString(2);
				String col3 = rs.getString(3);

				programa = new Programa();
				programa.setId(col1);
				programa.setName(col2);
				programa.setUrl(col3);

				list.add(programa);
			}

			// 关闭数据库连接
			rs.close();
			stmt.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}


后来看查一下,连接数据库的配置文件,原来配置文件将自动提交设置为true,

总结:如果设置自动提交为false,用预处理连接数据库,只能查询一条数据(不管rs = stmt.executeQuery(sql);后面是否写上上con.commit();

                                                      但是不用预处理能查到该查到的所有数据(不用写自动提交)

              如果设置自动提交为true用预处理连接数据库,只能查询一条数据(rs = stmt.executeQuery(sql);后面不能写上上con.commit();否则报错

                                                      但是不用预处理能查到该查到的所有数据(不用写自动提交)